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