system verilog 随机约束求助
1,地址在某范围内,这个简单,addr inside [·addr_start: ·addr_end];
2,所产生的地址不能重复,
3,addr[18:6]相同的地址个数不能超过8个,因为addr[18:6]是cacheline的index,cache是8路组相联的。
这个约束应该如何写呢?随机的次数会上千次,因此要保证求解速度。
多谢!
2,用randc
3,可以定义randc bit [12:0] my_addr [8];
constraint addr_c {addr[18:6] == my_addr[0];
addr[18:6] == my_addr[1]; ...}
constraint order_c {solve my_addr before addr;}
randc bit [26:0]my_addr;constraintmy_addr_cons { my_addr[26:20] == 0;}
randbit [12:0]cacheline_index[8];
final[39:0] = {my_addr[26:6], cacheline_index[$idx], my_addr[5:0]};
大概应该这样子, 对cacheline之外的地址用randc产生排列,再把cacheline_index插进去. 我感觉这个应该是小编的意图吧?
嗯对的
在VCS中 randc 类型的变量 用在solve before 中编译不能通过
想了一个笨方法,有点繁琐。
class trans;
randc bit [39:19] AH;
rand bit [18:6] AM;
rand bit [5:0] AL;
//定义一个关联数组array来记录AM产生次数
static int array(bit [12:0]);
constraint a_range { AH>addr_start;AH<addr_end;}
//定义函数检查数据是否超过8次
virtual functionbit is_valid();
array[AM]++;
if(array[AM]>8)
return 1;
elsereturn 0;
endfunction
endclass
在gen里面调用is_valid检查有效性
class gen;
....
repeat(20000) begin
trans addr=new();
assert(addr.randomize());
while(addr.is_valid) assert(addr.randomize());
...
end
endclass