我有一个DUT,写入需要2个时钟周期,并且在实际发生之前读取消耗2个时钟周期,我使用regmodel并尝试使用内置序列uvm_reg_bit_bash_seq,但似乎写入和读取发生在1个时钟周期延迟,任何人都可以告诉我们建模2个时钟周期延迟的有效方法并验证这一点,以便彻底解决DUT延迟问题。
现在面对以下错误,
在寄存器“ral_pgm.DIFF_STAT_CORE1”的第0位写入1,初始值为“h0000000000000000”,而不是'h0000000000000001
答案 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
...