虽然在sv中这都是很常用的东西,但是希望记下来让刚学sv的同行看到也可能会有一点点收获。
在我们做以太网回环测试平台的时候,怎样将以太网帧中的不同部分分离提取?因为对于仿真平台来说他希望看到的是数据,而不希望是诸如一块mem的变量,在verilog中很难做到这点,但是sv中利用压缩数组和压缩struct放进union中可以做到这一点:
typedef struct packed{
bit [55:0] preamble ;
bit [7:0] SDF ;
bit [47:0] DA ;
bit [47:0] SA ;
bit [15:0] len;
bit [511:0] payload ;
bit [31:0] FSC ;
} eth_frame;
typedef union packed{
eth_frame eth;
bit [0:179] [3:0] Mem;
}EthCellType;
如上面的代码设计,将一个叫mem的压缩数组和一个定义为eth_frame的以太网帧的压缩数据结构,由于压缩的数据变量存储空间是连续的,所以可以实现用不同格式对同一存储空间进行读写。
比如说在driver模块,这里只向mac核中送入数据,他看到的只是数据流而不是数据的内容,这里就可以用Mem送入数据(百兆mac的mii口数据位宽正好是4)。
top_class_based.Rxd[3:0] = input_pkg.Mem[1];
对于数据产生模块就可以通过eth_frame结构来生成以太网帧不同部分的数据。
pkg_temp.eth.preamble = premable;
pkg_temp.eth.SDF = SDF;
pkg_temp.eth.DA = DA;
pkg_temp.eth.SA = SA;
pkg_temp.eth.len = len;
pkg_temp.eth.payload = payload;
pkg_temp.eth.FSC = FSC;
同时对于计分板模块来说也可以通过eth_frame结构来更细致的比较输入输出数据不同部分的差别,这样比较是更加精细灵活的。
$display("score_board work id is %d,error!",i++);
if(dri_frame.eth.preamble != mon_frame.eth.preamble)
$display("preamble is not compatible: \n dri_frame's is: %x\n mon_frame's is: %x\n",dri_frame.eth.preamble,mon_frame.eth.preamble);
if(dri_frame.eth.SDF != mon_frame.eth.SDF)
$display("SDF is not compatible: \n dri_frame's is: %x\n mon_frame's is: %x\n",dri_frame.eth.SDF,mon_frame.eth.SDF);
if(dri_frame.eth.DA != mon_frame.eth.DA)
$display("DA is not compatible: \n dri_frame's is: %x\n mon_frame's is: %x\n",dri_frame.eth.DA,mon_frame.eth.DA);
if(dri_frame.eth.SA != mon_frame.eth.SA)
$display("SA is not compatible: \n dri_frame's is: %x\n mon_frame's is: %x\n",dri_frame.eth.SA,mon_frame.eth.SA);
if(dri_frame.eth.len != mon_frame.eth.len)
$display("len is not compatible: \n dri_frame's is: %x\n mon_frame's is: %x\n",dri_frame.eth.len,mon_frame.eth.len);
if(dri_frame.eth.payload != mon_frame.eth.payload)
$display("payload is not compatible: \n dri_frame's is: %x\n mon_frame's is: %x\n",dri_frame.eth.payload,mon_frame.eth.payload);
结论:通过上面的说明我们可以看到通过struct和union的配合还是能让数据处理得到不少方便的。
在《systemverilog for verification》这本书讲union的这种用法时还有不少更深入的讨论。
参考资料:《systemverilog for verification》 第二版