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

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

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

如何配置sequence的仲裁算法和優(yōu)先級?

sanyue7758 ? 來源:芯片學堂 ? 2023-04-27 15:20 ? 次閱讀

01 Arbitrary

在UVM中,多個sequence可以同時被綁定到相同的sequencer并啟動。這種測試場景在實際中是存在的,比如在模擬同一個總線master口上的不同類型的數(shù)據(jù)流時,可以將符合這些不同類型的數(shù)據(jù)流的sequence綁定到同一個sequencer,并啟動它們,以構(gòu)造出復(fù)雜的測試場景。

243ed7da-e4cb-11ed-ab56-dac502259ad0.png

這樣一來,在驗證環(huán)境運行中就會出現(xiàn)競爭的問題,當多個sequence同時企圖向下游發(fā)transaction的時候,sequencer需要能夠決定處理這些transaction的順序。而給出答案的,是sequencer內(nèi)建的仲裁機制。

下面給出一個簡單的UVM例程:例程同時啟動三個sequence(seq_0, seq_1, seq_2),它們會往同一個sequencer發(fā)transaction,并且在啟動的時候還分配了權(quán)重值(start方法的第三個參數(shù)),每個sequence會循環(huán)發(fā)送4個transaction。

在Env中例化sequencer和driver,并完成連接。例程中在driver拿到transaction之后,會根據(jù)transaction的成員變量id和index打印出來當前transaction產(chǎn)生自哪個sequence,以及是循環(huán)的第幾次。

244de914-e4cb-11ed-ab56-dac502259ad0.png

仿真結(jié)果如下,可以看得出來在沒有配置仲裁算法的情況下,即使我們?yōu)閟equence都分配了權(quán)重值,sequencer對三個sequence還是“雨露均沾”:

2457b390-e4cb-11ed-ab56-dac502259ad0.png

實際上,UVM給我們預(yù)設(shè)了六種仲裁算法供選擇,同時保留了用戶自定義的接口。默認情況下,使用的仲裁算法是UVM_SEQ_ARB_FIFO,嚴格按照先進先出的原則來做選擇,所以才會出現(xiàn)上面說的,仿真結(jié)果跟權(quán)重值沒有關(guān)系。關(guān)于仲裁算法,需要根據(jù)實際測試場景來做出選擇。

24703a50-e4cb-11ed-ab56-dac502259ad0.png

那么如何配置仲裁算法?在代碼中,可以通過調(diào)用sequencer的方法set_arbitration()來對仲裁算法進行配置。比如在上面例程env_demo類的build_phase函數(shù)的最后一行,可以加上sqr.set_arbitration(UVM_SEQ_ARB_WEIGHTED)來配置仲裁算法,仿真結(jié)果我貼在下面,可以看到,我們分配的權(quán)重值開始起作用了:

247a69ee-e4cb-11ed-ab56-dac502259ad0.png

02 LockingMechanism

Locking mechanism指的是sequence對sequencer的占用,sequence可以優(yōu)先獲得sequencer的使用權(quán)限,并且在它自己釋放之前,其他sequence無法通過該sequencer和driver發(fā)送transaction。

Sequence搶占功能同樣來源于測試場景的需求,應(yīng)用于當有某個sequence需要優(yōu)先并獨占sequencer的時候,比如對中斷(interrupt)的處理。如下圖所示,當sequence_2占用了sequencer之后,其他sequence在sequence_2釋放之前將無法聯(lián)系上sequencer。

24938f5a-e4cb-11ed-ab56-dac502259ad0.png

UVM提供了兩種搶占方法:lock和grab。lock方式會等待仲裁機制正常調(diào)度到該sequence(即將請求放在仲裁隊里的最后),并占用該sequencer直到sequence調(diào)用unlock()來解鎖;grab方式則會使該sequence在下一輪仲裁中被執(zhí)行(即將請求放在仲裁隊列的最前面),并占用該sequencer直到sequence調(diào)用unlock()和ungrab()。

Sequencer被某個sequence搶占了之后,我們可以通過調(diào)用它的成員方法來獲取當前的狀態(tài)信息。比如,可以在sequence的body()里面使用m_sequencer.is_grabbed()函數(shù)來看當前sequencer是不是被誰鎖住了;還可以使用m_sequencer.current_grabber()函數(shù)來獲得當前鎖住sequencer的sequence句柄;還有其他函數(shù)可以使用,具體可以參考UVM的手冊。

24a0670c-e4cb-11ed-ab56-dac502259ad0.png

關(guān)于lock和grab的使用在其他地方有很多示例代碼,這里將基于上面的例程,展示UVM 1.2潛藏的一個bug。先在上述代碼中seq_demo_0類的body()任務(wù)的入口和出口處,分別加上lock()和unlock(),如上圖所示,然后進行仿真,就會發(fā)現(xiàn):最終只有seq_0搶先鎖住了sequencer,雖然我們在body()的最后調(diào)用了unlock(),但是seq_1和seq_2在seq_0結(jié)束之后依然搶不到鎖,仿真最后結(jié)束在UVM timeout,如下圖:

24a7a166-e4cb-11ed-ab56-dac502259ad0.png

這是一個UVM的bug,問題的根源在uvm_sequencer_base的源碼中,當有多個sequence在lock_list隊列里面時,調(diào)用m_wait_for_available_sequence()方法獲取sequence句柄會使代碼掛死。該UVM issue已經(jīng)有人提交到了accellera,具體可以參見參考資料2。這個bug在UVM 2017-1.1或者UVM 2020中可能已經(jīng)修掉了,有興趣的讀者可以自己試一下。鑒于目前有很多代碼是基于UVM 1.2構(gòu)建的,用戶在使用lock/grab的時候需要特別注意這個bug。

03Sequence Interrupt

處理器等數(shù)字系統(tǒng)中,通常硬件中斷都是由某個信號脈沖或者電平來觸發(fā),并通過中斷控制仲裁之后,由控制器發(fā)送給處理器進行處理。

在Sequence中的中斷操作也類似,分兩部分實現(xiàn):第一部分是將通過虛擬接口監(jiān)視中斷源信號的變化,以實現(xiàn)軟硬件的隔離;第二部分是在主sequence中發(fā)起一個監(jiān)視進程(monitor process),在等到中斷到來之后啟動用作中斷處理的sequence。

24c2660e-e4cb-11ed-ab56-dac502259ad0.png

另外,Sequence一旦被啟動,通常不會去想著將它異常結(jié)束(通過seq.kill()或者seqr.stop_sequences()調(diào)用),否則我們需要更加復(fù)雜的實現(xiàn)去查看當前driver是否空閑,以確保sequencer跟driver的握手機制不出問題。如果有必要將sequence提前結(jié)束,建議在sequence內(nèi)部去做條件判斷和處理。




審核編輯:劉清

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

    關(guān)注

    68

    文章

    19118

    瀏覽量

    228861
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16133

    瀏覽量

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

    關(guān)注

    0

    文章

    181

    瀏覽量

    19122
  • FIFO存儲
    +關(guān)注

    關(guān)注

    0

    文章

    103

    瀏覽量

    5955

原文標題:SystemVerilog | UVM | Sequence的仲裁和鎖定,還有要避開UVM的bug

文章出處:【微信號:處芯積律,微信公眾號:處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于優(yōu)先級搶占系統(tǒng)的QNX調(diào)度算法

    調(diào)度算法,是基于優(yōu)先級的。QNX的線程優(yōu)先級,是一個0-255的數(shù)字,數(shù)字越大優(yōu)先級越高。所以,優(yōu)先級0是內(nèi)核中的idle線程。同時,
    發(fā)表于 10-31 09:17 ?700次閱讀

    RTOS應(yīng)用中的優(yōu)先級反轉(zhuǎn)問題

    在嵌入式系統(tǒng)中,如果使用基于優(yōu)先級調(diào)度算法的RTOS,系統(tǒng)中可能發(fā)生優(yōu)先級反轉(zhuǎn)現(xiàn)象。優(yōu)先級反轉(zhuǎn)用來描述系統(tǒng)中高優(yōu)先級任務(wù)由于等待低
    發(fā)表于 12-14 11:00 ?1161次閱讀

    中斷優(yōu)先級配置的函數(shù)

    一、中斷優(yōu)先級配置的函數(shù):1.NVIC_IRQChannelPreemptionPriority配置搶占優(yōu)先級2.NVIC_IRQChannelSubPriority
    發(fā)表于 08-04 08:24

    如何在VHDL中實現(xiàn)簡單優(yōu)先級仲裁

    本文著眼于仲裁器的用例和優(yōu)點,以及在VHDL中實現(xiàn)簡單優(yōu)先級仲裁器。仲裁是任何現(xiàn)代計算機系統(tǒng)的重要組成部分。從I2C和CAN 等通信協(xié)議中的總線仲裁
    發(fā)表于 12-23 06:38

    什么是優(yōu)先級位圖算法?

    什么是優(yōu)先級位圖算法
    發(fā)表于 12-27 07:43

    如何配置sequence仲裁算法優(yōu)先級及中斷sequence的執(zhí)行

    出來當前transaction產(chǎn)生自哪個sequence,以及是循環(huán)的第幾次。仿真結(jié)果如下,可以看得出來在沒有配置仲裁算法的情況下,即使我們?yōu)?b class='flag-5'>seq
    發(fā)表于 09-23 14:35

    簡單優(yōu)先級仲裁器:使用VHDL和Logisim在嵌入式系統(tǒng)中分配資源

    本文著眼于仲裁器的用例和優(yōu)點,以及在VHDL中實現(xiàn)簡單優(yōu)先級仲裁器。仲裁是任何現(xiàn)代計算機系統(tǒng)的重要組成部分。從I2C和CAN 等通信協(xié)議中的總線仲裁
    發(fā)表于 02-13 09:45 ?965次閱讀
    簡單<b class='flag-5'>優(yōu)先級</b><b class='flag-5'>仲裁</b>器:使用VHDL和Logisim在嵌入式系統(tǒng)中分配資源

    STM32中斷及FreeRTOS中斷優(yōu)先級配置

    STM32中斷,及FreeRTOS中斷優(yōu)先級配置
    的頭像 發(fā)表于 03-04 11:45 ?8803次閱讀
    STM32中斷及FreeRTOS中斷<b class='flag-5'>優(yōu)先級</b><b class='flag-5'>配置</b>

    Cortex-M中斷及FreeRTOS中斷優(yōu)先級配置原理

    下面就來說說關(guān)于Cortex-M的中斷,及FreeRTOS中斷優(yōu)先級配置原理。
    發(fā)表于 02-08 15:30 ?3次下載
    Cortex-M中斷及FreeRTOS中斷<b class='flag-5'>優(yōu)先級</b><b class='flag-5'>配置</b>原理

    中斷優(yōu)先級處理的原則及配置 搶占優(yōu)先級和響應(yīng)優(yōu)先級的區(qū)別

    首先我們需要知道什么是中斷優(yōu)先級:中斷優(yōu)先級是CPU響應(yīng)中斷的先后順序
    的頭像 發(fā)表于 05-18 15:10 ?2.6w次閱讀
    中斷<b class='flag-5'>優(yōu)先級</b>處理的原則及<b class='flag-5'>配置</b> 搶占<b class='flag-5'>優(yōu)先級</b>和響應(yīng)<b class='flag-5'>優(yōu)先級</b>的區(qū)別

    如何配置sequence仲裁算法優(yōu)先級

    這樣一來,在驗證環(huán)境運行中就會出現(xiàn)競爭的問題,當多個sequence同時企圖向下游發(fā)transaction的時候,sequencer需要能夠決定處理這些transaction的順序。而給出答案的,是sequencer內(nèi)建的仲裁機制。
    的頭像 發(fā)表于 09-14 15:59 ?1449次閱讀

    SysTick的優(yōu)先級配置方法

    SysTick的優(yōu)先級配置,常見的有兩種說法,這兩種說法完全相反,依次說一下各自特點。
    的頭像 發(fā)表于 03-01 10:49 ?4578次閱讀
    SysTick的<b class='flag-5'>優(yōu)先級</b><b class='flag-5'>配置</b>方法

    什么是優(yōu)先級反轉(zhuǎn)

    假設(shè)現(xiàn)在有三個任務(wù)TaskA(優(yōu)先級高)、TaskB(優(yōu)先級中)、TaskC(優(yōu)先級低),一個信號量(Semaphore),此信號量用于任務(wù)之間爭奪某個資源。在某一時刻,高優(yōu)先級的Ta
    的頭像 發(fā)表于 04-24 13:01 ?2202次閱讀
    什么是<b class='flag-5'>優(yōu)先級</b>反轉(zhuǎn)

    為什么使用CubeMx配置NVIC時不見子優(yōu)先級選項

    時,不難發(fā)現(xiàn)一個問題,那就是怎么沒有中斷子優(yōu)先級【或稱響應(yīng)優(yōu)先級、副優(yōu)先級等】的配置?!【當然,很多時候我們或許沒有關(guān)注子優(yōu)先級】如下圖所示
    的頭像 發(fā)表于 09-09 15:32 ?1207次閱讀
    為什么使用CubeMx<b class='flag-5'>配置</b>NVIC時不見子<b class='flag-5'>優(yōu)先級</b>選項

    GD32如何配置中斷優(yōu)先級分組以及中斷優(yōu)先級

    使用GD32 MCU的過程中,大家可能會有以下疑問:中斷優(yōu)先級如何配置和使用?
    的頭像 發(fā)表于 01-10 10:30 ?2899次閱讀
    GD32如何<b class='flag-5'>配置</b>中斷<b class='flag-5'>優(yōu)先級</b>分組以及中斷<b class='flag-5'>優(yōu)先級</b>