systemverilog中实数的随机化

randomization of real numbers in systemverilog

我想从以下分布中获得一个随机值:

从 1 到 10 的概率为 90% 从 100 到 1000,概率为 10%

为了达到这个目的,我写了以下内容:

    constraint constraint_randx {
    randx dist{
        [0.001   :   0.010] :/ 90,
        [0.100   :   1.000] :/ 10
    }; }

应用随机化命令后,我收到以下错误消息:

ncsim: *W,RNDOCS: These variables contribute to the set of conflicting constraints:

我在论坛上看到有些模拟器不允许真实随机化。恐怕,我的模拟器就是这样的。

你能告诉我一些解决方案吗?

SystemVerilog 标准只定义了具有积分约束的随机积分变量。您可以将随机变量缩放为实数的 1000 倍的 int 并缩放约束。然后在 post_randomize 中,将值除以 1000.0 进行缩放。

rand int randx;
real realx;
constraint constraint_randx {
    randx dist{
        [0001   :   0010] :/ 90,
        [0100   :   1000] :/ 10
    }; }
function void post_randomize();
   realx = randx/1000.0;
endfunction

如果你有较新的 ncsim 版本(我知道 15+ 肯定有效)并且你有混合信号许可证(我忘记了那个许可证的确切名称),你可以随机化实数。

我后来使用以下代码(通过引入初始化)解决了这个问题:

rand real randx = 0.001;
constraint constraint_randx {
    randx dist{
        [0.001   :   0.010] :/ 90,
        [0.100   :   1.000] :/ 10
    }; }