微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 请教UVM问题,sequence切换问题

请教UVM问题,sequence切换问题

时间:10-02 整理:3721RD 点击:
遇到一个uvm验证问题,DUT开始时使用一个sequence, 当DUT产生一个结束信号后,UVM希望立即知道,也就是说没有任何延迟,不能用monitor检测,因为那样会有延迟,如何设计呢?

建立寄存器模型映射关系,通过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上的场景来考虑的;

  1. task wait_signal_ready();
  2. fork
  3. #SYSCLK reg.read(status,addr,value,UVM_BACKDOOR);
  4. if(value == TRUE)
  5. send = 1;
  6. else
  7. send = 0;
  8. join_none
  9. endtask
  10. task send_pkt();
  11. Packet1 pkt1;
  12. Packet2 pkt2;
  13. fork
  14. if(send) begin
  15. pkt1 = new();
  16. assert(pkt1.randomize());
  17. transmit1(pkt1);
  18. end else begin
  19. pkt2 = new();
  20. assert(pkt2.randomize());
  21. transmit2(pkt2);
  22. end
  23. join_none
  24. endtask

复制代码

这段代码的效果跟上面那段代码有什么区别?这里的backdoor读 跟 @(posedge clk)(...)有什么区别?
这里的问题压根就不在于即时把信号的状态获取出来好吗

@(posedge clk)是时间同步的,你的#sysclk不是时间同步的,最坏的情况下有1个时钟周期的delay.

不错的资料

用@ (posedge vif.signal)呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top