我正在使用UVM运行测试台。在组件的run_phase()
任务之一,我做了fork...join_none
开始下面的循环,这在整个模拟运行:
fork
forever @(posedge trigger) begin
force dut.a = $urandom_range('h00,'hFF);
force dut.b = $urandom_range('h0, 'hF);
force dut.c = $urandom_range('h00,'hFF);
force dut.d = $urandom_range('h0, 'hF);
force dut.e = $urandom_range('h00,'hFF);
force dut.f = $urandom_range('h0, 'hF);
end
...
some other stuff
...
join_none
的东西是信号一个,Ç和Ë得到强制达到相同的价值。 b,d和e。
如果稍后有新的触发器posedge,新的值会被随机化并强制,但是我又得到a == c == e
和b == d == e
。
对于每个参数的选择(0到FF和0到F),似乎只调用一次$urandom_range
,并且将三个force
命令重新使用返回值。
编辑:我是能够重现上最小的TB问题:http://www.edaplayground.com/x/4_ph
它看起来像我使用,选择其他工具供应商的问题,这个问题就会消失。
编辑2:我还没有想出究竟为什么发生这种情况,但它似乎与这样的事实:力说法就像是一个连续的分配(即,如果在今后的RHS信号变化,强迫的LHS将跟着它,直到是版本d,它不像'='赋值)。
所以我的猜测是问题在于使用函数的返回值作为RHS。 (我不知道这个返回值有哪些生命周期)
在我的情况下,解决方案是将$ urandom值保存到一个具有静态生命周期的变量,然后强制该变量为RTL(如J Reid所示)
http://stackoverflow.com/help/mcve – toolic
您发布的代码与您实际执行的代码有多接近? –
@ dave_59我用更多的上下文编辑了帖子。我正在尝试在EDA Playground中重新创建它,但目前我的帐户遇到问题 – chinocolerico