SystemVerilog硬件設(shè)計及建模—第34章-PPT課件_第1頁
SystemVerilog硬件設(shè)計及建模—第34章-PPT課件_第2頁
SystemVerilog硬件設(shè)計及建模—第34章-PPT課件_第3頁
SystemVerilog硬件設(shè)計及建模—第34章-PPT課件_第4頁
SystemVerilog硬件設(shè)計及建模—第34章-PPT課件_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 增強(qiáng)的文本值 改進(jìn)的define文本替換時間值新的變量類型有符號和無符號類型靜態(tài)和動態(tài)變量類型轉(zhuǎn)換常數(shù)第3章 SystemVerilog文本值和數(shù)據(jù)類型3.1 增強(qiáng)的文本賦值 Verilog中的向量賦值: parameter SIZE = 64; reg SIZE 1 : 0 data; data = 0; /將數(shù)據(jù)各位置0 data = bz; /將數(shù)據(jù)各位置z data = bx; /將數(shù)據(jù)各位置x 但如何給data賦全1的值? data = 64hFFFFFFFFFFFFFFFF; /不可擴(kuò)展,如果 / SIZE改為128呢? data = 0; /1的補(bǔ)碼 data = -1; /2

2、的補(bǔ)碼3.1 增強(qiáng)的文本賦值 SystemVerilog在向量賦值的增強(qiáng): 1. 可以只指定要賦的值,不用指定進(jìn)制 2. 賦值可以是邏輯1,該語法指定所有位所賦的值 parameter SIZE = 64; reg SIZE 1 : 0 data; data = 0; /將數(shù)據(jù)各位置0 data = 1; data = z; /將數(shù)據(jù)各位置z data = x; /將數(shù)據(jù)各位置x3.2 define增強(qiáng) Verilog允許在define宏中使用雙引號,但是雙引號內(nèi)的文本變成了文本串,即在verilog中不能采用在字符串中嵌入宏變量的文本替換宏創(chuàng)建字符串 define print(v) $dis

3、play(“variable v = %h”, v) print(data); / $display(“variable v = %h”, data); SystemVerilog允許字符串內(nèi)的宏變量替換! define print(v) $display(“variable v = %h”, v) print(data); / $display(“variable data = %h”, data);3.2 define增強(qiáng) SystemVerilog允許在包含變量替換的宏文本字符串中使用隔離引號,SV中如何通過宏定義實現(xiàn)下面與Verilog相同功能的語句? $display(“variab

4、le ”data” = %h”, data); define print(v) $display(“variable ”v” = %h”, v) print(data); $display(“variable ”data” = %h”, data);3.2 define增強(qiáng) SystemVerilog可以提供了一個不引入空格的方法,通過使用兩個連續(xù)的重音符號,使兩個或多個文本宏連接成一個新名字 bit d00_bit; wand d00_net = d00_bit; bit d01_bit; wand d01_net = d01_bit; . bit d62_bit; wand d62_net

5、 = d62_bit; bit d63_bit; wand d63_net = d63_bit; define TWO_STATE_NET(name) bit name_bit; wand name_net = name_bit; TWO_STATE_NET(d00);3.3 SystemVerilog變量 對象類型和數(shù)據(jù)類型SystemVerilog四態(tài)變量SystemVerilog兩態(tài)變量顯式及隱式變量和線網(wǎng)類型綜合指導(dǎo)3.3.1 對象類型和數(shù)據(jù)類型 對象類型指明信號是變量還是線網(wǎng);數(shù)據(jù)類型指明變量或線網(wǎng)的值系統(tǒng):兩態(tài)數(shù)據(jù)類型或四態(tài)數(shù)據(jù)類型 Verilog數(shù)據(jù)類型:變量:integer,

6、reg, time線網(wǎng):wire, wor, wand SystemVerilog數(shù)據(jù)類型:包含了所有的Verilog數(shù)據(jù)類型增加了一些新數(shù)據(jù)類型:byte, int, logic3.3.2 SystemVerilog四態(tài)變量 SystemVerilog用logic關(guān)鍵字描述通用的針對硬件的數(shù)據(jù)類型,logic數(shù)據(jù)類型變量與Verilog中的reg類型是大多數(shù)情況下可以互換使用 logic類型變量聲明: logic resetN; /一位四態(tài)變量 logic 63 : 0 data; /64位寬變量 logic 0 : 7 array 0 : 255; /8位數(shù)組變量 顯式變量或線網(wǎng)聲明: v

7、ar logic 63 : 0 addr; /64位寬變量 wire logic 63 : 0 addr; /64位寬線網(wǎng)Why logic?3.3.3 SystemVerilog兩態(tài)變量 適合于更高抽象層次建模,如系統(tǒng)級和交易級 bit1位兩態(tài)整數(shù) byte8位兩態(tài)整數(shù),與C語言的char類似 shortint16位兩態(tài)整數(shù),與C語言的short類似 int32位兩態(tài)整數(shù),與C語言的int類似 longint64位兩態(tài)整數(shù),與C語言的long類似 bit resetN; bit 63 : 0 data; bit 0 : 7 array 0 : 255; var bit 63 : 0 addr

8、;3.3.3 SystemVerilog兩態(tài)變量 類似C語言類型優(yōu)點:類似C語言的兩態(tài)類型如int和byte,主要用來描述更抽象的總線功能模型,不需要描述硬件細(xì)節(jié),如三態(tài)總線及可能產(chǎn)生邏輯值X的硬件沖突易于使用SystemVerilog的直接編程接口(DPI),建立Verilog到C或C+的接口,因為數(shù)據(jù)類型相同,所以數(shù)據(jù)在兩語言間的傳遞更簡單有效 for 語句中的循環(huán)變量,綜合后就消失了,int類型是一個很好的選擇3.3.4 顯式及隱式變量和線網(wǎng)類型 聲明語句中,數(shù)據(jù)類型前沒有顯式指定對象類型時,則推斷為隱式變量 logic 7 : 0 busA; bit 31 : 0 busB; var

9、logic 7 : 0 ; var bit 31 : 0 b; typedef enum bit FALSE, TRUE bool_t; var bool_t c; var 7 : 0 d; /四態(tài)8位變量 wire 31 : 0 busB; /隱含為四態(tài)邏輯數(shù)據(jù)類型 wire logic 31 : 0 busC; 兩態(tài)線網(wǎng)問題 wire reg 31 : 0 busD;3.4 RTL中使用兩態(tài)類型 SystemVerilog新增加的兩態(tài)類型可以用于設(shè)計抽象建模,這種情況下很少用到三態(tài)值,可能導(dǎo)致不確定值或不可預(yù)測值(X)的電路不會出現(xiàn)。 SystemVerilog允許給一個兩態(tài)類型賦四態(tài)值,

10、其映射關(guān)系如下:四態(tài)值轉(zhuǎn)換為0011Z0X03.4.1 兩態(tài)類型和四態(tài)類型仿真1. 兩態(tài)模式仿真器:軟件工具在設(shè)計模型不需要使用邏輯Z和X時提供的仿真模式,提高仿真速度2. 多數(shù)兩態(tài)模式仿真器通常不能使用兩態(tài)與四態(tài)混合仿真3. 不同兩態(tài)模式仿真器將Z和X映射到兩態(tài)類型時可能不同,導(dǎo)致仿真結(jié)果不同4. 兩態(tài)仿真模式對casez和casex解釋不同,從而導(dǎo)致仿真結(jié)果不同5. SystemVerilog中標(biāo)準(zhǔn)兩態(tài)類型為所有軟件工具提供相同的行為,同時,四態(tài)到兩態(tài)的映射也是標(biāo)準(zhǔn)化的,因此所有軟件工具仿真結(jié)果也是一致的3.4.2 case語句中使用兩態(tài)類型缺省賦值兩個優(yōu)點:其一是綜合會將條件選擇項的譯碼

11、邏輯進(jìn)行優(yōu)化,不會考慮缺省分支條件表達(dá)的值如何譯碼;其二是缺省X賦值有助于檢測RTL模型中的設(shè)計錯誤 case (state) RESET : next = WAIT; WAIT : next = LOAD; LOAD : next = DONE; DONE : next = WAIT; default : next = 4bx; /不定態(tài) endcase但如果是兩態(tài)變量呢?!給兩態(tài)變量賦一個X值如何?3.5 數(shù)據(jù)類型規(guī)則的放寬 SystemVerilog簡化了模型中數(shù)據(jù)類型的使用,任何數(shù)據(jù)類型的變量都可以通過下列方式賦值: initial或always過程塊中賦值 在單個always_com

12、b,always_ff或always_latch過程塊中賦值 通過單個模塊或原語的output/inout端口驅(qū)動賦值大部分信號可以聲明為變量類型!3.5 數(shù)據(jù)類型規(guī)則的放寬 module compare(output logic lt, eq, gt, input logic 63 : 0 a, b); always (a, b) if (a b); /連續(xù)賦值 comparator u1(eq, a, b); /模塊例化 endmodule module comparator(output logic eq, input logic 63 : 0 a, b); always (a, b)

13、eq = (a = b); endmodule3.5 數(shù)據(jù)類型規(guī)則的放寬 對變量使用的限制可以防止設(shè)計錯誤:多個輸出端口驅(qū)動一個變量;對一個變量進(jìn)行多次連續(xù)賦值;對同一個變量同時進(jìn)行過程賦值和連續(xù)賦值 module add_and_increment(output logic 63 : 0 sum, output logic carry, input logic 63 : 0 a, b); always (a, b) sum = a + b; /過程賦值 assign sum = sum + 1; /error, sum已經(jīng)被過程賦值一次 look_ahead i1(carry, a, b);

14、 /carry被驅(qū)動一次 overflow_check i2(carry, a, b); /error, carry再一次被驅(qū)動 endmodule module loock_ahead(output wire carry, . endmodule module overflow_check(output wire carry, . endmodule3.6 有符號和無符號修飾符 integer j; /verilog-2019標(biāo)準(zhǔn),32位有符號數(shù) reg 63 : 0 u; /無符號64位數(shù) reg signed 63 : 0 s; /有符號64位數(shù),verilog-2019標(biāo)準(zhǔn) Syste

15、mVerilog增加了缺省為有符號數(shù)的數(shù)據(jù)類型:byte, shortint, int和longint int s_int; /有符號32位變量 int unsigned u_int; /無符號32位變量與verilog相同,SystemVerilog只能在類型關(guān)鍵字后面指定signed或unsigned關(guān)鍵字,與C語言不同!3.7 靜態(tài)變量和自動變量 verilog-2019標(biāo)準(zhǔn)中,所有數(shù)據(jù)類型都是靜態(tài)的 verilog-2019標(biāo)準(zhǔn)中在任務(wù)和函數(shù)中添加了自動變量 自動變量特點是其存儲區(qū)在需要時由軟件工具動態(tài)分配,不需要時被釋放,因此也被稱為動態(tài)變量。 自動變量用途: 1. 用于描述在測試程

16、序、抽象系統(tǒng)級、交易級或總線功能模型中的驗證程序 2. 用于編寫可重入任務(wù)或遞歸函數(shù) 3.7 靜態(tài)變量和自動變量平衡加法器:把數(shù)組的所有元素加在一起,被加的數(shù)組元素高、低地址作為函數(shù)的輸入。 function automatic int b_add(int lo, hi); int mid = (lo + hi + 1) 1; if (lo + 1 != hi) return(b_add(lo, (mid 1) + b_add(mid, hi); else return (arraylo + arrayhi); endfunction 3.7 靜態(tài)變量和自動變量 SystemVerilog增加

17、了關(guān)鍵字static,允許任何變量顯式被聲明為static或automatic,這個聲明可以出現(xiàn)在任務(wù)、函數(shù)、beginend塊或forkjoin塊中,但在module一級聲明的變量不能顯式地聲明為static或automatic,在module級,所有變量都是靜態(tài)的! function int count_ones(input 31 : 0 data); automatic logic 31 : 0 count = 0; automatic logic 31 : 0 temp = data; for (int j = 0; j = 1; end return count; endfuncti

18、on 3.7 靜態(tài)變量和自動變量 檢查程序運(yùn)行總錯誤數(shù)任務(wù): typedef struct packed packet_t; task automatic check_results(input packet_t sent, received, output int total_errors); static int error_count = 0; if (sent != received) error_count +; total_errors = error_count; endtask SystemVerilog缺省存儲方式與Verilog兼容,在模塊、beginend塊、forkjo

19、in塊以及非自動任務(wù)和函數(shù)中,缺省存儲方式為靜態(tài)的,如果一個任務(wù)和函數(shù)被聲明自動的,則缺省存儲方式的自動的。3.7.1 靜態(tài)變量和自動變量的初始化 SystemVerilog對Verilog進(jìn)行了擴(kuò)展,在模塊、任務(wù)、函數(shù)中聲明的變量可以有內(nèi)嵌初始值,靜態(tài)變量只初始化一次,自動變量每次調(diào)用時都初始化 function int count_ones(input 31 : 0 data); logic 31 : 0 count = 0; logic 31 : 0 temp = data; for (int k = 0; k = 31; k +) begin if (temp0) count +; e

20、nd return count; endfunction 上述程序不能正確工作:第一次調(diào)用時, count初始為0,再次調(diào)用時,靜態(tài)變量count保持上次調(diào)用時的值,從而導(dǎo)致計數(shù)錯誤 靜態(tài)變量初始化是不可綜合的,動態(tài)變量初始化是可綜合的!3.7.2 靜態(tài)變量和自動變量使用原則 在always和initial塊中,如果無內(nèi)嵌初始化則使用靜態(tài)變量,而需要內(nèi)嵌初始化則使用自動 變量如果一個任務(wù)或函數(shù)是可重入的,則應(yīng)設(shè)成自動的,變量也應(yīng)是自動的,除非要在兩次調(diào)用之間保持變量的值如果一作任務(wù)或函數(shù)用來描述硬件的獨(dú)立部分,并且不是可重入的,則應(yīng)聲明為靜態(tài)的,任務(wù)或函數(shù)中的變量也應(yīng)是靜態(tài)3.8 變量初始化的

21、確定性Verilog初始化不確定SystemVerilog內(nèi)嵌初始化在時間0之前Verilog內(nèi)嵌初始化可能引起事件,SystemVerilog不引起事件SystemVerilog內(nèi)嵌初始化是確定的 integer j = 5; integer k; /integer k = j; initial k = j; /initial / k = j; logic resetN = 0; always (posedge clk, negedge resetN) if (!resetN) count = 0; else count = count + 1;resetN初始與always過程誰先被仿真器

22、激活,表現(xiàn)的結(jié)果是不同的!3.8.1 時序邏輯的異步輸入初始化 module counter(input wire clk, resetN, output logic 15 : 0 count); always (posedge clk, negedge resetN) if(!resetN) count = 0; else count = count + 1; endmodule module counter_test; wire 15 : 0 count; bit clk; bit resetN = 1; counter counter_1(clk, resetN, count); alw

23、ays #10 clk = clk; initial begin resetN = 0; #2 resetN = 1; $display(“n count = %0d (expect 0)n”, count); end endmodule 對Verilog來說,該程序執(zhí)行具有不確定性,WHY?3.9 強(qiáng)制類型轉(zhuǎn)換 verilog是弱類型語言,允許一個數(shù)據(jù)類型的值賦給另一個 數(shù)據(jù)類型的變量或線網(wǎng),新值按verilog標(biāo)準(zhǔn)中定義的規(guī)則轉(zhuǎn)換,強(qiáng)制轉(zhuǎn)換不同于賦值時轉(zhuǎn)變數(shù)值,它可以在表達(dá)式內(nèi),將一個數(shù)值轉(zhuǎn)換成一個新的類型!3.9.1 靜態(tài)轉(zhuǎn)換(編譯時轉(zhuǎn)換) SystemVerilog加入了一個強(qiáng)制轉(zhuǎn)換操

24、作符,用于將一個值強(qiáng)制轉(zhuǎn)換為其它類型 數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換: () 7 + int(2.0 * 3.0); 向量寬度強(qiáng)制轉(zhuǎn)換: () logic 15 : 0 a, b, y; y = a + b * 16(2); 符號強(qiáng)制轉(zhuǎn)換: () shortint a, b; int y; y = y signed(a, b);3.9.1 動態(tài)強(qiáng)制類型轉(zhuǎn)換 SystemVerilog提供了一個系統(tǒng)函數(shù)$cast,在運(yùn)行時能夠進(jìn)行待轉(zhuǎn)換數(shù)值的檢查 $cast(dest_var, source_exp); int radius, area; always (posedge clk) $cast(area, 3.

25、154 * radius * 2); typedef enum s1, s2, s3 states_t; states_t state, next_state; always_latch begin $cast(next_state, state + 1); end$cast可以作為任務(wù)被調(diào)用$cast可以作為函數(shù)被調(diào)用$cast作為函數(shù)被調(diào)用時,會返回一個轉(zhuǎn)換成功與否標(biāo)志$cast不能和直接修改源表達(dá)式的操作符一塊使用,如+,+=等$cast語句不可綜合!3.10 常數(shù) verilog提供三種類型常數(shù):parameter,specparam和localparam paramter可以在確立時

26、使用defparam或內(nèi)嵌參數(shù)重定義修改的常數(shù)Specparam是一個可以在確立時從SDF文件中重定義的常數(shù)Localparam是確立期常數(shù),可以基于其它常數(shù),但不能重定義 verilog限制這些常數(shù)不能在自動任務(wù)或函數(shù)、beginend、forkjoin中聲明3.10 常數(shù) SystemVerilog加入了一個類似C語言風(fēng)格的const聲明,可以將任何變量聲明為常數(shù),有確立完成之后才被賦值,并且可以在自動任務(wù)或函數(shù)、beginend、forkjoin中聲明 const logic 23 : 0 c1 = 7; const int c2 = 15; const real c3 = 3.14;

27、const c4 = 5; /error, 無數(shù)據(jù)類型 task automatic C; const int N = 5; endtask SystemVerilog允許用戶定義新的變量和線網(wǎng)類型,從而能夠在更高的抽象線上進(jìn)行復(fù)雜的設(shè)計,使用用戶自定義數(shù)據(jù)類型,可以用更少的代碼完成更多的設(shè)計功能,并且代碼的自文檔性和可讀性更好。使用typedef建立用戶自定義類型使用enum建立枚舉類型枚舉值的使用第4章 用戶自定義和枚舉數(shù)據(jù)類型4.1 用戶自定義類型 Verilog沒有提供用戶自行擴(kuò)展語言變量和線網(wǎng)類型機(jī)制,其數(shù)據(jù)類型主要用于RTL和門級建模,SystemVerilog除增加了許多新數(shù)據(jù)類

28、型外,還可以用typedef關(guān)鍵字來建立用戶自定義類型,新類型定義后,可以聲明這個類型的變量,如: typedef int unsigned uint; uint a, b; /uint類型的兩個變量4.1.1 局部typedef聲明 用戶自定義類型可以在局部定義,也可以在編譯單元域進(jìn)行外部定義。當(dāng)一個用戶自定義類型只用于設(shè)計的特定部分時,typedef的定義可以在模塊或設(shè)計的接口部分。 module alu(); typedef logic 3 : 0 nibble; nibble opA, opB; nibble 7 : 0 data; /由8個nibble類型組成的32位向量 endmo

29、dulenibble只有alu模塊中可見,其它模塊完全可以用nibble表示其它的意思4.1.2 共享typedef定義 如果一個用戶自定義類型會在很多不同的模塊或接口是使用,可以把typedef聲明放在package或$unit中聲明。 package chip_types; ifdef TWO_STATE typedef bit dtype_t; else typedef logic dtype_t; endif endpackage4.1.2 共享typedef定義module counter(output chip_types : dtype_t 15 : 0 count, input

30、 chip_types : clock, resetN); always (posedge clock, negedge resetN) if (! resetN) count = 0; else count = count + 1; endmodule inport chip_types : *; module counter(output dtype_t 15 : 0 count, input clock, resetN); always (posedge clock, negedge resetN) if (! resetN) count = 0; else count = count

31、+ 1; endmodule4. 2 枚舉數(shù)據(jù)類型枚舉數(shù)據(jù)類型提供了一種方式來聲明一個具有特定允許值列表的抽象變量,每一個值都有一個確定的用戶自定義名字,即標(biāo)簽(label)。Verilog語言沒有枚舉類型,為了給數(shù)值創(chuàng)建一個標(biāo)簽,必須定義parameter常數(shù)來表示每個值,并且將值賦給常數(shù)(標(biāo)識符),define文本替換是另一種把標(biāo)識符與值對應(yīng)的方法4. 2 枚舉數(shù)據(jù)類型define FETCH 3H0define WRITE 3H1define ADD 3H2define SUB 3H3define MULT 3H4define DIV 3H5define SHIFT 3H6define

32、NOP 3H7module controller (output reg read, write, input wire 2 : 0 instruction, input wire clk, resetN); parameter WAIT = 0, LOAD = 1, STORE = 2; reg 1 : 0 state, nextState;4. 2 枚舉數(shù)據(jù)類型 always (posedge clk, negedge resetN) if (!resetN) state = WAIT; else state = nextState; always (state) begin case(s

33、tate) WAIT : nextState = LOAD; LOAD : nextState = STORE; STORE : nextState = WAIT; endcase end always (state, instruction) begin read = 0; write = 0; if(state = LOAD & instruction = FETCH) read = 1; else if (state = STORE & instruction = WRITE) write = 1; endendmodulestate和nextState只取三個值嗎?4. 2 枚舉數(shù)據(jù)類

34、型package chip_types; typedef enum FETCH, WRITE, ADD, SUB, MULT, DIV, SHIFT, NOP instr_t;endpackageimport chip_types : *;module controller(output logic read, write, input instr_t instruction, input wire clk, resetN); enum WAIT, LOAD, STORE state, nextState; always_ff (posedge clk, negedge resetN) if(

35、 ! resetN) state = WAIT; else state = nextState; always_comb begin case (state) WAIT : nextState = LOAD; LOAD : nextState = STORE;4. 2 枚舉數(shù)據(jù)類型 STORE : nextState = WAIT; endcase end always_comb begin read = 0; write = 0; if(state = LOAD & instruction = FETCH) read = 1; if(state = STORE & instruction =

36、WRITE) write = 1; endendmodule枚舉類型限制數(shù)值的合法集合,例子中state,nextState只能有WAIT、LOAD、STORE三種值,所有軟件工具都使用相同的方式解釋對于枚舉類型變量合法值的約束!4. 2 枚舉數(shù)據(jù)類型枚舉類型標(biāo)簽作用域:枚舉類型列表中的標(biāo)簽在其作用域內(nèi)必須是唯一的,可以包含枚舉類型聲明的作用域包括編譯單元、模塊、接口,任務(wù)、函數(shù)、beginend塊和forkjoin塊module FSM(); enum GO, STOP fsm1_state; enum WAIT, GO, DONE fsm2_state;endmodule?4. 2 枚舉數(shù)

37、據(jù)類型枚舉類型相標(biāo)簽代碼的值:枚舉類型標(biāo)簽缺省情況下代表的實際數(shù)值是一個int類型的整數(shù),第一個標(biāo)簽表示數(shù)值0,第二個為1,以此類推。SystemVerilog支持顯式地說明標(biāo)簽表示的數(shù)值,如:enum ONE = 1, FIVE = 5, TEN = 10 state;enum A = 1, B, C, X = 24, Y, Z list1;/ B = ?, C = ?, Y = ?, Z = ?enum A = 1, B, C, D = 3; list2;枚舉列表中的各個標(biāo)簽必須具有唯一的值!4. 2 枚舉數(shù)據(jù)類型枚舉類型的基類:枚舉類型是具有一系列標(biāo)簽值的變量或線網(wǎng),其缺省的基類是int

38、類型,SystemVerilog允許對枚舉類型的基類進(jìn)行顯式的聲明。enum bit FALSE, TRUE boolean;enum logic 1 : 0 WAIT, LOAD, READY state;enum logic 2 : 0 WAIT = 3b001, LOAD = 3b010, READY = 3b100 state; /one-hot編碼enum WAIT = 3b001, LOAD = 3b010, READY = 3b100 state; /基類寬度與賦給標(biāo)簽的值寬度不同enum logic A, B, C list4; /標(biāo)簽數(shù)超過基類所能代表的寬度enum logi

39、c ON = 1b0, OFF = 1bz switch;enum logic 1 : 0 WAIT, ERR = 2bxx, LOAD, READY state; /?4. 2 枚舉數(shù)據(jù)類型枚舉類型操作的強(qiáng)類型檢驗:枚舉類型與其它的Verilog變量不同,它是強(qiáng)類型,一個枚舉類型只可以進(jìn)行下列賦值。枚舉類型列表中的一個標(biāo)簽同類枚舉類型的其它變量通過$cast轉(zhuǎn)換成枚舉類型變量的數(shù)值typedef enum WAIT, LOAD, READY states_t;states_t state, next_state;int foo;foo = state + 1; state = next_st

40、ate; state = WAIT;state = foo + 1;state = state +1; state +; next_state += state;4. 2 枚舉數(shù)據(jù)類型將表達(dá)式強(qiáng)制轉(zhuǎn)換為枚舉類型:使用轉(zhuǎn)換操作符和動態(tài)$cast系統(tǒng)函數(shù)。typedef enum WAIT, LOAD, READY states_t;states_t state, next_state;next_state = states_t(state + 1);$cast(next_state, state +1);如果state = READY呢?會發(fā)生什么事?4. 2 枚舉數(shù)據(jù)類型枚舉類型的專用系統(tǒng)任務(wù):SystemVerilog提供了一些內(nèi)置函數(shù),可以循環(huán)訪問枚舉類型列表中的值,這些方法能自動處理枚舉類型的半強(qiáng)類型特性,簡化操作。.first 返回枚舉列表第一個成員的值.last 返回枚舉列表最后一個成員的值.next() 返回枚舉列表中下一個成員的值,可以用一個整數(shù)作為next的參數(shù),這種情況返回后面第N個成員的值.prev() 返回枚舉列表中前一個成員的值.num 返回枚舉列表中元素個數(shù).name 返回枚舉變量值對應(yīng)的字符串,如果這個值不在枚舉變量列表中,則返回一個空字符串4. 2 枚舉數(shù)據(jù)類型module counter(inpu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論