一、结构体(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)(右图);
-
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}; //结构体类型的赋值
说明:
- 上面代码,结构体赋值带单引号和不带单引号区别
- 单引号作用:告诉后面的逗号把后面的值分成三部分赋值给结构体变量,无单引号为拼接符,若赋值时不写位宽,默认是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
说明:
文章来源:https://www.toymoban.com/news/detail-615776.html
这两个函数就是整理字符串的格式,按照函数里给的格式,把相应的变量填进去。
$sformat和$sformat的不同点:文章来源地址https://www.toymoban.com/news/detail-615776.html
- 1、$sformat()比s$stormatf()多了第一个参数,第一个参数就是放整理好的字符串的容器。$sformat()会直接把整理好的字符串放到第一个字符串类型的参数中。
- 2、$sformatf()没有$sformat()第一个参数。$sformatf()返回的值就是整理好的字符串。
- 3、$sprintf()函数与$sformatf()函数类似;
到了这里,关于(三)SV结构体、枚举类型、字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!