OVM验证的一个问题
包长度在【64:1518】随机变化,
再约束包的数据内容为增量,
rand bit [7:0] data[];
constraint payload_size_c { data.size inside { [64 : 1518]};}
constraint length_c {length == data.size; }
constraint data_c {foreach ( data [ i ] ) data[i] == i ; }
现在的问题是:
仿真时,如果data 动态数组的长度上限为260左右时,仿真结果正确,
超过260. 则经常出现所有的rand 类型的变量都为0 ,
感觉是对包的长度的约束和内容的约束有冲突,
不能同时设置,
请问有遇到这个问题的同学吗?
问题应该出在这句上:
constraint data_c {foreach ( data [ i ] ) data[i] == i ; }
改成:
constraint data_c {foreach ( data [ i ] ) data[i] == i %256 ; }
就可以了吧。
应为 “==" 约束是双向的,如果i 大于256的话,就会超出bit [7:0] 所能表达的范围,造成
data_c 无解,就会产生错误。
谢谢回复,
我测试一下。
测试了,
还是有问题,
估计不是因为这个的缘故,
rand bit [7:0] data [];
bit[7:0] 是数组的 packed 的部分,
而 constraint data_c {foreach ( data [ i ] ) data == i; } 约束的是 data 数组的 unpacked 的部分 data [];
将其改为 rand byte data [] ;
也还是一样,
可能是多重约束的运行时间的冲突,
因为不是所有包的都有问题,
超过260以后 2个正确包中间会夹杂几个包长和内容都为0的包
呵呵,你改成rand bit [15:0] data [] ;试试。
我用vcs验证过的,或许是你的仿真软件的问题,或许是ovm本身的问题,或许是我错了,呵呵。
谢谢,
改成rand bit [15:0] data [] 确实没有rand 变量初始化为0的问题了,
不过 这会不会影响 do_pack 呢?
修改原来的约束constraint data_c {foreach ( data [ i ] ) data == (i % 256); }为什么没有效果呢?
我考虑了一下:
有可能是 constraint data_c {foreach ( data [ i ] ) data[i] == (i % 256); }
默认I为 byte 类型,
当动态数组的上限超过256后,
导致I值为非法,
所以数组值初始化为0
欢迎讨论。
上班能用qq吗?站内告诉我qq号,我加你:)
公司把QQ和很多端口都封了,
估计只能帖子里讨论或者站短了。
我在查 foreach 的语法,看其自动变量 i 的默认取值是不是这个问题的原因。
学习了!
The type of each loop
variable is implicitly declared to be consistent with the type of array index.
那请问是否可以在约束时将 loop variable 强制转换类型?
constraint data_c {foreach ( data [ i ] )data == int' (i) ; }
i本身就是int型,就不用强制转换了吧。