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

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

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

UVM response_handler和get_response機制

冬至子 ? 來源:CSDN ? 作者:谷公子 ? 2023-05-23 16:56 ? 次閱讀

很多UVM用戶平時更多的使用get_response()方式去獲得uvm_driver的response,但get_response有些缺點:由于 get_response() 是一種阻塞方法,它會阻塞直到收到來自 UVM 驅(qū)動程序 (put_response()) 的響應(yīng)。

因此,如果我們使用 get_response() 方法實現(xiàn)并按此順序?qū)?start_item()、finish_item() 和 finally get_response() 放置在序列的 body() 方法中,這將導(dǎo)致非流水線序列實現(xiàn),因為下一個序列項可以只有在 get_response() 方法收到前一個請求序列項的響應(yīng)項后,才提供給 UVM 驅(qū)動程序。

為了實現(xiàn)背靠背的傳輸,我們可以使用response_handler()機制,它可以將sequence中發(fā)送request和處理response兩個操作分開處理,盡量減少耦合。例子如下流程圖。

image.png

1. 如何使用response_handler

如果想要實現(xiàn)response_handler機制的話,第一步需要在要使用這個機制的sequence里使能它,即調(diào)用use_response_handler(1)函數(shù)把m_use_response_handler變量設(shè)置為1就行,m_use_response_handler是uvm_sequence_base類里的一個成員變量,默認值為0,也就是不打開。第二步需要override uvm_sequence_base類里的response_handler函數(shù),實現(xiàn)自己對response任意處理的需求。它的原型為:

// Function: response_handler
  // When the use_reponse_handler bit is set to 1, this virtual method is called
  // by the sequencer for each response that arrives for this sequence.
  virtual function void response_handler(uvm_sequence_item response);
    return;
  endfunction

response_handler對uvm_driver沒有任何影響,也就是不可見,uvm_driver仍然用之前的put_response機制就行。

2. response_handler背后機制

sequence里的response_handler(xxx)函數(shù)在uvm_driver調(diào)用seq_item_export.put_response(rsp)的時會自動被調(diào)用執(zhí)行,故此我們從seq_item_export.put_response(rsp)講起。

uvm_driver調(diào)用put_response(rsp)時,會調(diào)用uvm_sequencer_param_base里的put_response(rsp)函數(shù),這個函數(shù)的定義為:

image.png

313行到326行就是對傳參進來的rsp做一些檢查。328行會根據(jù)rsp里攜帶的sequence_id去調(diào)用m_find_sequence函數(shù)在reg_sequences關(guān)聯(lián)數(shù)組里找對應(yīng)sequence的句柄,如果找到了就返回sequence句柄,沒有找到的話,就直接返回null,并報告沒有找到原始sequence的信息。通常我們返回的是非null的,因此會進入330行到337行。

如何避免返回null,在我的另一篇博客中說了,有興趣讀者可以瞄一眼(UVM中使用put_response的一個注意點)。在332行,會判斷m_use_response_handler變量的值,如果為1就執(zhí)行333行sequence里的response_handler函數(shù),如果為0就執(zhí)行337行response_handler的put_response。可想而知,這是1個關(guān)鍵分叉點。我們分別介紹這兩個方法。

2.1 sequence_ptr.response_handler(t)

sequence里的response_handler()函數(shù)我們在第一小節(jié)里也提到了,原型是個空函數(shù),需要用到這個機制的用戶自己去override它來實現(xiàn)需要的功能。

2.2 sequence_ptr.put_response(t)

在uvm_sequence_base類的put_response函數(shù)又會繼續(xù)調(diào)用put_base_response函數(shù),它們倆的代碼為:

virtual function void put_response (uvm_sequence_item response_item);
    put_base_response(response_item); // no error-checking
  endfunction
virtual function void put_base_response(input uvm_sequence_item response);
    if ((response_queue_depth == -1) ||
        (response_queue.size() < response_queue_depth)) begin
      response_queue.push_back(response);
      return;
    end
    if (response_queue_error_report_disabled == 0) begin
      uvm_report_error(get_full_name(), "Response queue overflow, response was dropped", UVM_NONE);
    end
  endfunction

可以看出,在put_base_response函數(shù)里會將uvm_driver送過的rsp放到response_queue隊列了,response_queue隊列定義為:protected uvm_sequence_item response_queue[$]。另外說下response_queue_depth這個int類型變量,它的默認值為8,也就是response_queue隊列默認只能放8個rsp,如果超過的話,會被直接忽視掉(用戶可以打開response_queue_error_report_disabled來報錯)。

但如果用戶想要讓response_queue隊列可以放更多的rsp呢?需要調(diào)用uvm_sequence_base里的set_response_queue_depth(xx)來設(shè)置新值,xx就是傳進去的int類型數(shù)值。也可以調(diào)用get_response_queue_depth()來返回當(dāng)前設(shè)置的值。

response_queue隊列里的值會給get_reponse(xxx)使用。

3. get_response背后機制

在sequence中調(diào)用get_response(xxx)的時候,對調(diào)用uvm_sequence_base類里的get_base_response(xxx)方法。

virtual task get_response(output RSP response, input int transaction_id = -1);
    uvm_sequence_item rsp;
    get_base_response( rsp, transaction_id);
    $cast(response,rsp);
  endtask

get_base_response(xxx)方法的代碼如下:

image.png

從以上代碼可以看出,get_reponse(xxx)就是從response_queue隊列里拿數(shù)據(jù),response_queue里的數(shù)據(jù)是put_response在沒有使能response_handler機制情況下放進去的。因此用戶要注意一旦采用response_handler機制后,在當(dāng)前sequence里一定不能用get_response,反則它會get不到response,一直block在get_base_response方法的991行。

如果transaction_id為-1,也就是用戶沒有指定要得到特定transaction_id的response時,get_base_response會默認返回response_queue里的第一個response,類似于FIFO。如果transaction_id不為-1,那么get_base_response會在response_queue里檢索,直到找到1個匹配對應(yīng)transaction_id的response為止。

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

    關(guān)注

    0

    文章

    181

    瀏覽量

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

    關(guān)注

    0

    文章

    103

    瀏覽量

    5953
收藏 人收藏

    評論

    相關(guān)推薦

    詳解Android Handler機制和原理

    在Android開發(fā)中,Handler機制是一個很重要的知識點,主要用于消息通信。
    的頭像 發(fā)表于 03-26 14:32 ?2413次閱讀

    TC387的lin主節(jié)點在沒有從節(jié)點連接時主response無法發(fā)出如何解決?

    前提TC387的lin為主節(jié)點,沒有從節(jié)點連接,當(dāng)僅有主response時,主response可以可以發(fā)出。當(dāng)同時有主response和從response時,主
    發(fā)表于 02-01 08:04

    esp8266透明傳輸下發(fā)送數(shù)據(jù)模塊response是什么意思?

    現(xiàn)在ESP8266通過路由器訪問到了云服務(wù)器,在透明傳輸模式下,我發(fā)送了一些數(shù)據(jù),然后下圖是給出的response。我設(shè)置了ESP8266為TCP客戶端,傳輸模式為TCP,這是說明傳輸?shù)膮f(xié)議為TCP
    發(fā)表于 04-02 06:35

    怎么將完整的GCX Cal降級為Enhanced Response Cal

    Response - > Cal - > Mange Cals - > Correction Methods ...導(dǎo)航到“Select Calibration Type”頁面,然后取消
    發(fā)表于 04-19 14:42

    什么是UVM Report機制?

    UVM Report機制概述
    發(fā)表于 12-21 06:55

    介紹兩種交互方法來完成Sequencer和Driver的握手機制

    get_response()去等待響應(yīng)item,driver中也不需要set_id_info()和put()返回響應(yīng)item。壞處是,如果裁掉響應(yīng)部分的握手,sequence也就不知道driver什么時候完成
    發(fā)表于 09-23 14:39

    AT報錯Read response buffer failed的解決辦法分享

    “read response buffer failed. the response buffer size is out of buffer size(64)!”的錯誤且無法正常運行后續(xù)功能,將
    發(fā)表于 11-24 14:31

    談?wù)?b class='flag-5'>UVM中的uvm_info打印

    =UVM_INFO, string id=“”);  if (get_report_verbosity_level(severity, id) 《 verbosity ||  get
    發(fā)表于 03-17 16:41

    TPS76850,pdf(Fast-Transient-Response 1-A Low-Dropout Voltage

    This device is designed to have a fast transient response and be stable with 10 µF
    發(fā)表于 10-18 23:00 ?70次下載

    TPS76801,pdf(fast transient response and be stable)

    This device is designed to have a fast transient response and be stable with 10 μF capacitors.
    發(fā)表于 10-18 23:43 ?25次下載

    Get Fast Stable Response From Im

    Get Fast Stable Response From Improved Unity-Gain Followers
    發(fā)表于 03-24 15:46 ?0次下載

    ADuCM330WFS/ADuCM331WFS Digital Filter Frequency Response Calculator

    ADuCM330WFS/ADuCM331WFS Digital Filter Frequency Response Calculator
    發(fā)表于 01-28 11:25 ?5次下載
    ADuCM330WFS/ADuCM331WFS Digital Filter Frequency <b class='flag-5'>Response</b> Calculator

    UVM sequence機制response的簡單使用

    sequence作為UVM幾個核心機制之一,它有效地將transaction的產(chǎn)生從driver中剝離出來,并且通過和sequencer相互配合,成功地將driver的負擔(dān)降低至僅聚焦于根據(jù)協(xié)議將
    的頭像 發(fā)表于 09-22 09:26 ?2272次閱讀

    UVM driver和sequencer的通信

    sequencer生成激勵數(shù)據(jù),并將其傳遞給driver執(zhí)行。UVM類庫提供了uvm_sequencer基類,其參數(shù)為request和response數(shù)據(jù)類型。
    的頭像 發(fā)表于 06-07 11:58 ?1533次閱讀
    <b class='flag-5'>UVM</b> driver和sequencer的通信

    TAST-TRANSIENT-RESPONSE 750-MA低壓差線性穩(wěn)壓器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《TAST-TRANSIENT-RESPONSE 750-MA低壓差線性穩(wěn)壓器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 02-29 14:38 ?0次下載
    TAST-TRANSIENT-<b class='flag-5'>RESPONSE</b> 750-MA低壓差線性穩(wěn)壓器數(shù)據(jù)表