【问题标题】:systemVerilog- how can I use $urandom/$random with range?systemVerilog-我如何使用 $urandom/$random 和范围?
【发布时间】:2016-12-15 14:00:30
【问题描述】:

有没有办法在范围内使用 $urandom/$random?

我通过以下方式成功使用最大范围(在这种情况下 11 是最大范围):

 temp = (($urandom(9)%11));

但是我怎样才能做到最大值和最小值,例如 max=11, min =8。

【问题讨论】:

    标签: random system-verilog


    【解决方案1】:

    你需要$urandom_range,例如:

    temp = $urandom_range(maxVal,minVal);
    

    minVal 是可选的;如果你忽略它,最小值将为零。

    【讨论】:

    • 我不能使用 $urandom_range 因为我希望能够使用种子。
    • @sara8d $urandom_range 的播种方式与 $urandom 相同。如何完成是特定于供应商的。 $random 是如何播种的在 Verilog 标准中定义,但是如果您使用 $random,您只会得到一个随机数生成器,因此您的随机稳定性很差。
    • 这就是每笔交易会得到不同种子的原因。
    • @sara8d 不一定。这取决于你是如何编码的。在 System-verilog 中,如果您使用 $urandom$urandom_rangerandomize(),每个线程将有自己的随机数生成器 (RNG),并且该 RNG 是从父线程中播种的。因此,每个线程的种子取决于父线程在生成线程时的 RNG 状态。因此,当您随机化事务时,RNG 使用执行 $urandom$urandom_rangerandomize() 的线程的种子,这通常是 sequencer 中的代码正在使用的线程(或任何你想叫它的名字)。
    • @sara8d 巧合的是,my company 刚刚运行 this webinar,今天晚些时候又再次运行。我想你可能会觉得它很有用。
    【解决方案2】:

    另请注意,$urandom_range 的参数是 int 无符号的,因此 -1 将被视为一个非常正数,如果 minVal 大于 maxVal,它们会自动交换。

    $urandom_range 非常方便,但您也可以查看 std::randomize() 并使用“内部”进行内联约束,例如:

    ok = std::randomize(a) with {a inside {0, [12:23], 42}; };
    

    看看https://www.edaplayground.com/x/3yEW

    【讨论】:

    • @jonesofcam- 我不能使用 randomize(() 因为我使用的 ModelSim 不支持它。
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多