练习一:
简单的数组复制,比较练习
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。