很多UVM用戶(hù)平時(shí)更多的使用get_response()方式去獲得uvm_driver的response,但get_response有些缺點(diǎn):由于 get_response() 是一種阻塞方法,它會(huì)阻塞直到收到來(lái)自 UVM 驅(qū)動(dòng)程序 (put_response()) 的響應(yīng)。
因此,如果我們使用 get_response() 方法實(shí)現(xiàn)并按此順序?qū)?start_item()、finish_item() 和 finally get_response() 放置在序列的 body() 方法中,這將導(dǎo)致非流水線序列實(shí)現(xiàn),因?yàn)橄乱粋€(gè)序列項(xiàng)可以只有在 get_response() 方法收到前一個(gè)請(qǐng)求序列項(xiàng)的響應(yīng)項(xiàng)后,才提供給 UVM 驅(qū)動(dòng)程序。
為了實(shí)現(xiàn)背靠背的傳輸,我們可以使用response_handler()機(jī)制,它可以將sequence中發(fā)送request和處理response兩個(gè)操作分開(kāi)處理,盡量減少耦合。例子如下流程圖。
1. 如何使用response_handler
如果想要實(shí)現(xiàn)response_handler機(jī)制的話(huà),第一步需要在要使用這個(gè)機(jī)制的sequence里使能它,即調(diào)用use_response_handler(1)函數(shù)把m_use_response_handler變量設(shè)置為1就行,m_use_response_handler是uvm_sequence_base類(lèi)里的一個(gè)成員變量,默認(rèn)值為0,也就是不打開(kāi)。第二步需要override uvm_sequence_base類(lèi)里的response_handler函數(shù),實(shí)現(xiàn)自己對(duì)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對(duì)uvm_driver沒(méi)有任何影響,也就是不可見(jiàn),uvm_driver仍然用之前的put_response機(jī)制就行。
2. response_handler背后機(jī)制
sequence里的response_handler(xxx)函數(shù)在uvm_driver調(diào)用seq_item_export.put_response(rsp)的時(shí)會(huì)自動(dòng)被調(diào)用執(zhí)行,故此我們從seq_item_export.put_response(rsp)講起。
uvm_driver調(diào)用put_response(rsp)時(shí),會(huì)調(diào)用uvm_sequencer_param_base里的put_response(rsp)函數(shù),這個(gè)函數(shù)的定義為:
313行到326行就是對(duì)傳參進(jìn)來(lái)的rsp做一些檢查。328行會(huì)根據(jù)rsp里攜帶的sequence_id去調(diào)用m_find_sequence函數(shù)在reg_sequences關(guān)聯(lián)數(shù)組里找對(duì)應(yīng)sequence的句柄,如果找到了就返回sequence句柄,沒(méi)有找到的話(huà),就直接返回null,并報(bào)告沒(méi)有找到原始sequence的信息。通常我們返回的是非null的,因此會(huì)進(jìn)入330行到337行。
如何避免返回null,在我的另一篇博客中說(shuō)了,有興趣讀者可以瞄一眼(UVM中使用put_response的一個(gè)注意點(diǎn))。在332行,會(huì)判斷m_use_response_handler變量的值,如果為1就執(zhí)行333行sequence里的response_handler函數(shù),如果為0就執(zhí)行337行response_handler的put_response。可想而知,這是1個(gè)關(guān)鍵分叉點(diǎn)。我們分別介紹這兩個(gè)方法。
2.1 sequence_ptr.response_handler(t)
sequence里的response_handler()函數(shù)我們?cè)诘谝恍」?jié)里也提到了,原型是個(gè)空函數(shù),需要用到這個(gè)機(jī)制的用戶(hù)自己去override它來(lái)實(shí)現(xiàn)需要的功能。
2.2 sequence_ptr.put_response(t)
在uvm_sequence_base類(lèi)的put_response函數(shù)又會(huì)繼續(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ù)里會(huì)將uvm_driver送過(guò)的rsp放到response_queue隊(duì)列了,response_queue隊(duì)列定義為:protected uvm_sequence_item response_queue[$]。另外說(shuō)下response_queue_depth這個(gè)int類(lèi)型變量,它的默認(rèn)值為8,也就是response_queue隊(duì)列默認(rèn)只能放8個(gè)rsp,如果超過(guò)的話(huà),會(huì)被直接忽視掉(用戶(hù)可以打開(kāi)response_queue_error_report_disabled來(lái)報(bào)錯(cuò))。
但如果用戶(hù)想要讓response_queue隊(duì)列可以放更多的rsp呢?需要調(diào)用uvm_sequence_base里的set_response_queue_depth(xx)來(lái)設(shè)置新值,xx就是傳進(jìn)去的int類(lèi)型數(shù)值。也可以調(diào)用get_response_queue_depth()來(lái)返回當(dāng)前設(shè)置的值。
response_queue隊(duì)列里的值會(huì)給get_reponse(xxx)使用。
3. get_response背后機(jī)制
在sequence中調(diào)用get_response(xxx)的時(shí)候,對(duì)調(diào)用uvm_sequence_base類(lèi)里的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)方法的代碼如下:
從以上代碼可以看出,get_reponse(xxx)就是從response_queue隊(duì)列里拿數(shù)據(jù),response_queue里的數(shù)據(jù)是put_response在沒(méi)有使能response_handler機(jī)制情況下放進(jìn)去的。因此用戶(hù)要注意一旦采用response_handler機(jī)制后,在當(dāng)前sequence里一定不能用get_response,反則它會(huì)get不到response,一直block在get_base_response方法的991行。
如果transaction_id為-1,也就是用戶(hù)沒(méi)有指定要得到特定transaction_id的response時(shí),get_base_response會(huì)默認(rèn)返回response_queue里的第一個(gè)response,類(lèi)似于FIFO。如果transaction_id不為-1,那么get_base_response會(huì)在response_queue里檢索,直到找到1個(gè)匹配對(duì)應(yīng)transaction_id的response為止。
-
UVM
+關(guān)注
關(guān)注
0文章
182瀏覽量
19446 -
FIFO存儲(chǔ)
+關(guān)注
關(guān)注
0文章
103瀏覽量
6154
發(fā)布評(píng)論請(qǐng)先 登錄
詳解Android Handler機(jī)制和原理
TC387的lin主節(jié)點(diǎn)在沒(méi)有從節(jié)點(diǎn)連接時(shí)主response無(wú)法發(fā)出如何解決?
esp8266透明傳輸下發(fā)送數(shù)據(jù)模塊response是什么意思?
怎么將完整的GCX Cal降級(jí)為Enhanced Response Cal
介紹兩種交互方法來(lái)完成Sequencer和Driver的握手機(jī)制
AT報(bào)錯(cuò)Read response buffer failed的解決辦法分享
談?wù)?b class='flag-5'>UVM中的uvm_info打印
TPS76850,pdf(Fast-Transient-Response 1-A Low-Dropout Voltage
TPS76801,pdf(fast transient response and be stable)
Get Fast Stable Response From Im
ADuCM330WFS/ADuCM331WFS Digital Filter Frequency Response Calculator

UVM sequence機(jī)制中response的簡(jiǎn)單使用
UVM driver和sequencer的通信

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

評(píng)論