RM新时代网站-首页

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

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

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

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

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

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

產(chǎn)生序列項(xiàng)

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

管理其他音序器上的音序

產(chǎn)生亂序交易

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

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

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

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

pIYBAGBwCQGAMTa0AAFKBLL6hwc177.png

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

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

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

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

可能有一個(gè)順序?qū)⑺写鎯?chǔ)位置從A寫入到B。另一個(gè)順序是將所有存儲(chǔ)位置從A讀取到B。或更簡單的方法是:write_read_sequence首先寫入所有存儲(chǔ)位置,然后讀取所有存儲(chǔ)位置。

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

o4YBAGBwCRmAEMiZAAH6FNEW92g608.png

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

o4YBAGBwCT2AYNuvAAIK9TLAGiE205.png

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

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

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

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

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

pIYBAGBwCUyAak18AAIpjDjN6z0164.png

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

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

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

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

pIYBAGBwCViAbHilAADVw1jcZM8258.png

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

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

自檢和流量生成器序列

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

pIYBAGBwCYCAJAwAAAIRorafZ1U522.png

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

pIYBAGBwCZaAJrDaAAGux53jh_c657.png

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

同步序列

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

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

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

pIYBAGBwCbaAMiP3AACfitTZ-7w129.png

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

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

pIYBAGBwCdqAPUM1AAHhCTpSXSA419.png

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

o4YBAGBwCeWAA-ZmAACeuU3U82w534.png

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

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

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

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

pIYBAGBwCkiAPVYVAAEyEhJV_m4537.png

實(shí)用程序庫

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

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

o4YBAGBwCmCAN721AAIT2OzqW34110.png

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

pIYBAGBwCnCAWoSkAAFEdsrgpZk851.png

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

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

o4YBAGBwCoGAM4shAABns5eM-Cw754.png

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

pIYBAGBwCouAUE_EAABDX4x0eZk288.png

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

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

o4YBAGBwCpSAMMmWAABlyXui4dY467.png

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

o4YBAGBwCp6ACZBFAAAxwUvNLZk826.png

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

o4YBAGBwCq2AU84YAAH8KTn5-j4772.png

順序和交易記錄

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

pIYBAGBwCrqAAFfiAAH7UH2WEog269.png

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

pIYBAGBwCsaABRuiAACj5aiPG30670.png

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

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

編輯:hfy

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

    關(guān)注

    1629

    文章

    21729

    瀏覽量

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

    關(guān)注

    0

    文章

    182

    瀏覽量

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

    關(guān)注

    0

    文章

    70

    瀏覽量

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

    關(guān)注

    0

    文章

    34

    瀏覽量

    8686
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    請(qǐng)問一下在UVM中的UVMsequences是什么意思啊

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

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

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

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

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

    vxworks中斷服務(wù)程序

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

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

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

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

    基于偽隨機(jī)序列的DSP程序運(yùn)行參數(shù)加密方法
    發(fā)表于 10-19 11:03 ?9次下載
    基于偽隨機(jī)<b class='flag-5'>序列</b>的DSP<b class='flag-5'>程序</b><b class='flag-5'>運(yùn)行</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è)計(jì)并在Vivado軟件中
    的頭像 發(fā)表于 11-28 06:36 ?3758次閱讀
    如何<b class='flag-5'>創(chuàng)建和</b>使用Xilinx的UltraScale PCI Express解決<b class='flag-5'>方案</b>

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

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

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

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

    單片機(jī)的中斷程序如何運(yùn)行

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

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

    筆者在 《程序是如何在 CPU 中運(yùn)行的(二)》中從 PC 指針寄存器的角度分析了一級(jí)函數(shù)調(diào)用和二級(jí)函數(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測試平臺(tái)由可重復(fù)使用的驗(yàn)證組件組成,除非我們正在對(duì)像MIPI-CSI這樣的簡單協(xié)議進(jìn)行塊級(jí)驗(yàn)證。考慮驗(yàn)證簡單協(xié)議的場景;在這種情況下,我們可以忍受只有一個(gè)音序器將刺激發(fā)送給驅(qū)動(dòng)器。頂級(jí)
    的頭像 發(fā)表于 05-29 09:46 ?801次閱讀

    UVM中的可重用序列

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

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

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