systemverilog中struct和union的一种用法

来源:本站
导读:目前正在解读《systemverilog中struct和union的一种用法》的相关信息,《systemverilog中struct和union的一种用法》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《systemverilog中struct和union的一种用法》的详细说明。
简介:最近在学习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: %xn mon_frame's is: %xn",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: %xn mon_frame's is: %xn",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: %xn mon_frame's is: %xn",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: %xn mon_frame's is: %xn",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: %xn mon_frame's is: %xn",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: %xn mon_frame's is: %xn",dri_frame.eth.payload,mon_frame.eth.payload);

结论:通过上面的说明我们可以看到通过struct和union的配合还是能让数据处理得到不少方便的。

在《systemverilog for verification》这本书讲union的这种用法时还有不少更深入的讨论。

参考资料:《systemverilog for verification》 第二版

提醒:《systemverilog中struct和union的一种用法》最后刷新时间 2024-03-14 01:08:12,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《systemverilog中struct和union的一种用法》该内容的真实性请自行鉴别。