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;//直接定义结构类型变量,即不出现结构体名。
说明:
但常常用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结构体分为非压缩结构体和压缩结构体
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}; //结构体类型的赋值
说明:
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、枚举类型同样与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
说明:
这两个函数就是整理字符串的格式,按照函数里给的格式,把相应的变量填进去。
$sformat和$sformat的不同点: