前言
本章学习随机约束
一、最简单的随机
可以用在sequence中或者testcase中,直接使用。常见的随机函数如下:
- $random()——平均分布,返回32位有符号随机数
- $urandom()——同上,无符号
- $urandom_range(a,b)——在指定范围内同上,上下限位置不限,只有一个表示0-a/b
1. $random——系统方法,返回32bit的有符号伪随机数
语法如下:
$random(seed)
//种子变量seed是可选的。
$random产生一个32bit的有符号随机数,可以是正数、也可以是负数。其种子变量(必须是reg类型、整型或时间型变量)。
- 用法一:$random%b
b为一个大于0的整数,表达式给出了一个范围在[-b+1 : b-1]之间的随机数,例如:
int randval;
randval = $random % 60; //随机产生一个-59~59之间的有符号数
- 用法二:{$random%b}
{ }化为无符号数,拼接操作符{ }将$random返回的有符号数转换成了无符号数。
int randval;
randval = {
$random % 60}; //随机产生一个0~59之间的无符号数
2. $urandom——系统方法,返回32bit的无符号伪随机数
语法如下:
function int unsigned $urandom(int seed);
//种子seed是可选参数,决定了生成的随机数值。相同的种子生成的随机数值也相同
示例:
bit[64:1] addr;
bit [3:0] number;
addr[32:1] = $urandom(254) ; //初始化随机数发生器(RNG),获得一个32bit的随机数
addr = {
$urandom, $urandom}; //产生一个64bit的随机数
number = $urandom & 15; //产生一个4bit的随机数
3. $urandom_range()——系统方法,返回指定范围内的无符号随机整数
语法如下:
function int unsigned $urandom_range(int unsigned maxval,
int unsigned minval = 0);
//参数最小值min是可以省略的 , 且最大值与最小值的位置是可以互换的。
下述三个随机值都在0~7的范围内,示例:
val1 = $urandom_range(7,0) ;
val2 = $urandom_range(7) ;
val3 = $urandom_range(0, 7) ;
二、加约束的随机
首先建立一个具有一组相关的随机变量的类,然后用随机函数为这些变量赋随机值,可以用约束来限制这些随机值的范围,使他们是有效的值。
如下代码举例最简单的随机约束:
class Packet;
typedef enum {
BYTE, WORD, LWRD} length_e;
rand length_e len;
rand bit[31:0] src,dst,data[8];
randc bit[7:0] kind; //随机变量
bit [31:0] w_byte=