(三)SV结构体、枚举类型、字符串

一、结构体(struct)

1、SV结构体与C语言中结构体对应

struct student{ 
  int  num;
  char name[20];
  char sex;
};
struct student student1, student2;//先声明结构体类型再定义变量名,结构体定义变量

struct student{ 
  int  num;
  char name[20];
  char sex;
}student1, student2;//在声明类型的同时定义变量

struct 
{ 
  int  num;
  char name[20];
  char sex;
}student1, student2;//直接定义结构类型变量,即不出现结构体名。

说明:

  • student:结构体类型名,可以忽略不写的
  • student1, student2:结构体变量名
  • 内部的变量:成员变量名

 但常常用typedef来新定义类型,就是对其他类型取别名,方便定义变量,例如:

 typedef struct {bit [7:0] r, g, b;} pixel_s1;//pixel_s就是对struct {bit [7:0] r, g, b;}的别名

 typedef struct packed {bit [7:0] r, g, b;} pixel_s2;//压缩结构体

2、SV结构体分为非压缩结构体和压缩结构体

  • pixel_s1为非压缩结构体,pixel_s2为压缩结构体这与非合并数组、合并数组对应,他们在内存中存储方式不同,pixel_s1占用3(8bit)段不连续的存储空间(共24bit)(左图),pixel_s2占用1(24bit)段连续的存储空间(共24bit)(右图);
  • (三)SV结构体、枚举类型、字符串_第1张图片
typedef struct {
    bit [7:0] r;
    bit [7:0] g;
    bit [7:0] b;
} pixel_s;
pixel_s my_pixel; // 声明变量
    my_pixel = '{'h10, 'h10, 'h10}; //结构体类型的赋值
typedef struct packed{
    bit [7:0] r;
    bit [7:0] g;
    bit [7:0] b;
} pixel_s;
pixel_s my_pixel; // 声明变量
my_pixel = {8'h10, 8'h10, 8'h10}; //结构体类型的赋值
my_pixel = '{8'h10, 8'h10, 8'h10}; //结构体类型的赋值

说明:

  1. 上面代码,结构体赋值带单引号和不带单引号区别
  • 单引号作用:告诉后面的逗号把后面的值分成三部分赋值给结构体变量,无单引号为拼接符,若赋值时不写位宽,默认是32bit位宽,可能使赋值结果出现为0;压缩结构体复制与非压缩结构体赋值也有些区别

3、联合结构体

typedef struct packed{
	bit [7:0] r;
	bit [7:0] g;
	bit [7:0] b;
}pixel_rgb_t;

typedef struct packed{
	bit [15:0] y;
	bit [ 3:0] u;
	bit [ 3:0] v;
}pixel_yuv_t;

typedef union packed{
	pixel_rgb_t rgb;
	pixel_yuv_t yuv;
}pixel_t;

module test10;

	pixel_t     pixel_test	  ;
	pixel_rgb_t pixel_rgb_test;
	pixel_yuv_t pixel_yuv_test;
	
	initial begin
		
		pixel_rgb_test.r = 8'h88;
		pixel_rgb_test.g = 8'h99;
		pixel_rgb_test.b = 8'haa;
		$display("Color RGB is: R=%h G=%h B=%h ",
					pixel_rgb_test.r,pixel_rgb_test.g,pixel_rgb_test.b);
		pixel_yuv_test.y = 16'h88;
		pixel_yuv_test.u = 4'h9  ;
		pixel_yuv_test.v = 4'ha	 ;
		$display("Color YUV is: Y=%h U=%h V=%h ",
					pixel_yuv_test.y,pixel_yuv_test.u,pixel_yuv_test.v);
		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'hBB;
		pixel_test.rgb.g = 8'hCC;
		pixel_test.rgb.b = 8'hDD;
		$display("Color YUV is: Y=%h U=%h V=%h ",
					pixel_test.yuv.y,pixel_test.yuv.u,pixel_test.yuv.v);		
		#100
		$finish;
		
	end
endmodule

说明:

  • 1、联合结构体关键字为union。
  • 2、联合结构体中每个结构体的总位宽要保持一致。
  • 3、联合结构体中的每个结构体共用每个bit位,只是解析方式不同

二、枚举类型(enum)

1、枚举类型同样与C语言中的对应,也具有上面结构那样的定义方式,默认值从0,1,2,n

同样经常用typedef来新定义枚举类型,例如:

typedef enum {INIT, DECODE, IDLE} fsmstate_e;
fsmstate_e pstate, nstate;  // 声明自定义类型变量

$display("Next state is %s", nstate.name()); // 显示状态名

.name()函数打印结果就是上述定义的INIT、DECODE,、IDLE

三、字符串(string)

1、字符串用string来定义声明

module test10;

	string s;
	initial begin
		s = "IEEE ";						
		$display(s.getc(0));               // 显示‘I’的ASCII码, 73. 
		$display("%s",s.getc(0));          // 显示‘I’ 
		$display(s.tolower());             // 显示 ieee 
		s.putc(s.len()-1,"-");             // 将空格变为‘-’ 
		s = {s,"P1800"};                   // "IEEE-P1800" 
		$display(s);                       // 显示 "IEEE-P1800"EE-P 
		$display(s.substr(2,5));           // 显示 EE-P  
		my_log($sformatf("%s %0d",s, 42)); // 创建一个临时字符串并将其打印 ,设置占用位宽为0
	end                                    
	
	task my_log(string message);
		$display("@%0t: %s",$time,message);// 打印消息
	endtask

endmodule

说明:

(三)SV结构体、枚举类型、字符串_第2张图片

 

这两个函数就是整理字符串的格式,按照函数里给的格式,把相应的变量填进去。
$sformat和$sformat的不同点:

  • 1、$sformat()比s$stormatf()多了第一个参数,第一个参数就是放整理好的字符串的容器。$sformat()会直接把整理好的字符串放到第一个字符串类型的参数中。
  • 2、$sformatf()没有$sformat()第一个参数。$sformatf()返回的值就是整理好的字符串。
  • 3、$sprintf()函数与$sformatf()函数类似;

你可能感兴趣的:(SV学习,c++,c语言,数据结构,fpga开发,stm32)