1

我正在使用 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

问题是信号ace被强制为相同的值。bde相同。

如果稍后有新的触发器构成,新值确实会被随机化和强制,但我再次得到a == c == eand b == d == e

似乎$urandom_range每个参数的选择(0 到 FF,0 到 F)只被调用一次,并且返回值被重新用于三个force命令。


编辑:我能够在最小的 TB 上重现该问题:http ://www.edaplayground.com/x/4_ph

我正在使用的供应商似乎存在问题,选择其他工具问题就消失了。


编辑 2:我还没有弄清楚为什么会发生这种情况,但这似乎与force语句就像一个连续赋值的事实有关(即,如果 RHS 信号在未来发生变化,强制 LHS 将跟随它直到forcerelease d,它不像 '=' 赋值)。

所以我的猜测是问题在于将函数的返回值用作RHS。(我不知道这个返回值有哪个生命周期)

在我的情况下,解决方案是将 $urandom 值保存到具有静态生命周期的变量中,然后将该变量强制到 RTL(如 J Reid 建议的那样)

4

3 回答 3

1

您的代码有两个问题。首先,您将 $urandom_range 的参数颠倒了;它是(maxmin),并且min是可选的,默认为 0。一些模拟器会解决这个问题,但这不是标准的。

第二个问题是因为您反复强制使用相同的表达式。模拟器可能不会将其视为新表达式并且不会再次调用 $urandom。尝试release在每个force.

 forever @(posedge trigger) begin
      release dut.a; force dut.a = $urandom_range('hFF);
      release dut.b; force dut.b = $urandom_range('hF);
      release dut.c; force dut.c = $urandom_range('hFF);
      release dut.d; force dut.d = $urandom_range('hF);
      release dut.e; force dut.e = $urandom_range('hFF);
      release dut.f; force dut.f = $urandom_range('hF);
   end
于 2016-09-30T14:43:55.047 回答
1

为什么不使用具有随机变量和约束的类???

// outside of the test-bench
class my_stimulus;
    rand bit [7:0] a, c, e;  // can be logic if you like
    rand bit [3:0] b, d, f;  // rand won't give X or Z

    constraint c1 { 
        unique {a, c, e}; 
        unique {b, d, f};       
    }       
endclass;   

// inside the actual testbench 
my_stimulus to_dut = new; 

fork
   forever @(posedge trigger) begin
    if (!(to_dut.randomize()) $error;
    force dut.a = to_dut.a;
    ...
    force dut.f = to_dut.f;
   end
...
join_none   

唯一约束将导致错误或每次都为您提供唯一值。指定大小消除了设置边界的需要,但也可以通过另一个约束来完成。

于 2016-10-06T19:47:50.937 回答
0

作为使用 NCSIM 的 OP,我遇到了与“urandom_range”非常相似的问题。然而,“urandom”工作得很好。不应该有任何理由认为“urandom”不应该在你的情况下工作而不是“urandom_range”(假设“urandom”当然可以正常工作)。“urandom”的结果将被截断。

背景信息:以防万一有人好奇,我在 NCSIM 中遇到了一个关于“urandom_range”(但不是“urandom”)的错误,其中第一次调用函数总是会返回最小的指定值,无论如何。但是所有后续调用都运行良好。

于 2016-12-01T23:09:35.523 回答