System Verilog的约束constraint
约束编程是system verilog中一个很强大的编程方法,它让我们创建的对象可以很轻松扩展功能或约束对象实现指定的功能
1、约束块(constraint block)
约束块是类的成员,像变量、task和function一样,约束块的名字在一个类里是唯一的,约束块的声明如下:
class bus;
rand bit [31:0] addr,data
constraint addr_c {
addr[1:0] == 2'b0;
}
endclass
上面的代码中构建了一个约束块addr_c,约束快的修饰符是constrain,约束的内容是地址的低2bit为0,在调用randomize()函数随机时,随机出的地址,低2bit一直为0;
class test_a;
bus bus_a = new();
task bus_test;
repeat(50) begin
if(bus_a.randomize() == 1)
$display ("addr = %0h data = %h\n", bus.addr, bus.data);
else
$display ("Randomization failed.\n");
end
endtask
endclass
2、约束块的取值
A、简单表达式
在约束块中,只能使用关系操作符(<,<=,==, >=,>),一个表达式只能使用一个关系操作符。
class bus
....
constraint data_c {
data > 20;
data<100;//不能写为20<data<100,这样一个表达式就有两个关系符,
}
endclasss
等效表达式:==,表示约束的随机值取固定值,如上面的constrain addr_c,约束地址的低2bit取0
class bus
....
constraint data