如何修改DUT的写延迟和读延迟的bit bash序列?

时间:2018-05-14 07:27:57

标签: system-verilog uvm

我有一个DUT,写入需要2个时钟周期,并且在实际发生之前读取消耗2个时钟周期,我使用regmodel并尝试使用内置序列uvm_reg_bit_bash_seq,但似乎写入和读取发生在1个时钟周期延迟,任何人都可以告诉我们建模2个时钟周期延迟的有效方法并验证这一点,以便彻底解决DUT延迟问题。

现在面对以下错误,

  

在寄存器“ral_pgm.DIFF_STAT_CORE1”的第0位写入1,初始值为“h0000000000000000”,而不是'h0000000000000001

1 个答案:

答案 0 :(得分:0)

我找到了一种方法,采用现有的uvm_reg_single_bit_bash_seq并通过添加p_sequencer进行修改,并根据DUT延迟在写入和读取方法调用后添加了2个时钟周期延迟,这有助于我解决问题并添加了一个写入方法后调用,以避免在读取操作后获取旧值。

...
  `uvm_declare_p_sequencer(s_master_sequencer)

         rg.write(status, val, UVM_FRONTDOOR, map, this);
         wait_for_clock(2); // write latency
         rg.read(status, val, UVM_FRONTDOOR, map, this);
         wait_for_clock(2); // read latency
         if (status != UVM_IS_OK) begin
            `uvm_error("mtm_reg_bit_bash_seq", $sformatf("Status was %s when reading register \"%s\" through map \"%s\".",
                                        status.name(), rg.get_full_name(), map.get_full_name()));
         end

         val = rg.get(); // newly added method call (get) to fetch value after read
...

   task wait_for_clock( int m = 1 );
      repeat ( m ) begin
      @(posedge p_sequencer.vif.CLK);
      end
    endtask: wait_for_clock
...