约束提供了对随机化的控制,用户可以从中控制随机化的值。有很多方法可以控制这些值。其中之一是加权分布。加权分布在约束块中创建分布,使得某些值的选择频率高于其他值。加权分布运算符是 dist,它采用由“:=”或“:/”运算符分隔的值和权重列表。 “:=”运算符指定范围内每个指定值的权重相同,“:/”运算符指定权重在所有值之间平均分配。
这两个运算符的语法是:
Value := <weight>
Value :/ <weight>
值和权重可以是常数或变量。 “值”可以是单个或一个范围。未指定值的默认权重为 1。此外,权重总和不必为 100。
例如: Data dist { 10 := 8, [11:13] := 10 };
在这种情况下,加权分布如下。一系列值的均匀分布:
Data == 10, weight 8
Data == 11, weight 10
Data == 12, weight 10
Data == 13, weight 10
再例如:Data dist { 10 :/ 8, [11:13] :/ 10 };
在这种情况下,加权分布如下。 :/ 将指定的权重分配给项目,或者如果项目是范围,则指定权重/N,其中 N 是范围内的值的数量:
Data == 10, weight 8
Data == 11, weight 10/3
Data == 12, weight 10/3
Data == 13, weight 10/3
看一个完整的示例( := )
1 class distClass; 2 rand bit [2:0] data; 3 constraint distr { data dist { 0:=30, [1:3]:=70, 4:=50, 5:=20}; } 4 endclass 5 module top; 6 distClass dc = new (); 7 initial begin 8 for (int i = 0; i < 20; i++) begin 9 dc.randomize(); 10 $display ("data=%0d",dc.data); 11 end 12 end 13 endmodule
模拟结果:
Compiler version S-2021.09; Runtime version S-2021.09; Aug 17 02:09 2022
data=5
data=1
data=1
data=3
data=2
data=1
data=4
data=1
data=3
data=4
data=4
data=2
data=3
data=0
data=2
data=3
data=2
data=1
data=4
data=0
V C S S i m u l a t i o n R e p o r t
权重分布如下:
data == 0, weight 30
data == 1, weight 70
data == 2, weight 70
data == 3, weight 70
data == 4, weight 50
data == 5, weight 20
此示例中的分布显示数据范围 [1:3] 的分布权重最高,为 70。因此,在模拟日志中,您会看到更多的值 1、2 和 3 作为随机生成的值,以及一些“4”,因为它的权重于为50”。但是你只看到两个“0”,因为它的权重是第二低的 30,只有一个“5”,因为它的权重是最低的。
让我们看一个将“:=”与“:/”运算符进行对比的示例。我们使用“:/”运算符扩展上面的示例以查看并比较:
1 class distClass; 2 rand bit [2:0] data, addr; 3 constraint distr { data dist { 0:=30, [1:3]:=70, 4:=50, 5:=20}; } // := operator 4 constraint distr1 { addr dist { 0:/30, [1:3]:/70, 4:/50, 5:/20}; } // :/ operator 5 endclass 6 module top; 7 distClass dc = new ( ); 8 initial begin 9 for (int i = 0; i < 20; i++) begin 10 dc.randomize(); 11 $display ("data=%0d addr=%0d",dc.data, dc.addr); 12 end 13 end 14 endmodule
模拟结果:
Compiler version S-2021.09; Runtime version S-2021.09; Aug 17 02:18 2022
data=5 addr=1
data=1 addr=3
data=1 addr=4
data=3 addr=5
data=2 addr=2
data=1 addr=1
data=4 addr=4
data=1 addr=4
data=3 addr=1
data=4 addr=4
data=4 addr=0
data=2 addr=5
data=3 addr=4
data=0 addr=0
data=2 addr=0
data=3 addr=2
data=2 addr=1
data=1 addr=5
data=4 addr=0
data=0 addr=0
V C S S i m u l a t i o n R e p o r t
“data”的分布与我们在前面的示例中看到的相同,但与“addr”的分布形成对比。 “addr”权重分布如下:
addr == 0, weight 30
addr == 1, weight 70/3 ( = 23.3 )
addr == 2, weight 70/3 ( = 23.3 )
addr == 3, weight 70/3 ( = 23.3 )
addr == 4, weight 50
addr == 5, weight 20
因此,addr == 1, 2, 3 的权重现在从 70 减少到 23.3。因此,其他值的权重现在更高。因此,您会看到更多的“4”值,然后是“0”值,然后是较小的值 1、2 和 3,最后是最少数量的 5。对比“data”与“addr”的分布, ' 并且您将看到两个运算符之间的区别。
最后注意: “dist”操作不能应用于“randc”变量。 “dist”操作要求表达式至少包含一个“rand”变量。
标签:10,Weighted,addr,weight,70,权重,Distribution,data From: https://www.cnblogs.com/xiangtianxiao/p/16595071.html