请教UVM问题,sequence切换问题
建立寄存器模型映射关系,通过backdoor访问该寄存器,不会消耗仿真时间
是否可以在环境中直接应用DUT的信号?
如果backdoor没有等到信号变化,你什么时候读下一次?如果立刻读,这就是一个dead loop。monitor采样数据,和有没有延迟没关系。
backdoor访问跟monitor有关系吗;
而且小编描述的场景就是以sequence 为颗粒的模型吧,我以此寄存器的值为选择条件把这个sequencer做成死循环也是可行的啊;
不想用backdoor访问的方式,也可以直接在DUT里插 断言触发event 送出事件来控制,跟backdoor访问 我没有发现有什么区别;
不消耗时间的死循环,会导致仿真无法继续下去。
典型的等待寄存器状态的代码:
while (status == 0) begin
reg_read(addr, status);
end
对于frontdoor没有任何问题,如果变成backdoor,如果第一次读到的状态是0,那么仿真器会永远执行这三条语句。
根据uvm方法学,sequence是可能被复用到top dv的,所以sequence里面不应该出现绝对路径。虽然这么写不会报错,但是这种是verilog风格的testbench。
这根本就不是UVM问题啊,so easy,直接把dut的信号拉出来。
例如@(posedge tb.dut.a.b.c)这样就可以了
一般只有verilog的testbench才会这么做。另外,要指出的是很多设计并不适合用UVM来验证,有时候用verilog完全可以,而且效率更高。
你在sequence layer中的死循环是这样写的吗?
while(1){
reg_read(addr,value,UVM_BACKDOOR);
if(status == 1)
`uvm_do(...)
else
`uvm_do(...)
}
这本身下激励就是整体的颗粒为基础单元的,难道你能在发一个sequence过程中强制 拉断换下一个?这不是扯淡吗
你先看清lz的要求,他要求无延迟等待dut的结束信号,你自己看看你的代码,从read到下一次while(1)有延迟吗?你还不如luyaker的方法靠谱。
本来就只能保证获取这个信号值的过程是没有消耗仿真时间的;
对于验证平台来说,从下发激励到DUT开始 到 从DUT获得输出的过程 已经属于latency,而不再是delay了,你能控制这部分的时间吗?不能吧;
具体的场景也只有小编知道,我仅仅是按照常规的连续发激励,且作用在相同的interface上的场景来考虑的;
- task wait_signal_ready();
- fork
- #SYSCLK reg.read(status,addr,value,UVM_BACKDOOR);
- if(value == TRUE)
- send = 1;
- else
- send = 0;
- join_none
- endtask
- task send_pkt();
- Packet1 pkt1;
- Packet2 pkt2;
- fork
- if(send) begin
- pkt1 = new();
- assert(pkt1.randomize());
- transmit1(pkt1);
- end else begin
- pkt2 = new();
- assert(pkt2.randomize());
- transmit2(pkt2);
- end
- join_none
- endtask
这里的问题压根就不在于即时把信号的状态获取出来好吗
@(posedge clk)是时间同步的,你的#sysclk不是时间同步的,最坏的情况下有1个时钟周期的delay.
不错的资料
用@ (posedge vif.signal)呢?