练习一:
简单的数组复制,比较练习
- module array_compare();
- bit [31:0] src[5]={0,1,2,3,4},
- dst[5]={5,4,3,2,1};
- if(src==dst)
- $display("src==dst");
- else
- $display("src!=dst");
- dst=src;
- src[0]=5;
- $display("src %s dst",(src==dst)?"==":"!=");
- $display("src[1:4] %s dst[1:4]",(src[1:4]==dst[1:4]?"==":"!=");
- endmodule
仿真结果:

练习二:
利用foreach循环比较数组
- module array_compare1();
- bit [31:0] src[5]={0,1,2,3,4},
- dst[5]={5,4,3,2,1};
- dst=src;
- src[0]=5;
- foreach(dst[i]) begin
- if(dst[i]==src[i])
- $display("src[%d]==dst[%d]",i,i);
- else
- $display("src[%d]!=dst[%d]",i,i);
- end
- endmodule
仿真结果:

练习三:
压缩结构体与非压缩结构体的赋值特点
- module pixel_array();
- typedef struct{
- bit [7:0] r;
- bit [7:0] g;
- bit [7:0] b;
- } pixel_s; //非压缩结构体
-
- typedef struct packed{
- bit [7:0] r;
- bit [7:0] g;
- bit [7:0] b;
- } pixel_t; //压缩结构体
-
- pixel_s my_pixel;
- pixel_t my_pixel1;
-
- initial begin
- my_pixel = '{'h10,'h10,'h10};
- my_pixel1 = {'h10,'h10,'h10};
- $display(my_pixel);
- $display(my_pixel1);
- my_pixel = '{8'h10,8'h10,8'h10};
- my_pixel1 = {8'h10,8'h10,8'h10};
- $display(my_pixel);
- $display(my_pixel1);
- end
- endmodule
仿真结果:

练习四:
联合结构体的应用
- module union_pixel();
- typedef struct packed{
- bit [7:0] r;
- bit [7:0] g;
- bit [7:0] b;
- } pixel_rgb_t;
-
- typedef struct packed{
- bit [7:0] y;
- bit [7:0] u;
- bit [7:0] v;
- } pixel_yuv_t;
-
- typedef union packed{
- pixel_rgb_t rgb;
- pixel_yuv_t yuv;
- } pixel_t;
-
- pixel_t pixel_test;
-
- initial begin
- pixel_test = 0;
- $display("color RGB is: R=%h, G=%h, B=%h",
- pixel_test.rgb.r,pixel_test.rgb.g,pixel_test.rgb.b);
- $display("color YUV is: Y=%h, U=%h, V=%h",
- pixel_test.yuv.y,pixel_test.yuv.u,pixel_test.yuv.v);
-
- pixel_test.rgb.r=8'hab;
- pixel_test.rgb.g=8'hcd;
- pixel_test.rgb.b=8'hef;
- $display("color YUV is: Y=%h, U=%h, V=%h",
- pixel_test.yuv.y,pixel_test.yuv.u,pixel_test.yuv.v);
- end
- endmodule
仿真结果:

知识点补充:
联合结构体简单的说,就是在结构体定义内部,不论什么数据,这些数据共享同一段内存,以达到节省空间的目的。
如上所示,union_pixel声明中包含了两个具有不同变量的packed struct,从上面代码中我们可以发现,只要改变union_pixel 中的任意一个变量,另一个变量与之相对应的地址也将发生相同的变化,所以这也引出了union_pixel声明的多个变量必须要有相同的地址,否则编译器会编译失败哦!

练习五:
枚举类型应用
- typedef enum {GREEN=1,YELLOW,RED=10,BLUE} colors;
- typedef enum {GREEN=1,YELLOW,RED,BLUE=3} colors;
- typedef enum {GREEN,YELLOW,RED,BLUE} colors;
- module top_tb;
- initial begin
- colors color;
- color=YELLOW;
- color=10;
- $display("color.first()=%0d",color.first());
- $display("color.last()=%0d",color.last());
- $display("color.next()=%0d",color.next());
- $display("color.prev()=%0d",color.prev());
- $display("color.num()=%0d",color.num());
- $display("color.name()=%0d",color.name());
- end
- endmodule
形式一:
typedef enum {GREEN,YELLOW,RED,BLUE} colors;
默认GREEN=0,YELLOW=1,RED=2,BLUE=3
color.first() first method:function int first(ref index);color第一个index
color.last() last method:function int last(ref index); color最后一个index
color.next() next method:function int next(ref index);color给定index的下一个index
color.prev() prev method:function int prev(ref index);color给定index的前一个index
color.num() num method: function int num(); color 数目
color.name()

形式二:
enum 定义变量的同时也可以赋值index,在索引的过程中可以直接使用index索引

形式三:
注意!!!
enum在定义过程中使用index时保证不能重复,如下GREEN=1,默认YELLOW=2,RED=3,但是,BLUE被自定义为3,所以编译过程中会报error。
