SystemVerilog语言之约束的技巧和技术

约束的技巧和技术

常用的随机函数

$random() 			// 平均分布,反回32位有符号的随机数
$urandom() 			// 平均分布,返回32位无符号随机数
$urandom_range() 	// 在指定范围内的平均分布

使用$urandom_range函数

initial begin
	bit [31:0] data[3];

	data[0] = $urandom_range(0,10); // 0~10
	data[1] = $urandom_range(5,0);  // 0~5
	data[2] = $urandom_range(20);   // 0~20
end

变量的约束

约束变量的上下限

class transaction;
	rand int data;
	
	constraint c_data {
		data inside {[1:100]}; // 1~100
	}
endclass

带有权重的约束(dist)

typedef enum {DATA8, DATA16, DATA32, DATA64} data_e;
class transaction;
	rand data_e data_kind;

	constraint c_data_kind {
		data_kind dist {
			DATA8  := 2,
			DATA16 := 1,
			DATA32 := 1,
			DATA64 := 1 
		};
	}
endclass

例子说明:上述例子中DATA8 DATA16 DATA32 DATA64出现的比例分别为:40% 20% 20% 20%。
注:在缺省的情况下,每一种出现的概率是相等的,可以通过设置权重为0来禁止某种情况。

rand_mode的使用

如果只有少数几个变量需要修改,可以通过使用rand_mode函数来将这些变量设置为非随机变量。

class transaction;
	rand bit[31:0] data;
	rand bit[31:0] length;
	
	constraint c_data {
		data inside {[1:100]}; 
	}
	constraint c_length {
		length > 0;
	}
endclass

initial begin
	transaction tr;
	tr = new();
	
	// 随机化transaction class中的data和length
	assert(tr.randomize());
	$display("The value of data is %0d and length is %0d", tr.data, tr.length);

	tr.length.rand_mode(0);
	tr.length = 100;
	assert(tr.randomize());
	$display("The value of data is %0d and length is %0d", tr.data, tr.length);
end

constraint_mode的使用

可以通过constraint_mode来实现约束的打开或者关闭

class transaction;
	rand bit[31:0] data;
	rand bit[31:0] length
	
	constraint c_data {
		data inside {[1:10]}; 
	}
	constraint c_length {
		length == 10;
	}
endclass

initial begin
	transaction tr;
	tr = new();
	
	// 关闭tr中所有的约束
	tr.constraint_mode(0);
	assert(tr.randomize());
	$display("The value of data is %0d and length is %0d", tr.data, tr.length);

	// 仅仅打开tr中length的约束
	tr.constraint_mode(0);
	tr.c_length.constraint_mode(1);
	assert(tr.randomize());
	$display("The value of data is %0d and length is %0d", tr.data, tr.length);
end

randomize()with的使用

SystemVerilog中允许使用randomize()with来增加额外的约束,这和在类当中增加约束是等效的。

class transaction;
	rand bit[31:0] data;
	rand bit[31:0] length;
	
	constraint c_data {
		data inside {[1:100]}; 
	}
endclass

initial begin
	transaction tr;
	tr = new();
	
	assert(tr.randomize() with {data == 99; length inside {[1:10]}; });
	$display("The value of data is %0d", tr.data);
	$display("The value of length is %0d", tr.length);
end

注:在with{}语句当中,SystemVerilog使用了类的作用域,所以上述例子中data和length变量,不是使用tr.data和tr.length。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芯芯之火,可以燎原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值