2016-09-29 263 views
-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 

的东西是信号一个ÇË得到强制达到相同的价值。 b,de

如果稍后有新的触发器posedge,新的值会被随机化并强制,但是我又得到a == c == eb == 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所示)

+0

http://stackoverflow.com/help/mcve – toolic

+0

您发布的代码与您实际执行的代码有多接近? –

+0

@ dave_59我用更多的上下文编辑了帖子。我正在尝试在EDA Playground中重新创建它,但目前我的帐户遇到问题 – chinocolerico

回答

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 

唯一约束将导致错误或每次给你唯一的值。指定大小不需要设置边界,但也可以使用其他约束来完成。

1

您的代码存在两个问题。 第一个参数$ urandom_range颠倒;它是(max,分钟),并且分钟是可选的,默认为0.有些模拟器会计算出来,但它不是标准的。

第二个问题是因为你反复强迫相同的表达式。模拟器可能不会将其视为新表达式,也不会再次调用$ urandom。请尝试在每个force前加上release声明。

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 
+0

反转范围的好处。 我试过释放信号,但没有运气。实际上,当块被重新触发时,信号会更新为新的随机值......只是选择的值相同。 – chinocolerico

0

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

背景信息:为了万一任何人都好奇,我在NCSIM中遇到了关于“urandom_range”(但不是“urandom”)的错误,其中第一次调用该函数总是会返回最小指定值什么。但随后的所有调用都可以正常工作。

+0

我在我的问题上添加了更多信息,希望它有帮助 – chinocolerico

相关问题