Verilog - 生成加权随机数

cam*_*nso 3 verilog system-verilog

我试图生成随机单位,只要你想要一个正常的随机化,这很简单:

wire R;
assign R = $random % 2;
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一种加权概率,如:

wire R;
assign R = 60%(0) || 40%(1);
Run Code Online (Sandbox Code Playgroud)

请原谅我,如果它不符合标准的Verilog代码,那只是想知道我想要什么.谁能帮我吗?谢谢

Gre*_*reg 9

SystemVerilog解决方案在randomize被调用中具有分发方法dist.权重由value_or_range := weight或分配value_or_range :/ distributed_weight.这篇来自IEEE Std1800-2012§18.5.4第476页的文章给出了一个明确的例子:

当权重应用于范围时,它们可以应用于范围中的每个值,或者它们可以作为整体应用于范围.例如: 表示x等于100,101,102,200或300,加权比率为1-1-1-2-5,并且 表示x等于100,101,102,200 中的一个,或者300的加权比为1/3-1/3-1/3-2-5.
x dist { [100:102] := 1, 200 := 2, 300 := 5}

x dist { [100:102] :/ 1, 200 := 2, 300 := 5}

dist用于随机化,因此它需要是一个randomize() with(或一个类constraint)的母马.randomize成功返回位,因此它应该是内叫assert,void'()或转让的RHS.

在你我们可以设置0到6的重量和1到4的重量,总重量为10,分布为60/40.例:

reg R;
initial begin
  assert( randomize(R) with { R dist { 0 := 6, 1 := 4 }; } );
end
Run Code Online (Sandbox Code Playgroud)

更多信息dist请参见IEEE Std1800-2012§18.5.4 "分布".