一、結(jié)構(gòu)體(struct)
1、SV結(jié)構(gòu)體與C語言中結(jié)構(gòu)體對應(yīng)
struct student{
int num;
char name[20];
char sex;
};
struct student student1, student2;//先聲明結(jié)構(gòu)體類型再定義變量名,結(jié)構(gòu)體定義變量
struct student{
int num;
char name[20];
char sex;
}student1, student2;//在聲明類型的同時定義變量
struct
{
int num;
char name[20];
char sex;
}student1, student2;//直接定義結(jié)構(gòu)類型變量,即不出現(xiàn)結(jié)構(gòu)體名。
說明:
- student:結(jié)構(gòu)體類型名,可以忽略不寫的
- student1, student2:結(jié)構(gòu)體變量名
- 內(nèi)部的變量:成員變量名
?但常常用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;//壓縮結(jié)構(gòu)體
2、SV結(jié)構(gòu)體分為非壓縮結(jié)構(gòu)體和壓縮結(jié)構(gòu)體
- pixel_s1為非壓縮結(jié)構(gòu)體,pixel_s2為壓縮結(jié)構(gòu)體這與非合并數(shù)組、合并數(shù)組對應(yīng),他們在內(nèi)存中存儲方式不同,pixel_s1占用3(8bit)段不連續(xù)的存儲空間(共24bit)(左圖),pixel_s2占用1(24bit)段連續(xù)的存儲空間(共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}; //結(jié)構(gòu)體類型的賦值
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}; //結(jié)構(gòu)體類型的賦值
my_pixel = '{8'h10, 8'h10, 8'h10}; //結(jié)構(gòu)體類型的賦值
說明:
- 上面代碼,結(jié)構(gòu)體賦值帶單引號和不帶單引號區(qū)別
- 單引號作用:告訴后面的逗號把后面的值分成三部分賦值給結(jié)構(gòu)體變量,無單引號為拼接符,若賦值時不寫位寬,默認(rèn)是32bit位寬,可能使賦值結(jié)果出現(xiàn)為0;壓縮結(jié)構(gòu)體復(fù)制與非壓縮結(jié)構(gòu)體賦值也有些區(qū)別
3、聯(lián)合結(jié)構(gòu)體
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、聯(lián)合結(jié)構(gòu)體關(guān)鍵字為union。
- 2、聯(lián)合結(jié)構(gòu)體中每個結(jié)構(gòu)體的總位寬要保持一致。
- 3、聯(lián)合結(jié)構(gòu)體中的每個結(jié)構(gòu)體共用每個bit位,只是解析方式不同。
二、枚舉類型(enum)
1、枚舉類型同樣與C語言中的對應(yīng),也具有上面結(jié)構(gòu)那樣的定義方式,默認(rèn)值從0,1,2,n;
同樣經(jīng)常用typedef來新定義枚舉類型,例如:
typedef enum {INIT, DECODE, IDLE} fsmstate_e;
fsmstate_e pstate, nstate;? // 聲明自定義類型變量
$display("Next state is %s", nstate.name()); // 顯示狀態(tài)名
.name()函數(shù)打印結(jié)果就是上述定義的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,"-"); // 將空格變?yōu)椤?’
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)); // 創(chuàng)建一個臨時字符串并將其打印 ,設(shè)置占用位寬為0
end
task my_log(string message);
$display("@%0t: %s",$time,message);// 打印消息
endtask
endmodule
說明:
?文章來源:http://www.zghlxwxcb.cn/news/detail-615776.html
這兩個函數(shù)就是整理字符串的格式,按照函數(shù)里給的格式,把相應(yīng)的變量填進(jìn)去。
$sformat和$sformat的不同點:文章來源地址http://www.zghlxwxcb.cn/news/detail-615776.html
- 1、$sformat()比s$stormatf()多了第一個參數(shù),第一個參數(shù)就是放整理好的字符串的容器。$sformat()會直接把整理好的字符串放到第一個字符串類型的參數(shù)中。
- 2、$sformatf()沒有$sformat()第一個參數(shù)。$sformatf()返回的值就是整理好的字符串。
- 3、$sprintf()函數(shù)與$sformatf()函數(shù)類似;
到了這里,關(guān)于(三)SV結(jié)構(gòu)體、枚舉類型、字符串的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!