transaction 中constraint的用法小结

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,需要设一下默认值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值