[SV]SystemVerilog中Cover一個多bit的向量的狀態轉移

                 在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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章