《SystemVerilog驗證測試平臺編寫指南》學習筆記——回撥
阿新 • • 發佈:2021-02-19
技術標籤:SystemVerilogsystemverilog
一、回撥
如何建立一個可以不做任何更改就能在所有測試中使用的驗證環境?
要做到這一點的關鍵就是測試平臺必須提供一個“鉤子”,以便測試程式在不修改原始類的情況下注入新的程式碼。
驅動器的作用:
- 注入錯誤
- 放棄事務
- 延遲事務
- 將本事務跟其他事務同步
- 將事務放進記分板
- 收集功能覆蓋資料
與其試圖預測所有可能的錯誤、延遲或者事務流程中的干擾,不如使用回撥的方法,這時驅動器僅需要回撥一個在頂層測試中定義的子程式。這種回撥子程式可以在每個測試中做不同的定義,這樣測試就可以使用回撥來為驅動器增加新的功能而不用編輯Driver類。
二、建立一個回撥任務
一個回撥任務應該在頂層測試中建立,在環境中的最低階即驅動器中呼叫。
回撥基類
virtual class Driver_cbs; //驅動器回撥
virtual task pre_tx(ref Transaction tr, ref bit drop); //預設情況下回調不做任何動作
endtask
virtual task post_tx(ref Transaction tr); //預設情況下回調不做任何動作
endtask
endclass
使用回撥的驅動器類
class Driver;
Driver_cbs cbs[$]
task run();
bit drop;
Transaction tr;
forever begin
drop = 0;
agt2drv.get(tr);
foreach(cbs[i]) cbs[i].pre_tx(tr,drop);
if(!drop) continue;
transmit(tr);
foreach(cbs[i]) cbs[i].post_tx(tr,drop);
end
endtask
endclass
三、使用回撥來注入干擾
回撥可以用來注入干擾,例如引起一個錯誤或延遲。回撥也可以用來向記分板傳送資料或者收集功能覆蓋率資料。
使用回撥進行錯誤注入
class Driver_cbs_drop extends Driver_cbs;
virtual task pre_tx(ref Transaction tr, ref bit drop);
//每100個事務中隨機丟棄一個
drop = ($urandom_range(0,99) == 0);
endtask
endclass
program automatic test;
Environment env;
initial begin
env.new();
env.gen_cfg();
env.build();
begin //建立錯誤注入的回撥任務
Driver_cbs_drop dcd = new();
env.drv.cbs.push_back(dcd); //放入驅動器佇列
end
env.run();
env.wrap_up();
end
endprogram
四、記分板
記分板的設計取決於待測設計DUT。
使用原子事務的簡單記分板
/*
這個記分板,它將事務儲存在一個期望值佇列中,
第一個方法用來儲存一個期望的事務,
第二個方法嘗試找出與測試平臺接收到的實際事務相匹配的期望事務,
可能會得到0個匹配,1個匹配或者多個匹配。
*/
class Scoreboard;
Transaction scb[$]; //儲存期望的事務的佇列
function void save_expect(input Transaction tr);
scb.push_bask(tr);
endfunction
function void compare_actual(input Transaction tr);
int q[$];
q = scb.find_index(x) with (x.src == tr.src);
case(q.size())
0: $display("No match found");
1: scb.delete(q[0]);
default:
$display("Error,multiple matches found!");
endcase
endfunction : compare_actual
endclass : Scoreborad
五、與使用回撥的記分板進行連線
記分板使用回撥
class Driver_cbs_scoreboard extends Driver_cbs;
Scoreboard scb;
virtual task pre_tx(ref Transaction tr, ref bit drop);
scb.save_expect(tr); //將事務放入記分板
endtask
function new(input Scoreboard scb)
this.scb = scb;
endfunction
endclass
program automatic test;
Environment env;
initial begin
env.new();
env.gen_cfg();
env.build();
begin //建立scb回撥
Driver_cbs_scoreboard dcs = new(env.scb);
env.drv.cbs.push_back(dcs); //放入驅動器佇列
end
env.run();
env.wrap_up();
end
endprogram
應該總是為記分板和功能覆蓋使用回撥。事務監測器可以使用一個回撥來比較接受到的事務和期待的事務,監視器回撥也非常適合用來收集DUT實際傳送事務的功能覆蓋資料。
六、使用回撥來除錯事務處理器
如果一個使用回撥的事務處理器沒有按照預期工作,可以使用另外一個回撥來除錯它,可以通過增加一個顯示事務內容的回撥。