文章目录
前言
本节记录SystemVerilog约束随机的基础的知识。更多相关内容参考《IEEE Std 1800™-2012, IEEE Standard for SystemVerilog—Unified Hardware Design, Specification, and Verification Language》。
1 Randomization basics
SystemVerilog提供了多种方法来生成和操作随机数据。
1.1 $urandom()
- $urandom():系统函数用来生成无符号的随机数。该函数接受一个参数“seed”(可以是任何整数表达式),生成随机数序列。该函数每次不带seed实参调用时,返回一个新的32位无符号随机整数。当提供固定的种子实参时,每次调用$urandom()时(每次仿真时,不管初始模拟种子是什么),RNG都将生成相同的随机数序列。
function int unsigned $urandom [ (int seed ) ]
1.2 $urandom_range()
- $urandom_range():系统函数返回指定范围内的无符号整数。
function int unsigned $urandom_range(int unsigned maxval, int unsigned minval = 0 )
1.3 randomize()
-
randomize():内置类方法,用于根据预先设置的约束对带有rand/randc限定符的字段进行随机化。当不带参数调用时,它将递归随机化类中的所有随机变量。它可以被调用来随机化特定的变量(可以用rand限定符定义,也可以不定义),同时保持所有预定义的约束条件都是可满足的。当使用" null "参数调用randomize()方法时,可以将其用作约束检查器。
- pre_randomize()虚方法在随机化过程之前被调用。该方法可以被用户覆盖。
- randomize()方法是内置的,不能被重写。
- 在成功的随机化过程之后调用post_randomize()方法。该方法可以被用户覆盖。
- 当randomize()失败时,随机变量将保留其旧值。
- 可以调用rand_mode()方法来启用/禁用随机变量。当使用0/1参数调用时,它将禁用/启用一个随机变量(当调用随机变量时)或所有类随机变量(当调用类对象时)。在不带参数调用时获取随机状态。
- 可以使用" with "子句接受内联约束。
class Bus;
randc bit [15:0] addr;
rand bit [31:0] data;
int pkt_number;
constraint word_align {addr[1:0] == 2’b0;}
endclass
Bus busA = new;
repeat (50)
if ( busA.randomize() == 1 )
$display("addr = %h data = %h",busA.addr,busA.data);
else
$display("Randomization FAILED");
1.4 std::randomize()
- std::randomize(): 可在类作用域外调用,以随机化非类成员。可以使用" with "子句接受内联约束。
更多使用场景可以参考如下链接:
在sequence中对变量随机
2 Constraints and solution space
-
约束可以定义为类的显式属性,也可以通过randomize()调用内联指定。
-
约束条件是求解器需要保持为真的表达式。约束表达式包括随机变量、非随机状态变量、操作符、分布、字面量和常量。
-
约束操作符:
- Set membership: “inside”
- Implication: “->”
- Distribution/weighting: “dist”
- Iteration: “foreach”
- Conditional: “if…else”
- Probability and distribution: “solve…before”
-
约束表达式有一定的局限性:
- 函数。不能有output或者ref的参数。变量必须是automatic。不能使用rand_mode()或者constraint_mode()。
- 操作符。不能使用++或者–这样的操作符。
- 随机循环变量(randc)不能在solve … before算子中使用。
- dist构造是一个约束表达式,不能出现在其他表达式中。
- 约束只支持2状态整数值。不支持X和Z。
- 不支持4状态操作符如=== 或者 !==。
具体可以查看SystemVerilog约束随机(二)
总结
本文主要简单的记录一下,SystemVerilog中的约束随机相关的基础知识。