c枚举类型enum例题_SystemVerilog数据类型
1.兩態數據類型
Verilog有兩種基本數據類型:變量(reg)和網線(wire),這是四態的數據類型(0、1、X、Z)。
RTL代碼使用變量(reg)存儲組合邏輯和時序邏輯的數值,可以是
- 標量
- 向量(reg[7:0] bus_addr)、
- 有符號數32位變量(integer)、
- 無符號數64位的變量(time)、
- 浮點數(real)
- 變量也可以用來定義一個固定大小的數組
即這些變量的存儲是靜態的,意味著所有的變量在整個仿真過程中不能使用堆棧來保存參數和當前值。
網線用來連接兩個設計模塊,如門級元件或例化模塊。
兩態(1/0)數據類型:
SystemVerilog中的兩態數據類型減少了仿真器對內存的使用和提高仿真的運行效率。
其中,bit是無符號數,shortint、int、longint、byte是有符號數。
基本數據類型
整數數據類型
兩態和有符號數據類型
例子:
bit a;//兩態,單比特
bit[31:0] b32; //兩態,32比特無符號數
Int c32; //兩,32比特有符號數
byte d8; //兩態,8比特有符號數
shortint e16;//兩態,16比特有符號數
longint 1;//兩態 ,64比特有符號數
在數據算術運算操作的過程中,需要時刻注意區分有符號(shortint、int、longint、byte、integer)和無符號數據類型。上述這些都是整型數據類型。
SystemVerilog對reg的數據類型做了改進,reg可以被連續賦值語句、門邏輯和模塊直接驅動。
SystemVerilog引入一個新的四態數據類型logic,可以替代reg;但不能用在雙向總線和多驅動的情況下,此時只能使用網線類型(wire)。
2.自定義類型
通過用戶自定義類型,簡化了verilog代碼量并實現更多功能;
用戶自定義類型使得代碼的可讀性更強;
通過typedef來創建用戶自定義類型;
通過enmu來創建枚舉類型;
通過struct來創建結構體類型;
SV提供自定義類型可以幫助用戶構建更高抽象層的數據類型;
同C語言一樣,用戶可以利用已有的數據類型定義新的數據類型,一旦定義了新的數據類型,就可以利用該類型聲明變量。
Typedef int unsigned unit;//定義新類型unit
unit a,b;//unit自定義類型unit聲明的2個變量
注意:為了代碼可讀性,通常添加“_t”后綴表示它是一個自定義類型(type),而不是比變量。
在某些時候,自定義一個新的數據類型也是必須的,因為在SystemVerilog中要通過數據類型的標識符才可以做類型轉換,如代碼所示。
用戶自定義類型實例
module test_ typedef( );
typedef enum (red, green, blue, yellow, white, black) colors ;
colors my colors;
initial
begin
$display(“my_ color’s default vaule is %s”,my_colors );
my_colors = green;
//my_ colors=l; //錯誤使用方法,需要做數據類型轉換
my_ co1ors=colors’(2); 通過colors數據類型標識符做類型轉換
$disp1ay( “my_co1or is % s” ,my_colors.name);
end
endmodul e
3.枚舉類型
枚舉類型(enum)可以描述變量的合法值范圍,其每一個值都需要提供一個用戶自定義的名字;
枚舉類型 IC可以擁有Icer1,Icer2,Icer3.....IcerN數值,
即enmu{Icer1,Icer2,Icer3.....IcerN} IC;
Verilog語言不支持枚舉類型,因此為了提供類似于枚舉類型設計方式,我們不得不采用參數來表示可取值的范圍,或者使用宏來定義各個合法值的宏名稱。
使用宏定義和參數
使用枚舉類型
定義枚舉值
默認的枚舉類型是int,即32位的二值邏輯數據類型;
為了更準確的描述變量,SV允許指明其數據類型,例如:
enum bit {TRUE,FALSE} Boolean;
enum logic [1:0] {WAITE,LOAD,READY} state;
自定義枚舉類型
如果枚舉類型變量被賦值,那么所賦的值應在其數值范圍。
Enum logic {2:0} {WAITE=3’b001,LOAD=3’b010,READY=3’b100} state;
如果枚舉變量是四值邏輯,那么將其值賦為X或者Z也是合法;
enum logic {ON=1’b1,OFF=1’b z} out;
如果枚舉類型并沒有伴隨著typedef,那么該枚舉類型指的是匿名枚舉類型;此時變量名應伴隨其后;
將typedef與enum合并,可以將匿名枚舉類型聲明為自定義類型,這就使得可以用同一個枚舉類型來聲明多個變量或者線網;
typedef enum {WAITE,LOAD,READY} states_t;
States_t state,next_state;
verilog或者SV可以在不同的數據類型之間通過隱性轉換,進行直接賦值,因此verilog/SV的數據類型轉換是寬松的;
枚舉類型賦值
枚舉類型賦值時則相對嚴格,例如下面的例子中,賦值操作符“-”的左右兩側應該盡量為相同的枚舉類型。
Typedef enum {WAITE, LOAD, READY} states_t;
states_t state, next_State ;
int foo;
state = next_state; //合法操作
foo=state+1;//合法操作
state=foo+1;//非法賦值
state = states_t’ (foo + 1) ;//合法賦值
state = state + 1; //非法賦值
state= states_t’ (state + 1) //合法賦值
state++; // 非法賦值
next_state += state; //非法賦值
SystemVerilog為枚舉類型提供了如下內置方法( method)來方便操作
function enum first ():返回枚舉類型中第一個成員的值。
Function enum last ():返回枚舉類型中最后一個成員的值。
Function enum next ( int unsigned N=1):
以當前成員為起點,返回后續第N個成員的值,默認是下一個成員的值;若起點為最后一個成員,則默認返回第一個成員的值。
Function enum prev ( int unsigned N=1):
以當前成員為起點,返回前面第N個成員的值,默認是前面一個成員;若起點為第一個成員,則默認返回最后一個成員的值。
Function int num ():返回該枚舉類型的成員數目。
Function string name ():以字符串的形式返回該成員名字。
4.結構體類型
SV添加了和C一樣的結構體struct,而結構體成員可以是任何變量類型,包括自定義類型或者其他常量類型;
Struct{
Int a,b;//32位變量
Opcode_t opcode;//用戶自定義類型
logic [23:0] address;//24位變量
Bit error;//1位變量
}Instruction_Word;//變量名
結構體類型的變量可以用來索引到其內部的變量,索引方式同C一樣。
<structure_name>.<variable_name>
Instruction_Word.address=32’hF000001E;
結構體類型默認也是變量類型,用戶可以顯式聲明為var或者wire類型;
類似與于枚舉類型,結構體類型也可以伴隨著typedef來實現自定義結構體類型;
Typedef struct { //自定義結構體
logic [31:0] a,b;
Logic [7:0] opcode;
Logic [23:0] address;
}instruction_word_t IW;// 結構體變量聲明
結構體變量可以通過索引其各個成員做依次的成員賦值:
Always @(posedge clk or negedge rst_n)begin
If(!rst_n)begin
IW.a=100;//結構體成員
IW.b=5;
IW.address=0;
End
else begin
......
end
end
也可以通過分號’ 和花括號{}來實現整體賦初值;
IW=’ {100,3,8’hFF,0};
IW=’ {addres:0,opcode:8’hFF,a:100,b:5}; //成員和數值通過冒號:一一對應。
5.字符串類型
SV中引入string類型來容納可變長度的字符串;
字符串類型變量的存儲單元為byte類型;
字符串類型變量長度為N,則字符成員索引值從0到N-1;
不同與C語言,字符串結尾沒有空字符 “0”;
字符串的內存是動態分配的,用戶無需擔心內存空間管理;
字符串內建方法:
str..len():返回字符串長度
str.putc(I,c):將第i個字符替換為字符c,等同于str[i]=c;
str.getc(i): 返回第i個字符;
str.substr(i,j): 返回第i個字符到第j個字符的字符串
str.tolower():返回一個小寫字符串;
str.toupper(): 返回一個大寫字符串;
str.{atoi(),atohex(),atooct(),atobin()}:返回十進制、十六進制、八進制、二進制數據;
總結
以上是生活随笔為你收集整理的c枚举类型enum例题_SystemVerilog数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cpuz北桥频率和内存频率_内存频率怎样
- 下一篇: 医疗保险个人首次怎么交?