0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UVM序列的創(chuàng)建和運行及中斷服務(wù)程序?qū)崿F(xiàn)方案

電子設(shè)計 ? 來源:EDN ? 作者:Rich Edelman ? 2021-04-09 16:09 ? 次閱讀

SystemVerilog通用驗證方法(UVM)是一種生成測試和檢查結(jié)果以進(jìn)行功能驗證的有效方法,最適合用于塊級ICFPGA或其他“小型”系統(tǒng)。在UVM測試臺中,大多數(shù)活動是通過編寫序列來生成的,這些序列是驗證程序的主力要素,會導(dǎo)致諸如刺激物產(chǎn)生和結(jié)果檢查之類的事情發(fā)生。所以序列是您應(yīng)該集中精力的事情。UVM有許多運動部件??紤]序列時,您可以專注于完成工作的程序。

產(chǎn)生序列項

導(dǎo)致其他順序發(fā)生

管理其他音序器上的音序

產(chǎn)生亂序交易

我們還將向您展示如何編寫自我檢查序列的代碼,并介紹在嘗試更高級的用法之前構(gòu)建和編寫基本序列的基礎(chǔ)。最后,這些技巧將幫助您更輕松地編碼和調(diào)試UVM序列。

創(chuàng)建和運行UVM序列

如前所述,UVM序列是SystemVerilog代碼的集合,該代碼導(dǎo)致事件在測試平臺內(nèi)發(fā)生。它們通常用于創(chuàng)建事務(wù),將其隨機化,將其發(fā)送到定序器,然后再發(fā)送給驅(qū)動程序。在驅(qū)動程序中,生成的事務(wù)通常會引起接口引腳上的某些活動。

例如,如圖1所示,write_read_sequence可以生成隨機寫事務(wù)并將其發(fā)送到定序器和驅(qū)動程序。驅(qū)動程序?qū)⒔忉寣懭胧聞?wù)有效負(fù)載,并導(dǎo)致使用指定的地址和數(shù)據(jù)進(jìn)行寫入。

pIYBAGBwCQGAMTa0AAFKBLL6hwc177.png

圖1這是一個執(zhí)行中的序列。

UVM序列是一個SystemVerilog對象,可以從許多不同的地方構(gòu)造它,但是通常,測試可以構(gòu)造序列然后運行它們-它們體現(xiàn)了測試。

例如,測試可能被偽編碼為:

加載所有內(nèi)存位置
讀取所有內(nèi)存位置,然后
檢查預(yù)期的值是否匹配。

可能有一個順序?qū)⑺写鎯ξ恢脧腁寫入到B。另一個順序是將所有存儲位置從A讀取到B?;蚋唵蔚姆椒ㄊ牵簑rite_read_sequence首先寫入所有存儲位置,然后讀取所有存儲位置。

下面的測試在fork / join_none內(nèi)部創(chuàng)建一個序列。將有四個并行運行的序列。每個序列都設(shè)置了一個LIMIT變量,并在fork / join_none的末尾開始運行。一旦完成所有分支,測試就完成了。

o4YBAGBwCRmAEMiZAAH6FNEW92g608.png

在下面的代碼my_sequence中,它是一個簡單的序列,可創(chuàng)建事務(wù)并將其發(fā)送到定序器和驅(qū)動程序。body()任務(wù)已實現(xiàn)。這是一個簡單的for循環(huán),它會循環(huán)LIMIT次。LIMIT是可以從外部設(shè)置的序列中的變量。

o4YBAGBwCT2AYNuvAAIK9TLAGiE205.png

在for循環(huán)中,通過調(diào)用new()或使用工廠來構(gòu)造事務(wù)對象。然后,調(diào)用start_item以開始與音序器的交互。此時,定序器將停止執(zhí)行序列,直到驅(qū)動程序準(zhǔn)備就緒為止。一旦驅(qū)動程序準(zhǔn)備就緒,定序器將使start_item返回。一旦start_item返回,則該序列已被授予使用驅(qū)動程序的權(quán)限。Start_item實際上應(yīng)該稱為request_to_send。現(xiàn)在,該序列具有使用驅(qū)動程序的權(quán)限,它可以使事務(wù)隨機化,或根據(jù)需要設(shè)置數(shù)據(jù)值。這就是所謂的后期隨機化,這是理想的功能。事務(wù)應(yīng)盡可能接近執(zhí)行隨機化,這樣它們可以捕獲任何約束中的最新狀態(tài)信息。

在將事務(wù)隨機化并設(shè)置了數(shù)據(jù)值之后,將其發(fā)送到驅(qū)動程序以使用finish_item進(jìn)行處理。Finish_item實際上應(yīng)該稱為execute_item。此時,驅(qū)動程序?qū)@取事務(wù)句柄并執(zhí)行它。一旦驅(qū)動程序調(diào)用item_done(),然后finish_item將返回并且交易已執(zhí)行。

執(zhí)行驅(qū)動程序

驅(qū)動程序代碼相對簡單。它從uvm_driver派生并包含run_phase。run_phase是由UVM核心自動啟動的線程。run_phase被實現(xiàn)為永遠(yuǎn)的開始-結(jié)束循環(huán)。在開始到結(jié)束塊中,驅(qū)動程序調(diào)用seq_item_port.get_next_item(t)。這是一個將導(dǎo)致在音序器中執(zhí)行的任務(wù)-本質(zhì)上是向音序器詢問應(yīng)執(zhí)行的下一個事務(wù)??赡苁菦]有可用的事務(wù),在這種情況下,此調(diào)用將被阻塞,即不會返回,因為它正在“等待某事”。(注意:可以使用其他非阻塞調(diào)用,但它們不在本文討論范圍之內(nèi),而不是建議的用法)。當(dāng)定序器有要執(zhí)行的事務(wù)時,那么get_next_item調(diào)用將取消阻塞并返回任務(wù)參數(shù)列表中的事務(wù)句柄(在下面的示例中為變量“ t”)?,F(xiàn)在,驅(qū)動程序可以執(zhí)行交易了。

對于此示例,執(zhí)行很簡單–它使用事務(wù)convert2string()調(diào)用打印一條消息,并等待由事務(wù)持續(xù)時間類成員變量控制的時間。
一旦執(zhí)行完成,將調(diào)用seq_item_port.item_done()來發(fā)信號通知定序器,并依次返回序列,表明事務(wù)已被執(zhí)行。

pIYBAGBwCUyAak18AAIpjDjN6z0164.png

虛擬序列及相關(guān)序列

序列可以具有其他序列的句柄;畢竟,序列只是一個具有數(shù)據(jù)成員的類對象,以及一個將作為線程運行的任務(wù)body()。

虛擬序列是一種序列,它可能不會生成序列項,而是在其他音序器上啟動序列。這是從一個控制點創(chuàng)建并行操作的便捷方法。虛擬序列僅具有其他序列和定序器的句柄。它啟動它們或以其他方式管理它們。虛擬序列可能已經(jīng)通過從上方分配,使用配置數(shù)據(jù)庫查找或其他方式獲取了序列發(fā)生器句柄。它可能已經(jīng)構(gòu)造了序列對象,或者已經(jīng)通過類似的其他方式獲取了它們。

虛擬序列就像一個木偶大師,控制著其他序列。虛擬序列可能如下所示:

pIYBAGBwCViAbHilAADVw1jcZM8258.png

在下面的代碼段中,有兩個序列,即ping和pong。他們每個人都有彼此相處的地方。它們旨在輪流使用。第一個發(fā)送五個事務(wù),然后另一個發(fā)送,依此類推。有關(guān)完整代碼,請參見附錄。

首先構(gòu)造手柄,并設(shè)置運行極限。

自檢和流量生成器序列

自檢序列是導(dǎo)致一些活動,然后檢查結(jié)果是否正常的序列。最簡單的自檢序列在一個地址處發(fā)出寫操作,然后從同一地址進(jìn)行讀操作?,F(xiàn)在將讀取的數(shù)據(jù)與寫入的數(shù)據(jù)進(jìn)行比較。在某些方面,序列成為黃金模型。

pIYBAGBwCYCAJAwAAAIRorafZ1U522.png

可以編寫視頻流量生成器以生成背景流量流,該流模擬或建模視頻顯示可能需要的數(shù)據(jù)量。視頻有最低帶寬要求。該計算將隨接口或總線上的負(fù)載而變化,但是對于此示例而言,簡單的計算就足夠了。視頻流量將每秒生成60次數(shù)據(jù)屏幕。每個屏幕將具有1920×1024點。每個點由一個32位字表示。使用這些數(shù)字,流量生成器必須每秒創(chuàng)建471MB。

pIYBAGBwCZaAJrDaAAGux53jh_c657.png

更加完善的流量生成器將根據(jù)當(dāng)前條件調(diào)整到達(dá)率-隨著其他流量的上升或下降,應(yīng)調(diào)整視頻流量的生成率。

同步序列

序列將用于同步其他序列(所謂的虛擬序列)。通常,兩個序列之間必須有正式的關(guān)系。例如,他們不能一起進(jìn)入其關(guān)鍵區(qū)域-他們必須成為單一文件。否則,它們只能在一些常見的關(guān)鍵區(qū)域通過后才能運行。

下面的代碼聲明了兩個要同步的序列(synchro_A_h和sync_B_h)。它還聲明了一個同步器。這些類沒有什么特別的-它們只是同意使用某種技術(shù)進(jìn)行同步。

同步器控制非常簡單。它只是說GO 20滴答聲和STOP 100滴答聲。

pIYBAGBwCbaAMiP3AACfitTZ-7w129.png

同步的序列開始。他們運行完成,然后只需重新啟動即可。他們永遠(yuǎn)運行。

使用同步器的類只有在被告知執(zhí)行后才能執(zhí)行。

pIYBAGBwCdqAPUM1AAHhCTpSXSA419.png

仿真中,序列等待直到同步器處于GO狀態(tài)。進(jìn)入GO狀態(tài)后,同步代碼將使用new生成事務(wù),然后調(diào)用start_item / finish_item來執(zhí)行該事務(wù)。在等待訪問驅(qū)動程序并執(zhí)行之后,同步序列返回到循環(huán)頂部并檢查同步器狀態(tài)。它將再次運行或停止/等待(圖2)。

o4YBAGBwCeWAA-ZmAACeuU3U82w534.png

圖2仿真中的同步器等待GO狀態(tài)。

實現(xiàn)中斷服務(wù)程序

序列將用于提供中斷服務(wù)程序。中斷服務(wù)程序會一直休眠直到需要時為止。這是一種獨特的序列。在此示例實現(xiàn)中,它創(chuàng)建一個中斷服務(wù)事務(wù)并執(zhí)行start_item和finish_item。這樣,它可以將該ISR事務(wù)句柄發(fā)送給驅(qū)動程序。然后,驅(qū)動程序?qū)⑽兆≡摼浔钡桨l(fā)生中斷。

驅(qū)動程序?qū)⑵渥鳛樘幚鞸ystemVerilog接口的整體工作的一部分來處理中斷。在這種情況下,處理中斷意味著將一些數(shù)據(jù)放入保留的句柄中,然后將該句柄標(biāo)記為完成。同時,中斷服務(wù)序列一直在等待事務(wù)被標(biāo)記為完成。用某種說法,這被稱為真正完成的項目。在UVM中,還有其他機制可以處理此類問題,但它們比這種解決方案更不可靠且更復(fù)雜。

pIYBAGBwCkiAPVYVAAEyEhJV_m4537.png

實用程序庫

序列實用程序庫將被創(chuàng)建和使用。實用程序庫是一些簡單的代碼,可用于序列編寫器,輔助函數(shù)或驗證過程的其他抽象。

下面的open_door序列正如其名稱所暗示的那樣工作。它為音序器和驅(qū)動器打開了大門?,F(xiàn)在可以使用序列對象句柄(例如seq.read()和seq.write())隨意進(jìn)行外部調(diào)用。

o4YBAGBwCmCAN721AAIT2OzqW34110.png

打開open_door,然后使用常規(guī)方法啟動。然后,測試程序可以像下面的紅線一樣簡單地發(fā)出讀寫操作。

pIYBAGBwCnCAWoSkAAFEdsrgpZk851.png

從序列中調(diào)用C代碼

從序列調(diào)用C代碼(使用DPI-C)很容易,但是有一些限制。DPI導(dǎo)入和導(dǎo)出語句不能放置在類內(nèi)部,因此在文件,全局或包范圍內(nèi),它們必須在類之外。因此,它們沒有設(shè)計或類對象范圍。

o4YBAGBwCoGAM4shAABns5eM-Cw754.png

DPI-C導(dǎo)出功能或任務(wù)只是使用export命令導(dǎo)出的SystemVerilog功能或任務(wù)。

pIYBAGBwCouAUE_EAABDX4x0eZk288.png

DPI-C導(dǎo)入函數(shù)或任務(wù)是具有返回值的C函數(shù)。對于任務(wù),返回值為“ int”(有關(guān)詳細(xì)信息,請參見SystemVerilog LRM)。對于函數(shù),返回值應(yīng)為返回值。

下面定義了簡單的void函數(shù)c_code_add()。它有兩個輸入,并在指針* z中返回一個值。此C函數(shù)調(diào)用導(dǎo)出的SystemVerilog函數(shù)sv_code()。

o4YBAGBwCpSAMMmWAABlyXui4dY467.png

dpiheader.h是檢查DPI-C API的便捷方法。在此示例中,dpiheader.h(下圖)非常簡單。

o4YBAGBwCp6ACZBFAAAxwUvNLZk826.png

這個序列沒有什么特別的特殊之處。它生成事務(wù),但確實調(diào)用了C函數(shù)(下面的c_code_add紅線)。就編寫調(diào)用C代碼的序列而言,實際上沒有什么特別的事情要做。DPI-C代碼必須正確編寫,并且必須在適當(dāng)?shù)姆秶鷥?nèi)聲明。

o4YBAGBwCq2AU84YAAH8KTn5-j4772.png

順序和交易記錄

在本文討論的示例代碼中,每個序列并行運行-在單個定序器上同時運行。在下面的兩個屏幕截圖(圖3和圖4)中可以很容易地看到,每個序列是如何輪流發(fā)送并在驅(qū)動程序上執(zhí)行事務(wù)的。

pIYBAGBwCrqAAFfiAAH7UH2WEog269.png

圖3此展開視圖顯示了每個序列如何輪流發(fā)送和執(zhí)行事務(wù)。

pIYBAGBwCsaABRuiAACj5aiPG30670.png

圖4這是事務(wù)的放大視圖。

Rich Edelman是西門子Mentor的高級驗證方法學(xué)家。

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1624

    文章

    21538

    瀏覽量

    600472
  • UVM
    UVM
    +關(guān)注

    關(guān)注

    0

    文章

    181

    瀏覽量

    19111
  • 序列
    +關(guān)注

    關(guān)注

    0

    文章

    70

    瀏覽量

    19529
  • 中斷程序
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    8657
收藏 人收藏

    評論

    相關(guān)推薦

    《Visual C# 2008程序設(shè)計經(jīng)典案例設(shè)計與實現(xiàn)》---動態(tài)創(chuàng)建和刪除文件夾及顯示其是否存在

    《Visual C# 2008程序設(shè)計經(jīng)典案例設(shè)計與實現(xiàn)》---動態(tài)創(chuàng)建和刪除文件夾及顯示其是否存在.zip
    發(fā)表于 07-08 13:31

    請問一下在UVM中的UVMsequences是什么意思啊

    uvm_object基類擴展得到。UVM sequences不是在仿真的開始,而是在仿真的過程中生成并分配內(nèi)存的,也沒有類似uvm_component的層次結(jié)構(gòu)。隨著仿真的進(jìn)行,將創(chuàng)建
    發(fā)表于 04-11 16:43

    DevEco Studio3.0Beta-OpenHarmony創(chuàng)建和運行HelloWorld

    開發(fā)環(huán)境配置好后,可以通過運行HelloWorld工程來驗證環(huán)境設(shè)置是否正確。創(chuàng)建一個新工程1.在DevEco Studio的歡迎頁,選擇Create Project開始創(chuàng)建一個新工程。2.根據(jù)工程
    發(fā)表于 04-14 14:26

    創(chuàng)建和編輯VI程序、及建立和調(diào)用子VI

    創(chuàng)建和編輯VI程序、及建立和調(diào)用子VI 一、實驗室名稱:虛擬儀器實驗室             &nb
    發(fā)表于 06-22 09:01 ?6146次閱讀

    vxworks中斷服務(wù)程序

    中斷服務(wù)程序用來處理來自硬件的中斷,是設(shè)備驅(qū)動程序的重要組成部分。為及時響應(yīng)外部中斷,防止
    發(fā)表于 06-27 11:09 ?1388次閱讀

    WindowsCE異常和中斷服務(wù)程序

    WindowsCE異常和中斷服務(wù)程序,中斷和異常都是異步發(fā)生的事件,當(dāng)該事件發(fā)生,系統(tǒng)將停止目前正在執(zhí)行的代碼轉(zhuǎn)而執(zhí)行事件響應(yīng)的服務(wù)
    發(fā)表于 01-04 15:37 ?1663次閱讀

    基于偽隨機序列的DSP程序運行參數(shù)加密方法

    基于偽隨機序列的DSP程序運行參數(shù)加密方法
    發(fā)表于 10-19 11:03 ?9次下載
    基于偽隨機<b class='flag-5'>序列</b>的DSP<b class='flag-5'>程序</b><b class='flag-5'>運行</b>參數(shù)加密方法

    如何創(chuàng)建和使用Xilinx的UltraScale PCI Express解決方案

    了解如何創(chuàng)建和使用Xilinx的UltraScale PCI Express解決方案。 使用Vivado IP目錄GUI創(chuàng)建和使用PCI Express IP內(nèi)核。 打開示例設(shè)計并在Vivado軟件中
    的頭像 發(fā)表于 11-28 06:36 ?3700次閱讀
    如何<b class='flag-5'>創(chuàng)建和</b>使用Xilinx的UltraScale PCI Express解決<b class='flag-5'>方案</b>

    中斷時間間隔的中斷服務(wù)程序實現(xiàn)免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是中斷時間間隔的中斷服務(wù)程序實現(xiàn)免費下載。
    發(fā)表于 08-06 17:34 ?1次下載
    <b class='flag-5'>中斷</b>時間間隔的<b class='flag-5'>中斷</b><b class='flag-5'>服務(wù)</b><b class='flag-5'>程序</b><b class='flag-5'>實現(xiàn)</b>免費下載

    Arduino板是什么如何使用IDE軟件創(chuàng)建和上傳Arduino程序到Arduino板

    本章我們將研究Arduino板和IDE軟件,我們要用IDE軟件創(chuàng)建和上傳Arduino程序到Arduino板(Arduino用草圖表示程序,我們還是繼續(xù)用程序這個傳統(tǒng)術(shù)語)。我們會學(xué)到
    發(fā)表于 05-14 18:11 ?4次下載
    Arduino板是什么如何使用IDE軟件<b class='flag-5'>創(chuàng)建和</b>上傳Arduino<b class='flag-5'>程序</b>到Arduino板

    單片機的中斷程序如何運行

    單片機的中斷就是類似的一個過程,發(fā)生中斷時,就會打斷正在執(zhí)行的主程序,先處理完中斷任務(wù),返回主程序繼續(xù)
    的頭像 發(fā)表于 01-27 17:11 ?1.1w次閱讀
    單片機的<b class='flag-5'>中斷</b><b class='flag-5'>程序</b>如何<b class='flag-5'>運行</b>

    中斷服務(wù)程序是如何被執(zhí)行的 ?

    筆者在 《程序是如何在 CPU 中運行的(二)》中從 PC 指針寄存器的角度分析了一級函數(shù)調(diào)用和二級函數(shù)調(diào)用執(zhí)行的過程,那么中斷服務(wù)程序.
    發(fā)表于 02-07 11:02 ?2次下載
    <b class='flag-5'>中斷</b><b class='flag-5'>服務(wù)</b>子<b class='flag-5'>程序</b>是如何被執(zhí)行的 ?

    UVM中的虛擬序列:為什么,如何?

    大多數(shù)UVM測試平臺由可重復(fù)使用的驗證組件組成,除非我們正在對像MIPI-CSI這樣的簡單協(xié)議進(jìn)行塊級驗證??紤]驗證簡單協(xié)議的場景;在這種情況下,我們可以忍受只有一個音序器將刺激發(fā)送給驅(qū)動器。頂級
    的頭像 發(fā)表于 05-29 09:46 ?736次閱讀

    UVM中的可重用序列

    眾所周知,序列由幾個數(shù)據(jù)項組成,它們共同構(gòu)成了一個有趣的場景。序列可以是分層的,從而創(chuàng)建更復(fù)雜的方案。在最簡單的形式中,序列應(yīng)該是
    的頭像 發(fā)表于 05-29 09:50 ?618次閱讀

    創(chuàng)建UVM Testcase的步驟

    UVM中,Testcase是一個類,它封裝了測試用例開發(fā)者編寫的特定激勵序列。
    的頭像 發(fā)表于 06-15 09:41 ?1437次閱讀
    <b class='flag-5'>創(chuàng)建</b><b class='flag-5'>UVM</b> Testcase的步驟