對於arbiter 驗證,目前有了解到幾種狀況:
1. 可以完全用reference model 來預期golden value;
2. 由於hw比較複雜,需要借助hw internal signal 來判斷,比如arbiter 和sram 空滿強相關,此時就需要借助hw signal.
3. check 時不care各個request拉起來的狀況,比如是否同時拉起來(想做成txn level check),進行分段check。即這篇文章的方法(arbiter驗證方案分享)
第一步:monitor arbiter的input:l1_sch_bsi_data與gc_sch_bsi_data(兩路source)。並且分別放入2個queue中,然後分別與reference model 產生的data序列比較。如果正確,說明arbiter之前的電路行為復合預期。
第二步:monitor arbiter的output,產生乙個dut_sch_bsi_data_q[$]。如果收到l1_sch_bsi_ack訊號,就將refm_l1_sch_bsi_data往refm_sch_bsi_cw_q[$]裡面放,如果收到gc_sch_bsi_ack,就將refm_gc_sch_bsi_data往refm_sch_bsi_cw_q[$]裡面放。
ps:這一步借助hw 訊號ack用於check data經過arbiter是否改變。
第三步:比較refm_sch_bsi_cw_q[$]與dut_sch_bsi_data_q[$]中的序列。如果序列一致,並且assertion沒有報錯,說明arbiter的行為正確。
(1)對於fix priority arbiter,如果輸出的是低優先順序的ack,那麼高優先順序的req必定為低(考量高優先順序的req的上公升沿與低優先順序ack的下降沿同時發生的情況)。
(2)對於round robin priority arbiter的check,如果連續兩次sch_req與imm_req同時拉起,那麼每個人都能得到一次ack訊號。
4. 對於round robin,可以通過對各個request 灌進去相同資料量(而且every source request all the time without delay),統計最終接收的pkt cnt 比例是否滿足權重,例如下表
when any source send 10000 packet, all the source will stop send data
source
mcu
dsp
dfe
fft
weight(prio+1)41
24receive cnt
9963
2490
4980
9962
receive rate
4.00120512
4.000803
link : arbiter驗證方案分享
round robin
思路:當某一路source req時,arb響應的t數不超過source總數,比如有六路source,arb響應的t數不超過6t.
input [5:0] mem_wr_req;
input [5:0] mem_wr_ack;
reg [7:0] no_ack_cnt[6];
generate
for(genvar i = 0; i < 6; i++) begin : cnt_6src_rob_arb
always @ (posedge clk or negedge rst_n) begin
if(!rst_n)
no_ack_cnt[i] <= 0;
else if(mem_wr_req[i] & ((|mem_wr_ack) & (mem_wr_ack[i] == 1'b0)))
no_ack_cnt[i] <= no_ack_cnt[i] + 1'b1;
else if(mem_wr_req[i] & mem_wr_ack[i])
no_ack_cnt[i] <= 0;
endend
endgenerate
//for counter
property rob_6src_arb_check(counter, n);
@(posedge clk) disable iff(!rst_n)
counter < n;
endproperty
//for request states
property rob_6src_arb_req_states_check(req, n);
@(posedge clk) disable iff(!rst_n)
req === n;
endproperty
//for assert counter
generate
for(genvar i = 0; i < 6; i++) begin : mem_rd_6src_rob_arb
ass_cnt: assert property(rob_6src_arb_check(no_ack_cnt[i], 6)) else $error();
endendgenerate
//for cover counter
generate
for(genvar i = 0; i < 6; i++) begin : cov_mem_rd_6src_rob_arb
cov_cnt: cover property(rob_6src_arb_check(no_ack_cnt[i], 6));
endendgenerate
//for cover request states
generate
for(genvar i = 0; i < 64; i++) begin : cov_mem_rd_6src_rob_arb_req
cover property(rob_6src_arb_req_states_check(mem_wr_req, i));
endendgenerate
DV Arbiter驗證方案分享
前言 在數位電路中,arbiter是乙個經常使用的ip,雖然電路的實現非常簡單,但是對dv來講,確實非常不好驗證。下面就分享一種arbiter的驗證方案,不妨稱之為 分段驗證法 如下圖所示的module,有2級arbiter,第一級是fix priority arbiter,第二級是round ro...
DV Arbiter驗證方案分享(續)
前言 前回分享了arbiter驗證的基本思想 link 下面做乙個推廣。並且提供一種使用generate來做assert和cover property的方法。一 round robin arbitor的驗證。對於乙個n輸入的round robin arbitor,需要用n個counter去統計回ac...
12306驗證思路
var youhuming document.queryselectorall zhonginput input 0 console.log youhuming.value 獲取單擊事件onfocus youhuming.onfocus function 失去焦點事件onblur youhuming...