SV--数组队列代码练习(8/14)

练习一:

简单的数组复制,比较练习

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声明的多个变量必须要有相同的地址,否则编译器会编译失败哦!

SV--数组队列代码练习(8/14)_第1张图片

 练习五:

枚举类型应用

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() 

SV--数组队列代码练习(8/14)_第2张图片

 形式二:

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

SV--数组队列代码练习(8/14)_第3张图片

 形式三:

注意!!!

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

SV--数组队列代码练习(8/14)_第4张图片

你可能感兴趣的:(练习代码,SV,System,Verilog,代码练习)