我正在使用 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
问题是信号a,c和e被强制为相同的值。b,d和e相同。
如果稍后有新的触发器构成,新值确实会被随机化和强制,但我再次得到a == c == e
and b == d == e
。
似乎$urandom_range
每个参数的选择(0 到 FF,0 到 F)只被调用一次,并且返回值被重新用于三个force
命令。
编辑:我能够在最小的 TB 上重现该问题:http ://www.edaplayground.com/x/4_ph
我正在使用的供应商似乎存在问题,选择其他工具问题就消失了。
编辑 2:我还没有弄清楚为什么会发生这种情况,但这似乎与force语句就像一个连续赋值的事实有关(即,如果 RHS 信号在未来发生变化,强制 LHS 将跟随它直到force是release d,它不像 '=' 赋值)。
所以我的猜测是问题在于将函数的返回值用作RHS。(我不知道这个返回值有哪个生命周期)
在我的情况下,解决方案是将 $urandom 值保存到具有静态生命周期的变量中,然后将该变量强制到 RTL(如 J Reid 建议的那样)