本篇主要介绍一些 systemverilog 中的constraint。
1. 简单表达式
我们可以用> < >= <=
等符号来对变量进行简单的约束, 注意的是当要把某个变量设为定值时, 需要使用==
符号。
比如下面的例子:
1 | class myClass; |
那么运行的结果就是:
1 | source ../edaTools/cadence/INCISIV131/tools/inca/files/ncsimrc |
2. inside 表达式
(1) 也可以使用inside
关键字申明变量的范围或者申明变量只能取某些特定的值, 比如:
1 | constraint my_range { typ > 32; |
(2) 如果加上符号!
表示变量不在某个范围内
1 | rand bit [2:0] typ; |
3. 权重分布
当在随机化变量的时候, 需要某些值出现的更加频繁一些。 就可以用关键字dist
进行权重的约束。
:=
表示的是, 对于指定范围的值, 权重都一样, 比如[1:5]:=50;表示的是[1:5]范围的任何一个值, 其权重都是50;
:/
表示的是, 对于指定范围的值, 权重均分, 比如[1:5]:=50;表示的是[1:5]范围的任何一个值, 其权重都是10;
1 | rand bit [2:0] typ; |
上面约束表示的含义是: 0的权重是20, 6 是40, 7是10, 1:5 中的每个数都是50. 总共320, 那么选择0的概率就是20/320
1 | rand bit [2:0] typ; |
这个约束表示的含义就不同了, 选中0的概率就是20/100
4. 多重约束
多重约束存在时, 取的是交集:
1 | class myClass; |
比如上面的例子, val的值被约束在了[10, 12)
5. implication 约束
implication约束使用的符号是->
, 代表的是某两个或者多个变量之间的关系。 有些类似于if - else
申明。
1 | class ABC; |
上面例子的运行结果为:
1 | ncsim> run |