原创 systemverilog中struct和union的一种用法

2012-6-14 22:40 4254 12 13 分类: FPGA/CPLD

最近在学习systemverilog,没人指导,起初感觉sv对我来说没什么用处,但是慢慢地发现sv有些功能语法很不错,记下来。
虽然在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》 第二版

文章评论1条评论)

登录后参与讨论

用户421471 2012-6-26 08:25

以前看过SystemVerilog,没有详细的深入,呵呵
相关推荐阅读
用户394057 2012-09-30 15:02
为何我无法创作出自己的设计?
  我时常在想我们作为一个人最大的贡献是什么?应该是一个独一无二的我,一个有自己想法和创造的我,但是这实现起来很难,我不知道怎么实现,因为很难,或者因为周围没有人实现,或者教育没有交给我们怎么...
用户394057 2012-06-14 22:18
芯片验证时未随机化导致的bug
在最近的一个项目中,流片后发现了一个bug。 设计是通过一个三十二位的数据线写一个数据位宽为108位的ram,写三次可以写满108位,这里地址位最低两位为11是无效的。 但是实际的片子出来...
用户394057 2012-05-28 20:58
Quartus II Support for SystemVerilog
最近在看用systemverilog做verification,发现现在综合器支持部分sv的语法,可以考虑将来借鉴sv的语法做设计。   Quartus II Support for Sy...
用户394057 2012-05-23 11:00
task 和 functionM<转载>
  转载于:http://www.cnblogs.com/icelyb24/archive/2011/05/04/2036379.html   task 和 function tas...
用户394057 2012-05-21 10:34
【博客大赛】用debussy在window环境下快速查看fpga工程
本文提供了一种利用debussy快速查看fpga工程代码的方法,特别适合对刚接触大工程或ip核进行查看,以便将精力最大限度的放到逻辑上而不是在各个.v中翻来覆去的找信号。   环境:win...
我要评论
1
12
关闭 站长推荐上一条 /2 下一条