SystemVerilog硬件設(shè)計(jì)及建模—第5章.ppt_第1頁(yè)
SystemVerilog硬件設(shè)計(jì)及建模—第5章.ppt_第2頁(yè)
SystemVerilog硬件設(shè)計(jì)及建模—第5章.ppt_第3頁(yè)
SystemVerilog硬件設(shè)計(jì)及建模—第5章.ppt_第4頁(yè)
SystemVerilog硬件設(shè)計(jì)及建模—第5章.ppt_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第5章 數(shù)組、結(jié)構(gòu)體和聯(lián)合體,結(jié)構(gòu)體 聯(lián)合體 結(jié)構(gòu)體和聯(lián)合的操作 非壓縮數(shù)組 壓縮數(shù)組 數(shù)組操作 數(shù)組foreach循環(huán) 用于數(shù)組的特殊系統(tǒng)函數(shù),5.1 結(jié)構(gòu)體,結(jié)構(gòu)體提供了對(duì)相關(guān)信息進(jìn)行分組的方法,結(jié)構(gòu)體使用關(guān)鍵字struct聲明,結(jié)構(gòu)體內(nèi)的成員可以是任何數(shù)據(jù)類型,包括用戶自定義類型和其它的結(jié)構(gòu)體類型;結(jié)構(gòu)體是變量和常量的集合,整個(gè)集合可以用結(jié)構(gòu)體名進(jìn)行引用,也可以用結(jié)構(gòu)體成員名來(lái)引用該成員。,struct int a, b; opcode_t opcode; logic 31 : 0 address; bit error; instruction_word;,結(jié)構(gòu)體內(nèi)的成員引用: Inst

2、ruction_word.address = 32hf000001e; 結(jié)構(gòu)體與數(shù)組有什么不同?,5.1.1 結(jié)構(gòu)體聲明,變量或線網(wǎng)都可以定義為結(jié)構(gòu)體,當(dāng)結(jié)構(gòu)體定義為線網(wǎng)時(shí),結(jié)構(gòu)體中所有成員必須都是四態(tài)類型的。,var struct logic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; instruction_word_var; wire struct logic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; instruction_word_net;,struc

3、t logic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; instruction_word_var; Instruction_word_var是變量or線網(wǎng)類型?,雖然結(jié)構(gòu)體可以聲明為線網(wǎng)類型,但結(jié)構(gòu)體內(nèi)成員不能使用線網(wǎng)類型!,5.1.1 結(jié)構(gòu)體聲明,自定義和匿名結(jié)構(gòu)體:,typedef struct logic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; instruction_word_t; instruction_word_t IW; struct log

4、ic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; instruction;,自定義結(jié)構(gòu)體可以在模塊或接口內(nèi)定義,在整個(gè)模塊或接口中都可以使用,如果一個(gè)自定義結(jié)構(gòu)體需要在多個(gè)模塊中使用,或者是作為模塊或接口的端口使用,那么結(jié)構(gòu)體定義應(yīng)放在package中!,5.1.2 結(jié)構(gòu)體賦值,結(jié)構(gòu)體初始化:用值列表方式初始化,值列表是使用中的一組數(shù)值,大括號(hào)中的數(shù)值個(gè)數(shù)必須與成員個(gè)數(shù)一致。,typedef struct logic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; i

5、nstruction_word_t; instruction_word_t IW = 100, 3, 8hff, 0; /大括號(hào)間的數(shù)值必須與成員個(gè)數(shù)一致,5.1.2 結(jié)構(gòu)體賦值,結(jié)構(gòu)體成員賦值:,typedef struct logic 31 : 0 a, b; logic 7 : 0 opcode; logic 23 : 0 address; instr_t; inst_t IW; always (posedge clk, negedge resetN) if (!resetN) begin IW.a = 100; IW.b = 100; IW.opcode = 8hff; /成員引用 I

6、W.address = 0; end else begin end,5.1.2 結(jié)構(gòu)體賦值,結(jié)構(gòu)體成員賦值:,always (posedge clk, negedge resetN) if (!resetN) IW = 100, 3, 8hff, 0; /結(jié)構(gòu)體表達(dá)式賦值 else begin end / IW = address : 0, opcode : 8hff, a : 100, b : 5; / IW = address : 0, opcode : 8hff, 100, 5; /錯(cuò)誤,混用成員名稱 /和成員順序,IW = real : 1.0, default : 0; IW = r

7、eal : 1.0, default : 0, r1 : 3.14;,struct real r0, r1; int i0, i1; logic 7 : 0 opcode; logic 23 : 0 address; IW;,5.1.3 壓縮和非壓縮結(jié)構(gòu)體,默認(rèn)情況下,結(jié)構(gòu)體是非壓縮的,也就是說(shuō),雖然結(jié)構(gòu)體成員使用一個(gè)共同的名字,但它們被當(dāng)作是獨(dú)立的變量,壓縮結(jié)構(gòu)體用packed關(guān)鍵字顯式說(shuō)明,其特點(diǎn)是所有成員被當(dāng)作一個(gè)向量存儲(chǔ),第一個(gè)成員在向量的最左邊,最后一個(gè)成員在最低位,其編號(hào)為0,struct packed logic valid; logic 7 : 0 tag; logic 31

8、: 0 data; data_word;,40,39,31,15,0,壓縮綜合體中的成員只能是包含整數(shù)類型值:即可以表示為byte, int這樣的向量 以及用bit或logic創(chuàng)建的向量!,5.1.3 壓縮和非壓縮結(jié)構(gòu)體,壓縮結(jié)構(gòu)體的操作:非壓縮結(jié)構(gòu)體的操作對(duì)壓縮結(jié)構(gòu)體一樣適用,但壓縮結(jié)構(gòu)體還有與向量類似的操作,如算術(shù)操作、邏輯操作等,typedef struct packed logic valid; logic 7 : 0 tag; logic 31 : 0 data; data_word_t; data_word_t packet_in, packet_out; always (pose

9、dge clk) packet_out = packet_in 2;,5.1.3 壓縮和非壓縮結(jié)構(gòu)體,有符號(hào)的壓縮結(jié)構(gòu)體:壓縮結(jié)構(gòu)體作為向量使用可以是有符號(hào)或無(wú)符號(hào)的,用關(guān)鍵字signed或unsigned來(lái)聲明,但結(jié)構(gòu)體中成員是有符號(hào)還是無(wú)符號(hào)的,只依賴于成員的類型聲明,與結(jié)構(gòu)體聲明沒(méi)有聯(lián)系。壓縮結(jié)構(gòu)體的部分選擇始終是無(wú)符號(hào)的。,typedef struct packed signed logic valid; logic 7 : 0 tag; logic 31 : 0 data; data_word_t; data_word_t a, b; always (posedge clk) if

10、(a b) /有符號(hào)比較 ,5.1.4 通過(guò)端口傳遞結(jié)構(gòu)體,結(jié)構(gòu)體可以通過(guò)模塊和接口的端口傳遞,package definitions; typedef enum ADD, SUB, MULT, DIV opcode_t; typedef struct logic 31 : 0 a, b; opcode_t opcode; logic 23 : 0 address; logic error; instruction_word_t; endpackage import definitions : *; module alu (input instruction_word_t IW, input

11、wire clk); endmodule,在兩個(gè)不同模塊中聲明的匿名結(jié)構(gòu)體,即使它們具有相同的名稱、同樣的成員及名稱,也不是相同的結(jié)構(gòu)體!,5.1.5 將結(jié)構(gòu)體作為任務(wù)和函數(shù)的自變量,結(jié)構(gòu)體可以作為自變量傳遞給任務(wù)和函數(shù),module processor (); typedef enum ADD, SUB, MULT, DIV opcode_t typedef struct logic 31 : 0 a, b; opcode_t opcode; logic 23 : 0 address; logic error; instruction_word_t; function alu (input

12、instruction_word_t IW); endfunction endmodule,非壓縮和壓縮結(jié)構(gòu)體都是可綜合的,綜合工具支持結(jié)構(gòu)體通過(guò)模塊端口、任務(wù)和函數(shù)傳遞,支持使用成員名和值的列表對(duì)結(jié)構(gòu)體賦值!,5.2 聯(lián)合體,聯(lián)合體只存儲(chǔ)一個(gè)元素,但這個(gè)元素有多種表示方法,每種表示可以是不同的數(shù)據(jù)類型。聯(lián)合體與結(jié)構(gòu)體的聲明類似,其成員引用也一樣,union byte i; byte unsigned u; data; data.i = -5; $display(“data is %d”, data.i); data.u = -5; $display(“now data is %d”, dat

13、a.u);,typedef union int i; int unsigned u; data_t; data_t a, b;,用戶自定義和匿名聯(lián)合體:區(qū)別在于是不是用typedef聲明,5.2.1 非壓縮聯(lián)合體,非壓縮聯(lián)合體可以包含任意變量類型,如real類型,非壓縮結(jié)構(gòu)體和非壓縮數(shù)組等;非壓縮聯(lián)合體不可綜合,可用于對(duì)高層次系統(tǒng)和交易級(jí)建模;如果從非壓縮聯(lián)合體中讀取的成員不同于上次寫(xiě)入的成員,可能導(dǎo)致不確定的結(jié)果!,struct bit is_real; union int i; real r; value; data; /,always (posedge write) begin case

14、(operation_type) INT_OP : begin data.value.i = 5; data.value.r = 0; end FP_OP : begin data.value.r = 3.1415; data.is_real = 1; end endcase end,always (posedge real) begin if (data.is_real) real_opd = data.value.r; else int_opd = data.value.i; end,5.2.2 標(biāo)簽聯(lián)合體,標(biāo)簽聯(lián)合體包含一個(gè)存儲(chǔ)“標(biāo)簽”的隱含成員,代表存儲(chǔ)數(shù)值的最后一個(gè)聯(lián)合體成員的名稱,

15、使用標(biāo)簽表達(dá)式可以將一個(gè)值寫(xiě)入標(biāo)簽聯(lián)合體中,標(biāo)簽表達(dá)式具有關(guān)鍵字tagged,后面是成員名,再后面是要存儲(chǔ)的值;標(biāo)簽聯(lián)合體檢測(cè)聯(lián)合體使用是否一致;使用標(biāo)簽表達(dá)式將值賦給標(biāo)簽聯(lián)合體后,可以使用成員名將值寫(xiě)取聯(lián)合體成員中,如果指定的成員名與當(dāng)前標(biāo)簽不匹配,將會(huì)產(chǎn)生錯(cuò)誤。,union tagged int i; real r; data; data = tagged i 5; /在data.i中存5,并設(shè)備隱含標(biāo)簽 d_out = data.i; /從聯(lián)合體中讀值 d_out = data.r; /錯(cuò)誤:成員與聯(lián)合的隱含標(biāo)簽不匹配 data.i = 7; /寫(xiě)到聯(lián)合體成員中 data.r = 3.1

16、4; /?,5.2.3 壓縮聯(lián)合體,壓縮聯(lián)合體聲明方式與壓縮結(jié)構(gòu)體聲明方式相同,在壓縮聯(lián)合體中,每個(gè)聯(lián)合體成員的位數(shù)都必須是相同的,以保證壓縮聯(lián)合體使用同樣的位數(shù)存儲(chǔ)數(shù)據(jù);壓縮聯(lián)合體只能存儲(chǔ)兩態(tài)或四態(tài)類型的數(shù)據(jù),因此,壓縮聯(lián)合體不能包含real或shortreal變量,或非壓縮結(jié)構(gòu)體、非壓縮聯(lián)合體、非壓縮數(shù)組;壓縮聯(lián)合體允許數(shù)據(jù)以一種格式寫(xiě)入,而以另一種格式讀取。,typedef struct packed logic 15 : 0 src_addr; logic 15 : 0dest_addr; logic 23 : 0 data; logic 7 : 0 opcode; data_pack

17、ed_t; union packed data_packet_t packet; logic 7 : 07 :0 bytes; /壓縮數(shù)組 dreg;,5.2.3 壓縮聯(lián)合體,always (posedge clk, negedge resetn) if (!resetn) begin dreg.packet = 0; k = 0; end else if (load_data) begin dreg.bytesk = byte_in; k = k + 1; end always (posedge clk) if (data_ready) case (dreg.packet.opcode) ,

18、63,47,31,7,0,63,47,31,15,0,55,39,23,7,5.2.3 壓縮聯(lián)合體,壓縮的標(biāo)簽聯(lián)合體:聯(lián)合體可以聲明為既是壓縮的又是帶標(biāo)簽的,此時(shí)聯(lián)合體成員的位寬可以不同但還必須是兩態(tài)或四態(tài)類型;壓縮的標(biāo)簽聯(lián)合體只允許從與上一個(gè)標(biāo)簽表達(dá)式寫(xiě)入到聯(lián)合體中的成員相匹配的同一個(gè)成員中讀值。 union tagged packed logic 15 : 0 short_word; logic 31 : 0 word; logic 63 : 0 long_word; data_word; data_word = tagged word 1;,5.2.4 綜合指導(dǎo),不管聯(lián)合體有多少種數(shù)據(jù)類

19、型表示方式,聯(lián)合體只存儲(chǔ)一個(gè)值,為了能夠綜合,首先要保證聯(lián)合體中的成員數(shù)據(jù)類型為兩態(tài)或四態(tài)的,其次是成員能以相同的位數(shù)存儲(chǔ),壓縮聯(lián)合體滿足這種要求,因而,壓縮聯(lián)合體是可以綜合的。,5.2.5 使用結(jié)構(gòu)體和聯(lián)合體舉例,建立一個(gè)可以進(jìn)行有符號(hào)數(shù)和無(wú)符號(hào)數(shù)運(yùn)算的ALU模型,兩種計(jì)算不能同時(shí)進(jìn)行。,package definitions; typedef enum ADD, SUB, MULT, DIV, SL, SR) opcode_t; typedef enum UNSIGNED, SIGNED operand_type_t; typedef union packed logic 31 : 0 u

20、_data; logic signed 31 : 0 s_data; data_t; type struct packet opcode_t opc; operand_type_t op_type; data_t op_a; data_t op_b; instr_t; endpackage,5.2.5 使用結(jié)構(gòu)體和聯(lián)合體舉例,import definitions : *; module alu (input instr_t IW; output data_t alu_out); always (IW) begin if (IW.op_type = SIGNED) begin case (IW.

21、opc) ADD : alu_out.s_data = IW.op_a.s_data + IW.op_b.s_data; SUB : alu_out.s_data = IW.op_a.s_data - IW.op_b.s_data; MULT : alu_out.s_data = IW.op_a.s_data * IW.op_b.s_data; DIV : alu_out.s_data = IW.op_a.s_data / IW.op_b.s_data; SL : alu_out.s_data = IW.op_a.s_data 2; endcase end,5.2.5 使用結(jié)構(gòu)體和聯(lián)合體舉例,

22、else begin case (IW.opc) ADD : alu_out.u_data = IW.op_a.u_data + IW.op_b.u_data; SUB : alu_out.u_data = IW.op_a.u_data - IW.op_b.u_data; MULT : alu_out.u_data = IW.op_a.u_data * IW.op_b.u_data; DIV : alu_out.u_data = IW.op_a.u_data / IW.op_b.u_data; SL : alu_out.u_data = IW.op_a.u_data 2; endcase en

23、d end endmodule,5.3 數(shù)組,Verilog-1995只允許聲明一維的reg, integer和time數(shù)據(jù)類型的數(shù)組; Verilog-2001允許除了event類型外的所有變量或線網(wǎng)類型都可以用于數(shù)組聲明,且允許聲明多維數(shù)組; SystemVerilog允許任何數(shù)據(jù)類型用于聲明數(shù)組,包括使用struct、enum以及用戶自定義類型,5.3.1 非壓縮數(shù)組,/1024個(gè)1位線網(wǎng)的一維非壓縮數(shù)組 wire n 0 : 1023; /256個(gè)8位變量的一維非壓縮數(shù)組 reg 7 : 0 lut 0 : 255; /1024個(gè)實(shí)數(shù)變量的一維非壓縮數(shù)組 real r 0 : 1024

24、; /32位的整數(shù)變量的三維非壓縮數(shù)組 integer i 7 : 0 3 : 0 7 : 0; wire 7 : 0 table 3 : 0; /如何存儲(chǔ)? 非壓縮數(shù)組中各個(gè)數(shù)組元素是獨(dú)立存儲(chǔ)的! Verilog一次訪問(wèn)多個(gè)數(shù)組元素是錯(cuò)誤的!,5.3.1 非壓縮數(shù)組,SystemVerilog支持的非壓縮數(shù)組: bit 63 : 0 d_array 1 : 128; /向量數(shù)組 shortreal cosines 0 : 89; /浮點(diǎn)數(shù)組 typedef enum Mo, Tu, We, Th, Fr, Sa, Su Week_t; Week_t year 1 : 52; /自定義數(shù)組 S

25、ystemVerilog可以引用整個(gè)數(shù)組或其中的一段元素,因此允許將整個(gè)數(shù)組或者數(shù)組特定維的內(nèi)容復(fù)制到另一個(gè)數(shù)組,其限制是等號(hào)兩邊的數(shù)組必須有相同的維數(shù)、位數(shù)和類型。 int a1 7 : 0 1023 : 0; int a2 1 : 8 1 : 1024; a2 = a1; /復(fù)制整個(gè)數(shù)組 a23 = a10; /復(fù)制一段,5.3.2 壓縮數(shù)組,Verilog中的向量就是一維壓縮數(shù)組: wire 3 : 0 a; /4位壓縮數(shù)組 reg 63 : 0 data; /64位壓縮數(shù)組 SystemVerilog可以聲明多維壓縮數(shù)組: logic 3 : 0 7 : 0 data; /2維壓縮數(shù)組

26、 壓縮數(shù)組存儲(chǔ):無(wú)間隙存儲(chǔ),與編譯器、OS及硬件平臺(tái)無(wú)關(guān),31,23,15,8,0,5.3.2 壓縮數(shù)組,壓縮數(shù)組元素只能是位形式的數(shù)據(jù)類型:包括logic, bit, reg,其它壓縮數(shù)組,壓縮結(jié)構(gòu)體及壓縮聯(lián)合體。 typedef struct packed logic 7 : 0 crc; logic 3 : 0 data; data_word_t; data_word_t 7 : 0 dataarray; 壓縮數(shù)組引用:壓縮數(shù)組可以作為整體、位選擇或部分選擇引用。,logic 3 : 0 7 : 0 data; wire 31 : 0 a = data; wire sign = data

27、37; wire 3 : 0 nib = data03:0;,byte high_byte; assign high_byte = data3; logic 15 : 0 word; assign word = data1:0; /assign word = data1:0 2;,5.3.4 數(shù)組聲明時(shí)的初始化,壓縮數(shù)組初始化:與向量一樣,可以在聲明時(shí)用簡(jiǎn)單賦值進(jìn)行初始化,賦值可以是常數(shù)、常數(shù)的拼接或常數(shù)的復(fù)制。 logic 3 : 07 : 0 a = 32h0; logic 3 : 07 : 0 b = 16hz, 16h0; /拼接操作符 logic 3 : 07 : 0 c = 162

28、b01; /復(fù)制操作符 非壓縮數(shù)組初始化:在聲明時(shí)用內(nèi)的值序列進(jìn)行初始化,作為左定界符表明里面是表達(dá)式列表,而不是verilog表達(dá)式的拼接,括號(hào)的套數(shù)與數(shù)組的維數(shù)一致。 int d1 0 : 10 : 3 = 7, 3, 0, 5, 2, 0, 1, 6; intd2 0 : 10 : 3 = 27, 3, 0, 5; /復(fù)制,復(fù)制操作符前無(wú) 與verilog中的拼接和復(fù)制操作符不同,拼接和復(fù)制要求指定文本值的位數(shù),因而未指定位數(shù)的數(shù)值和實(shí)數(shù)不允許在這些操作符中!,5.3.4 數(shù)組聲明時(shí)的初始化,為非壓縮數(shù)組指定默認(rèn)值:SystemVerilog可以通過(guò)指定一個(gè)默認(rèn)值初始化非壓縮數(shù)組的所有元

29、素或一段元素,默認(rèn)值在在使用關(guān)鍵字default指定,或者使用數(shù)據(jù)類型關(guān)鍵字,以初始化結(jié)構(gòu)或聯(lián)合類型的數(shù)組元素中相應(yīng)成員的值。 int a1 0 : 70 : 1023 = default : 8h55; typedef struct logic 3 : 0 opc; int k; real r; data_t; data_t data 0 : 7 = default : 0, real : 3.14;,5.3.5 數(shù)組賦值,非壓縮數(shù)組賦值: 給一個(gè)元素賦值 給一個(gè)元素的1位或部分位賦值 用一個(gè)值序列給整個(gè)數(shù)組賦值 用一個(gè)值序列給數(shù)組的一段賦值。 byte a 0 :30 : 3; a10 =

30、 8h5; a = 0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0; a3 = hf, ha, hc, he; a = default : 0; /整個(gè)數(shù)組賦值 a0 = default : 4; /數(shù)組一段賦值,5.3.5 數(shù)組賦值,壓縮數(shù)組賦值:壓縮數(shù)組是向量,可以象verilog向量一樣賦值 數(shù)組一個(gè)元素 整個(gè)數(shù)組(向量) 數(shù)組的一部分 數(shù)組的一段(多個(gè)相鄰的子域) logic 1 :01 : 07 : 0 a; a110 = 1b0; a = 32hf1a3c5e7; a103:0 = 4hf; a0 = 16hface; a = 16hz

31、, 16b0; /拼接賦值,非壓縮數(shù)組與壓縮數(shù)組賦值有什么不同?!,5.3.6 數(shù)組復(fù)制,壓縮數(shù)組到壓縮數(shù)組的復(fù)制:一個(gè)壓縮數(shù)組可以直接賦給另一個(gè)壓縮數(shù)組,且數(shù)組的類型和寬度可以不同,按向量操作進(jìn)行擴(kuò)展或截?cái)?bit 1 : 0 15 : 0 a; logic 3 : 07 : 0 b; logic 15 : 0 c; logic 39 : 0 d; b = a; /32位數(shù)組賦給32位數(shù)組 c = a; /a的高16位被忽略 d = a; /d的高8位填0,5.3.6 數(shù)組復(fù)制,非壓縮數(shù)組到非壓縮數(shù)組的復(fù)制:兩個(gè)具有相同維數(shù)、元素位數(shù)和類型的非壓縮數(shù)組可以直接賦值,兩個(gè)數(shù)組中元素編號(hào)不必相同

32、,但數(shù)組的結(jié)構(gòu)和類型必須完全匹配;不同結(jié)構(gòu)的非壓縮數(shù)組間的賦值需要經(jīng)過(guò)轉(zhuǎn)換實(shí)現(xiàn)。 logic 31 : 0 a 2 : 09 : 0; logic 0 : 31 b 1 : 31 : 10; b = a; /非壓縮數(shù)組間賦值,非壓縮數(shù)組到壓縮數(shù)組,壓縮數(shù)組到非壓縮數(shù)組間的復(fù)制需要經(jīng)過(guò)轉(zhuǎn)換才能實(shí)現(xiàn)!,5.3.7 使用位流轉(zhuǎn)換復(fù)制數(shù)組和結(jié)構(gòu)體,位流轉(zhuǎn)換將非壓縮數(shù)組臨時(shí)地轉(zhuǎn)換成向量形式的位流,該臨時(shí)向量可以賦值給其它數(shù)組。源數(shù)組和目標(biāo)數(shù)組的每個(gè)元素的寬度可以不同,但數(shù)組的總位數(shù)必須相同。位流轉(zhuǎn)換機(jī)制主要用于以下情況: 把非壓縮數(shù)組賦值給不同結(jié)構(gòu)的非壓縮數(shù)組 把非壓縮數(shù)組賦值給壓縮數(shù)組 把結(jié)構(gòu)體賦值給

33、壓縮數(shù)組或非壓縮數(shù)組 把定寬或動(dòng)態(tài)寬度的數(shù)組賦值給動(dòng)態(tài)寬度數(shù)組 把結(jié)構(gòu)體賦值給另一個(gè)不同結(jié)構(gòu)的結(jié)構(gòu)體,位流轉(zhuǎn)換使用SystemVerilog靜態(tài)轉(zhuǎn)換操作符,轉(zhuǎn)換需要至少目標(biāo)數(shù)組是用typedef表示的自定義類型! typedef int data_t 3 : 0 7 : 0; data_t a; int b1 : 03 : 03 : 0; a = data_t(b); /將非壓縮數(shù)組賦給不同結(jié)構(gòu)的非壓縮數(shù)組,5.3.8 由數(shù)組構(gòu)成的數(shù)組,數(shù)組可以是壓縮和非壓縮的混合維度。 logic 63 : 0 men 0 : 4095; /一個(gè)由64位壓縮數(shù)組組成的非壓縮數(shù)組 logic 3 : 07 :

34、 0 data 0 : 1023 /由32位元素組成的非壓縮數(shù)組,每個(gè) /元素是由4個(gè)字節(jié)組成的壓縮數(shù)組 數(shù)組的索引:非壓縮維度的索引先于壓縮維度,且按從左到右次序。,logic 3 : 07 : 0 mi_array 0 : 70 : 70 : 7; mi_array 0 1 2 3 4 = 1b1;,5.3.9 數(shù)組中使用用戶自定義類型,數(shù)組元素可以是用戶自定義類型,用于數(shù)組元素類型聲明的用戶自定義類型也可以是數(shù)組。 typedef int unsigned uint_t; uint_t u_array 0 : 127; /用戶自類型組成的數(shù)組 typedef logic 3 : 0 ni

35、bble_t; nibble_t 31 : 0 big_word; /壓縮數(shù)組 /logic 31 : 0 3 : 0 big_word; typedef logic 3 : 0 nibble_t; typedef nibble_t nib_array_t 0 : 3; nib_array_t compound_array 0 : 7; /logic 3 : 0 compound_array 0 : 70 : 3;,5.3.10 數(shù)組通過(guò)端口、任務(wù)與函數(shù)傳遞,Verilog允許壓縮數(shù)組通過(guò)模塊端口、任務(wù)與函數(shù)傳遞,SystemVerilog允許任何類型及任意維數(shù)的數(shù)組通過(guò)端口、任務(wù)與函數(shù)傳遞,

36、但要求端口、任務(wù)與函數(shù)的自變量說(shuō)明為數(shù)組,傳送的規(guī)則與數(shù)組賦值給其它數(shù)組的規(guī)則相同。 module cpu(); logic 7 : 0 lookup_table 0 : 255; lookup i1(.lut(lookup_table); endmodule module lookup (output bit 7 : 0 lut 0 : 255); initial load(lut); task load (inout logic 7 : 0 t 0 : 255; endtask endmodule,5.3.10 結(jié)構(gòu)體、聯(lián)合體與數(shù)組,壓縮與非壓縮數(shù)組的元素可以是結(jié)構(gòu)體或聯(lián)合體,在壓縮數(shù)組中

37、,結(jié)構(gòu)體或聯(lián)合體也必須是壓縮的;結(jié)構(gòu)體或聯(lián)合體中也可以包含壓縮或非壓縮數(shù)組,壓縮的結(jié)構(gòu)體或聯(lián)合體也只能包含壓縮數(shù)組,typedef struct packed logic 31 : 0 a; logic 7 : 0 b; packet_t; packet_t 23 : 0 packet_array; typedef struct int a; real b; data_t; data_t data_array 31 : 0;,struct packed logic parity; logic 3 : 07 : 0 data; data_word; struct logic data_ready

38、; logic 7 : 0 data 3 : 0; packet;,5.3.13 綜合指導(dǎo),數(shù)組及數(shù)組的賦值都是可綜合的! 數(shù)組聲明 數(shù)組賦值 數(shù)組復(fù)制 結(jié)構(gòu)體或聯(lián)合體中數(shù)組 數(shù)組中的結(jié)構(gòu)體或聯(lián)合體(結(jié)構(gòu)體或聯(lián)合體須為用戶自定義類型) 數(shù)組傳遞 前提:基值為四態(tài)或兩態(tài)!,5.3.14 數(shù)組應(yīng)用實(shí)例,/ 指令寄存器模型: package definitions; typedef enum ADD, SUB, MULT, DIV, SL, SR opcode_t; typedef enum UNSIGNED, SIGNED operand_type_t; typedef union packed

39、logic 31 : 0 u_data; logic signed 31 : 0 s_data; data_t; typedef struct packed opcode_t opc; operand_type_t op_type; data_t op_a; data_t op_b; instr_t; endpackage;,5.3.14 數(shù)組應(yīng)用實(shí)例,import definitions : *; module instr_register( output instr_t 0 : 31 instr_reg, input data_t operand_a; input data_t opera

40、nd_b; input operand_type_t op_type; input opcode_t opcode; input logic 4 : 0 wp); always (wp) begin instr_regwp.op_type = op_type; instr_regwp.opc = opcode; if (op_type = SIGNED) begin instr_regwp.op_a.s_data = operand_a.s_data; instr_regwp.op_a.s_data = operand_a.s_data; end else begin end end endmodule,5. 4 foreach循環(huán),foreach循環(huán)可以遍歷任何維數(shù)的數(shù)組,foreach循環(huán)的自變量是數(shù)組名,它后面是方括號(hào)內(nèi)用逗號(hào)分隔的循環(huán)變量列表,循環(huán)變量不需聲明,每個(gè)循環(huán)變量對(duì)應(yīng)一個(gè)維度,多循環(huán)變量創(chuàng)建嵌套循環(huán)來(lái)對(duì)給定索引進(jìn)行迭代,外循環(huán)對(duì)應(yīng)低基數(shù)索引。foreach循環(huán)變量可以省略,如果省略了某個(gè)維數(shù)的循環(huán)變量,

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論