SV---约束块控制

1.打开或关闭约束

1)p.constraint_mode(0)是关闭约束

2)p.constraint_mode(1)是打开约束

class Packet;
	rand int length;
	constraint c_short {length inside {[1:32]};}
	constraint c_long {length inside {[1000:1023]};}
endclass
Packet P;
initial begin
	p = new();
	//创建一个long packet
	p.c_short.constraint_mode(0);//short packet等于0,就是把short packet关闭,只有long_packet的约束有效
	assert (p.randomize());
	transmit(p);
	//创建一个short packet
	p.constraint_mode(0);//此时long和short的约束都失效
	p.c_short.constraint_mode(1);//打开short的约束
	transmit(p);
end 

例题:

SV---约束块控制_第1张图片

解析:因为约束冲突,所以随机化失败,此时调用randomize()的返回值是0,所以选A。但有的编译器会报warning 

2.内嵌约束

SV---约束块控制_第2张图片

class Transaction;
	rand bit [31:0] addr,data;
	constraint c1 {addr inside {[0:100],[1000:2000]};}
endclass
Transaction t;
initial begin
	t= new();
	assert(t.randomize() with {addr >= 50; addr <= 1500; data < 10;});//综合上面的约束addr is 50-100 1000-1500
	driveBus(t);
end 

 从上述代码可以看出,第三行约束addr是0-100,1000-2000.然后通过内嵌约束大于50,小于1500.最后addr的范围是500-100,1000-1500.

3.soft

约束前面添加soft关键词,会降低约束优先级,使内嵌约束优先级变高。

例题:下列哪个值是合理的?

A 报错,10         B 报错,报错         C 200,10          D 0,10

class Transaction;
	rand bit [31:0] addr,data;
	constraint c1 {soft addr inside {[0:100],[1000:2000]};}
endclass
Transaction t;
initial begin
	t= new();
	assert(t.randomize() with {addr  inside [200:300];data inside [10:20];}
	driveBus(t);
end 

解析:如果没有关键词soft,addr的约束和内嵌约束矛盾,所以两个都会报错,addr约束不满足,addr和data都会报错。

           但因为有soft,减低了约束的优先级,使得内嵌约束起作用,所以200,10合理,答案是C

你可能感兴趣的:(SV,systemverilog)