SystemVerilog随机化约束的问题
rand bit [31:0] addr[4];
constraint c_addr {}
endclass
如上例子中要随机产生4个地址,
要求:
1> 4个地址不相等;
2> 4个地址的bit[31:10]要相等;
请教满足上面两个条件的约束应该怎么写?
{
(addr[0][31:10]== addr[1][31:10] )&&
(addr[1][31:10]== addr[2][31:10] ) &&
(addr[2][31:10]== addr[3][31:10] )&&
(addr[0][31:0]!== addr[1][31:0] )&&
(addr[0][31:0]!== addr[2][31:0] ) &&
(addr[0][31:0]!== addr[3][31:0] )&&
(addr[1][31:0]!== addr[2][31:0] )&&
(addr[1][31:0]!== addr[3][31:0] ) &&
(addr[2][31:0]!== addr[3][31:0] )
}应该可以吧
constraint c_addr {
foreach(addr[i])
foreach(addr[j])
if(i != j)
{
addr[i][31:10] == addr[j][31:10];
addr[i][9:0]!= addr[j][9:0];
}
}
upup!
牛人啊,顶一个
i don't know
upupup
foreach语句嵌套可能会出现问题,用for语句应该会安全很多。ps:初学者,见解如有错误轻拍~
constraint不支持for语句。
2#和3#都是正解!
2#的比较直观,不具有通用性,如果我的数组变大了或者干脆是个动态数组,2#的就不行了;
3#比较好;
systemverilog的constraint可以非常复杂,这些简单的约束很easy,书上说constraint的可以约束到求出8皇后问题,其实constraint有了对foreach和if else结构的支持,基本上99%的约束都可以满足!
膜拜3楼
为什么不建成两部分。分别生成?是不是效率会更高一点?
四个地址不相等不要在constraint里面约束,直接用randc命令, 每次random出来的值就都一样了;
dfsdfasdf
3楼正解。论坛里还是有葱的哈。
同意2楼,不过把addr[9:0]改成randc类型的就更简单了
我觉得3楼写的比较好
这个怎么写?能否写出来看一下?
我只想出来这种,randc bit [3:0] addr[4];
constraint c_addr {
foreach(addr)foreach(addr[j])
if(i!=j)
addr[31:10] == addr[j][31:10];
}
如果按这种写法,和3楼的就查不多了。
这个方法好。
请教一个问题啊,在进行帧结构设计的时候,里面的随机变量如附件图中所示。现在想进行约束,
每发完一帧,就把 oh_mfas_r1 加一,当发完第255帧计数到255后,再把oh_mfas_r1置零,
重新再发帧数据逐渐加一运算。请问这个该怎么约束?谢谢了。
帧结构设计图
constraint c1_addr { addr[0][31:10] == addr[1][31:10];
addr[1][31:10] == addr[2][31:10];
addr[0][9:0] != addr[1][9:0]; ....6ge;}
好像不能对一个数据的某些bit 进行约束吧,你可以试试他们的说法
不一定要局限于约束,完全可以post_randomize来做
牛
学习一下。
真是學習到了
enenen,不错!
为啥不能高位是一个数低位是四个数呢,问题就被分解了也不用那么麻烦。
醍醐灌顶啊