UVM 验证中Ethernet 包的随机化问题
现在做一个Ethernet包的激励,
数据数组
rand bit [7:0] data[];
constraint payload_size_c { data.size inside { [46 : 1500]};}
。
foreach(data[i])
packer.pack_field_int(data[i],8);
但data数组内涵的loop variable i 只能与data 的位宽相同,
即 8位,
不能完整的表示整个随机化的Ethernet包,
请问这个问题如何解决?
谢谢~
up...
没看懂,为什么i要和data的位宽相同?不是i的位宽能表示完data的深度就可以了么?42亿个数还不够啊?
Systemverilog 的IEEE 规范里这么表述的,
测试中确实 data 数组只有 8位宽,就是 256 的深度。
兄弟,位宽和深度是两个概念。
这个做过FIFO 的都晓得啊,
问题是 Systemverilog 的规范:
The number of loop variables must match the number of dimensions of the array variable
有没有实际做过的啊?
复制一下LRM(2012)在12.7.3的原话吧:The number of loop variables shall not be greater than the number of dimensions of the array variable.
关键点我红色高亮了。number of loop variables指循环变量的个数,例如:
foreach (a),这里只有i一个loop variable,所以个数是1.再看另一个例子:
foreach (b[i, j]),这里有两个loop variable,所以个数是2.
举个例子,在使用foreach语句时,访问一维数组不能使用两个循环变量,LRM这句话只是想说:
对于一个数组bit a[5],不能以
foreach (a [i, j])
的形式访问
谢谢回复,
不过好像这样的理解规范没必要单独指出吧,
搞验证的应该都不会明明 2维数组非要搞3个loop variable。
实际这样定义过,
data【】 的前256个元素可正确随机化,后面的通过loop variable加的约束都没有起效, 全部为0 。
你那么描述问题就好办多了。你可以把你的transaction实例化个inst,然后调用randomize()方法,之后马上foreach (inst.data) $display("%0d: %0h", i, inst.data);
里面是有数的。也许是你别的程序语句影响了。
谢谢回复,
//rand bit [7:0] data[];
rand bit [15:0] data[];
constraint data_c {foreach ( data [ i ] )data == i ; }
code 就是这样,
开始定义为8位, 只前256 个正确随机化,
后来定义成16位,就都可正确随机化了。
但因为只取了低8位, do_compare 的时候还需要处理。
这种需求不要写在constraint里,写到post_randomize里或者在上一层处理irun没办法重现你的问题,这种写法会造成constraint conflict
谢谢,
修改后测试哈。