uvm环境中生成随机item,通常需要加一些constraints来生成想要的随机item。近期在对transaction中的变量加约束,所以趁机小结一下。
1. inside 的使用。cmd inside {A,B,C};
2.dist 的使用。
1) src dist {0:=40,[1:3]:=60};
2)bit[31:0] w_byte=1;w_word=3,w_lwrd=5;
constraint c_len { len dist {BYTE := w_byte; WORD :=w_word; LWRD:=w_lwrd}; }
3. 对于rand bit[7:0] a;
对整个a的bit位分别加限制时,注意加()以及 要用&& 相联系。
constraint c_a {(a[3:0] inside {[4'b0:4'b1111]}) && (a[7:4] inside {4'b1000,4'b1110});}
4. 对于数组 rand bit data[$]; rand int length; 如何确定它们之间的关系的做法。
constraint val_length {length >=3;length<=8; }
constraint val_data_length {data.size()==length;}
constraint val_data {
foreach(data[i]) { data[i] inside {["a":"z"]}}
}//竟然可以用foreach
5.solve before
solve a before b。 在执行b之前先看一眼a的条件。a是用来对b进行条件判断的。
constraint c_b { if(a) b inside {[3'b0:3'b111]};}
6. cmd 类型需要typedef的定义。 typedef 还可以加值
在class外面进行typedef 来确定cmd的数量。
typedef enum {RD,WR,REQ,RSP} cmd_type;
typedef bit[1:0] enum {RD:=2'b00, WR:=2'b01,REQ:=2'b10,RSP:=2'b11} cmd_type;//这种条件下 cmd_type也可以用数值来进行约束。
class ...;
rand cmd_type cmd;
constraint c_cmd {cmd inside {RD,WR};}
endclass
7.在class里面random 变量,若在class a里面定义了rand bit test。 那么test变量执行random的时刻是class a被调用的时候,即要在调用的位置执行a.randomize()之后,test的值才会被随机,否则是默认值0,需要设一下默认值。