在module中Cover一個多bit向量的狀態轉移
前言:在驗DSB(Data Send Back)的時候,我們經常會遇到這樣的場景:需要Cover每個Channel的工作狀態,需要看是否有IRQ發生,看這個IRQ能否被mask掉。如何去Cover這種狀態呢?本文將推薦一種做法。
一、各個Channel的IDLE狀態
1.1、假設idle信號的邏輯如下:
bit [193:0] idle;
bit [193:0] req;
bit [193:0] work;
idle = ~(req | work);
1.2、covergroup定義及例化
- 在module中使用generate做“複製”的操作
- 通過new函數(構造函數)給covergroup傳參數
module dma_test_top();
covergroup idle_chk_cvg(logic i) @(posedge clk);
idle_trans : coverpoint idle_vector[i] {
bins busy = (1 => 0);
bins idle = (0 => 1);
}
endgroup : idle_chk_cvg
generate
for(genvar i = 0; i < 194; i++) begin : IDLE_BIY
idle_chk_cvg idle_chk_cvg_inst = new(i);
end
endgenerate
endmodule : dma_test_top
1.3、IDLE邏輯的Check
property idle_chk_f(i); //對req變化的情況做Check
@(posedge clk) disable iff(~rst_n)
$changed(req_vector[i]) |=> idle_vertor[i] === ~(req_vector | work_vector);
endproperty
property idle_chk_r(i); //對req不變的情況做Check
@(posedge clk) disable iff(~rst_n)
!$changed(req_vector[i]) |=> idle_vertor[i] === ~(req_vector | work_vector);
endproperty
property idle_chk_d(i); //對req變化的當T做Check
@(posedge clk) disable iff(~rst_n)
$changed(req_vector[i]) |-> idle_vertor[i] === (req_vector | work_vector);
endproperty
generate
for(genvar i = 0; i < 193; i++) begin : IDLE_F
A_IDLE : assert property(idle_chk_f(i)) else $error();
C_IDLE : cover property(idle_chk_f(i));
end
endgenerate