《硬件描述語言》課件5Verilog HDL高級(jí)主題_第1頁
《硬件描述語言》課件5Verilog HDL高級(jí)主題_第2頁
《硬件描述語言》課件5Verilog HDL高級(jí)主題_第3頁
《硬件描述語言》課件5Verilog HDL高級(jí)主題_第4頁
《硬件描述語言》課件5Verilog HDL高級(jí)主題_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、提綱過程時(shí)序控制函數(shù)與任務(wù)系統(tǒng)任務(wù)(函數(shù))編譯預(yù)處理時(shí)序控制所謂時(shí)序控制就是用某種方式控制某一段程序何時(shí)執(zhí)行。前面的多個(gè)例子中都包含有時(shí)序控制的內(nèi)容。always后面跟的過程塊是否執(zhí)行,決定于它的觸發(fā)條件是否滿足。這個(gè)觸發(fā)條件就是時(shí)序控制。除了在always塊的開頭進(jìn)行時(shí)序控制之外,在塊內(nèi)也可以進(jìn)行時(shí)序控制。基于時(shí)延的時(shí)序控制(#delay):延遲指定時(shí)間步后執(zhí)行邊沿敏感的時(shí)序控制:()在信號(hào)發(fā)生翻轉(zhuǎn)后執(zhí)行。可以說明信號(hào)有效沿是上升沿(posedge)還是下降沿(negedge)??梢杂藐P(guān)鍵字or指定多個(gè)參數(shù),也可以以逗號(hào)分割。電平敏感的時(shí)序控制:wait()直至expr值為真時(shí)(非零)才執(zhí)行

2、。若expr已經(jīng)為真則立即執(zhí)行。時(shí)序控制的三種形式在test bench中使用簡(jiǎn)單延時(shí)(#延時(shí))施加激勵(lì),或在行為模型中模擬實(shí)際延時(shí)。在簡(jiǎn)單延時(shí)中可以使用參數(shù)。module muxtwo (out, a, b, sl); input a, b, sl; output out; reg out; always ( sl or a or b) if (! sl) #10 out = a; / 從a到out延時(shí)10個(gè)時(shí)間單位 else #12 out = b; /從b到out延時(shí)12個(gè)時(shí)間單位endmodule簡(jiǎn)單延時(shí)時(shí)序控制可以用在RTL級(jí)或行為級(jí)組合邏輯或時(shí)序邏輯描述中??梢杂藐P(guān)鍵字 posed

3、ge 和 negedge 限定信號(hào)敏感邊沿。敏感表中可以有多個(gè)信號(hào),用關(guān)鍵字or連接。module reg_ adder (out, a, b, clk); input clk; input 2: 0 a, b; output 3: 0 out; reg 3: 0 out; reg 3: 0 sum; always ( a or b) / 若a或b發(fā)生任何變化,執(zhí)行 #5 sum = a + b; always ( negedge clk) / 在clk下降沿執(zhí)行 out = sum;endmodule邊沿敏感時(shí)序事件:eventevent也是一種邊沿敏感時(shí)序。event是Verilog的一種

4、數(shù)據(jù)類型。event 由”-”符來觸發(fā)例:event Ready, Doneinitial- Done;always(Done) begin. . .- Ready ;endalways(Ready)begin. . .- Done;end事件不可綜合wait用于行為級(jí)代碼中電平敏感的時(shí)序控制。module latch_adder (out, a, b, enable); input enable; input 2: 0 a, b; output 3: 0 out; reg 3: 0 out; always ( a or b) begin wait (!enable) / 當(dāng)enable為低電

5、平時(shí)執(zhí)行 out = a + b; endendmodulewait語句:電平敏感時(shí)序控制wait語句不可綜合module wait_test;reg clk, waito, edgeo;initial begin clk = 0;edgeo=0;waito=0;endalways #50 clk = clk;always (clk) #5 edgeo = edgeo;always wait(clk) #5 waito = waito;endmodule過程時(shí)序控制(例子)提綱過程時(shí)序控制函數(shù)與任務(wù)系統(tǒng)任務(wù)(函數(shù))編譯預(yù)處理Verilog的任務(wù)及函數(shù)Verlilog中可以通過任務(wù)和函數(shù)實(shí)現(xiàn)大模

6、塊的結(jié)構(gòu)化。任務(wù)(task)通常用于仿真,或?qū)τ布M(jìn)行行為描述可以包含時(shí)序控制(#延遲,, wait)可以有 input,output,和inout參數(shù)可以調(diào)用其他任務(wù)或函數(shù)函數(shù)(function)通常用于計(jì)算,或描述組合邏輯不能包含任何延遲;函數(shù)仿真時(shí)間為0只含有input參數(shù)并由函數(shù)名返回一個(gè)結(jié)果可以調(diào)用其他函數(shù),但不能調(diào)用任務(wù)Verilog的任務(wù)及函數(shù)任務(wù)和函數(shù)必須在module內(nèi)調(diào)用在任務(wù)和函數(shù)中不能聲明wire所有輸入/輸出都是局部寄存器任務(wù)/函數(shù)執(zhí)行完成后才返回結(jié)果。若任務(wù)/函數(shù)中有forever語句,則永遠(yuǎn)不會(huì)返回結(jié)果任務(wù) 下面的任務(wù)中含有時(shí)序控制和一個(gè)輸入,并引用了一個(gè)modu

7、le變量,但沒有輸出、輸入輸出和內(nèi)部變量,也不顯示任何結(jié)果。module top; reg clk, a, b; DUT u1 (out, a, b, clk); always #5 clk = !clk; task neg_clocks; input 31:0 number_of_edges; repeat( number_of_edges) ( negedge clk); endtask initial begin clk = 0; a = 1; b = 1; neg_clocks(3); / 任務(wù)調(diào)用 a = 0; neg_clocks (5); b = 0; endendmodule時(shí)

8、序控制中使用的信號(hào)(例如clk)一定不能作為任務(wù)的輸入,因?yàn)檩斎胫抵幌蛟撊蝿?wù)傳送一次。任務(wù)引用了一個(gè)module變量。module mult (clk, a, b, out, en_mult); input clk, en_mult; input 3: 0 a, b; output 7: 0 out; reg 7: 0 out; always ( posedge clk) multme (a, b, out); / 任務(wù)調(diào)用 task multme; / 任務(wù)定義 input 3: 0 xme, tome; output 7: 0 result; wait (en_mult) result =

9、 xme * tome; endtaskendmodule任務(wù)任務(wù)可以有input, output 和 inout參數(shù)。傳送到任務(wù)的參數(shù)和與任務(wù)I/O說明順序相同??梢弥髡{(diào)模塊中的變量??梢栽谌蝿?wù)內(nèi)使用時(shí)序控制。主要特點(diǎn): 從代碼中多處調(diào)用任務(wù)時(shí)要小心。因?yàn)槿蝿?wù)的局部變量的只有一個(gè)拷貝,并行調(diào)用任務(wù)可能導(dǎo)致錯(cuò)誤的結(jié)果。在任務(wù)中使用時(shí)序控制時(shí)這種情況時(shí)常發(fā)生。 在任務(wù)或函數(shù)中引用主調(diào)模塊的變量時(shí)要小心。函數(shù)(function)函數(shù)中不能有時(shí)序控制,但調(diào)用它的過程可以有時(shí)序控制。函數(shù)名f_or_and在函數(shù)中作為register使用module orand (a, b, c, d, e, out

10、); input 7: 0 a, b, c, d, e; output 7: 0 out; reg 7: 0 out; always ( a or b or c or d or e) out = f_or_and (a, b, c, d, e); / 函數(shù)調(diào)用 function 7:0 f_or_and; input 7:0 a, b, c, d, e; if (e = = 1) f_or_and = (a | b) & (c | d); else f_or_and = 0; endfunctionendmodule函數(shù)主要特性:函數(shù)定義中不能包含任何時(shí)序控制語句。函數(shù)至少有一個(gè)輸入,不能包含

11、任何輸出或雙向端口。函數(shù)只返回一個(gè)數(shù)據(jù),其缺省為reg類型。傳送到函數(shù)的參數(shù)順序和函數(shù)輸入?yún)?shù)的說明順序相同。函數(shù)在模塊(module)內(nèi)部定義。函數(shù)只返回單個(gè)值,可以采用信號(hào)拼接的方式給多個(gè)信號(hào)賦值。 o1, o2, o3, o4 = f_ or_ and (a, b, c, d, e);函數(shù) 要返回一個(gè)向量值(多于一位),在函數(shù)定義時(shí)在函數(shù)名前說明范圍。函數(shù)中需要多條語句時(shí)用begin和end。 不管在函數(shù)內(nèi)對(duì)函數(shù)名進(jìn)行多少次賦值,值只返回一次。module foo; input 7: 0 loo; output 7: 0 goo;/ 可以在連續(xù)賦值中調(diào)用函數(shù) assign goo = z

12、ero_count ( loo ); function 3: 0 zero_count; input 7: 0 in_ bus; integer I; begin zero_count = 0; for (I = 0; I 8; I = I + 1) if (! in_bus I ) zero_count = zero_count + 1; end endfunctionendmodule函數(shù)函數(shù)返回值可以聲明為其它register類型:integer, real, 或time。在任何表達(dá)式中都可調(diào)用函數(shù)module checksub (neg, a, b); output neg; reg

13、neg; input a, b; function integer subtr; input 7: 0 in_a, in_b; subtr = in_a - in_b; / 結(jié)果可能為負(fù) endfunction always (a or b) if (subtr( a, b) 0) neg = 1; else neg = 0;endmodule函數(shù)函數(shù)中可以對(duì)返回值的個(gè)別位進(jìn)行賦值。函數(shù)值的位數(shù)、函數(shù)端口甚至函數(shù)功能都可以參數(shù)化。. . .parameter MAX_BITS = 8;reg MAX_BITS: 1 D;function MAX_BITS: 1 reverse_bits; in

14、put MAX_BITS-1: 0 data; integer K; for (K = 0; K MAX_BITS; K = K + 1) reverse_ bits MAX_BITS - (K+ 1) = data K;endfunctionalways (posedge clk) D = reverse_bits (D) ;. . .關(guān)于使用任務(wù)和函數(shù)的小結(jié)任務(wù)和函數(shù)都是用來對(duì)設(shè)計(jì)中多處使用的公共代碼進(jìn)行定義;使用任務(wù)和函數(shù)可以將模塊分割成多個(gè)可獨(dú)立管理的子單元,增強(qiáng)模塊的可讀性和可維護(hù)性。任務(wù)可以具有任意多個(gè)輸入、輸入輸出和輸出變量;在任務(wù)中可以使用延遲、事件和時(shí)序控制結(jié)構(gòu);在任務(wù)中可以

15、調(diào)用其他任務(wù)與函數(shù);關(guān)于使用任務(wù)和函數(shù)的小結(jié)函數(shù)只能有一個(gè)返回值,并且至少要有一個(gè)輸入變量;函數(shù)中不能使用延遲、時(shí)間和時(shí)序控制結(jié)構(gòu),可以調(diào)用其他函數(shù),但是不能調(diào)用任務(wù)。當(dāng)聲明函數(shù)時(shí),Verilog仿真器都會(huì)隱含地聲明一個(gè)同名的寄存器變量,函數(shù)的返回值通過這個(gè)寄存器傳遞回調(diào)用處。提綱過程時(shí)序控制函數(shù)與任務(wù)系統(tǒng)任務(wù)(函數(shù))編譯預(yù)處理系統(tǒng)任務(wù)Verilog中提供了大量的系統(tǒng)任務(wù),用于顯示、文件操作、產(chǎn)生隨機(jī)數(shù)等。系統(tǒng)任務(wù)以$開頭。系統(tǒng)任務(wù)不能綜合,只能用于仿真。下面介紹幾種常用的系統(tǒng)任務(wù)。顯示任務(wù)進(jìn)一步劃分顯示和寫入任務(wù)探測(cè)監(jiān)控任務(wù)連續(xù)監(jiān)控任務(wù)顯示和寫入任務(wù)語法形式taskname (formats

16、pecification1, argumentlist1, formatspecification2, argumentlist2 ,., formatspecification N, argumentlist N) ;Taskname:$display/$displayb/$displayh/$displayo$write/$writeb/$writeh/$writeo顯示任務(wù)將特定信息輸出到標(biāo)準(zhǔn)輸出設(shè)備,并且?guī)в行薪Y(jié)束字符;而寫入任務(wù)輸出特定信息時(shí)不帶有行結(jié)束符。格式說明由字符串、 %引導(dǎo)的格式控制符和轉(zhuǎn)義字符構(gòu)成。例子:(“The value of Var1 is %d in decim

17、aln”, Var1)格式控制符%h 或%H : 十六進(jìn)制%d 或%D : 十進(jìn)制%o 或%O : 八進(jìn)制%b 或%B : 二進(jìn)制%c 或%C : ASCII字符%v 或%V : 線網(wǎng)信號(hào)長(zhǎng)度%m 或%M : 模塊層次名%s 或%S : 字符串%t 或%T : 當(dāng)前時(shí)間轉(zhuǎn)義字符n 換行t 制表符 字符 字符”O(jiān)OO 值為八進(jìn)制值O O O的字符% 字符%探測(cè)任務(wù)strobe$strobe$strobeb $strobeh$strobeo探測(cè)任務(wù)與顯示任務(wù)的區(qū)別$display任務(wù)與許多其他語句在同一時(shí)間單位執(zhí)行時(shí),這些語句和$display的執(zhí)行順序不確定。$strobe任務(wù)總是在其他語句執(zhí)行

18、完畢后再顯示數(shù)據(jù)。提供了一種同步機(jī)制。同一組中的b/h/o表示默認(rèn)輸出方式是二進(jìn)制/十六進(jìn)制/八進(jìn)制。監(jiān)控任務(wù)監(jiān)控任務(wù)有:$monitor /$monitorb/$monitorh/$monitoro特點(diǎn):連續(xù)監(jiān)控指定的參數(shù)。只要參數(shù)表中的參數(shù)值發(fā)生變化,整個(gè)參數(shù)表就在時(shí)間步結(jié)束時(shí)顯示。在任意時(shí)刻對(duì)于特定的變量只有一個(gè)監(jiān)控任務(wù)可以被激活。監(jiān)控任務(wù)的控制可以用如下兩個(gè)系統(tǒng)任務(wù)打開和關(guān)閉監(jiān)控$monitoroff; /禁止所有監(jiān)控任務(wù)。$monitoron; /使能所有監(jiān)控任務(wù)。文件輸入/輸出任務(wù)文件的打開integer file_handle = $fopen(“文件名”);返回的是一個(gè)文件指針

19、多通道描述符,只有1比特為1文件的關(guān)閉$fclose(文件指針);文件輸入/輸出任務(wù)文件的輸出$fdisplay/$fdisplayb/$fdisplayh/$fdisplayo$fwrite/$fwriteb/ $fwriteh/ $fwriteo/$fstrobe/ $fstrobeb/ $fstrobeh/ $fstrobeo/$fmonitor/$fmonitorb/$fmonitorh/$fmonitoro所有這些任務(wù)的第一個(gè)參數(shù)是已打開的文件句柄,其他與顯示/探測(cè)/監(jiān)測(cè)函數(shù)相同。文件輸入/輸出任務(wù)從文本文件中讀取數(shù)據(jù)$readmemh(file_nam, memory_name,

20、,start_addr, end_addr);$readmemb(file_nam, memory_name, ,start_addr, end_addr);文本文件包含空白空間、注釋和二進(jìn)制(對(duì)于$readmemb)或十六進(jìn)制(對(duì)于$readmemh)數(shù)字。每個(gè)數(shù)字由空白空間隔離。當(dāng)執(zhí)行系統(tǒng)任務(wù)時(shí),每個(gè)讀取的數(shù)字被指派給存儲(chǔ)器內(nèi)的一個(gè)地址。開始地址對(duì)應(yīng)于存儲(chǔ)器最左邊的索引。不需要文件打開仿真控制系統(tǒng)任務(wù)$finish;使仿真器退出,并將控制返回到操作系統(tǒng)。$stop;使仿真被掛起。在這一階段,交互命令可以被發(fā)送到仿真器。initial #500 $stop;500個(gè)時(shí)間單位后,仿真暫停。時(shí)序

21、校驗(yàn)任務(wù)$setup(data_event , reference_event , limit) ;檢查建立時(shí)間是否滿足要求(time_of_reference_event - time_of_data_event)limit報(bào)告時(shí)序沖突(timing violation);時(shí)序仿真內(nèi)部自動(dòng)產(chǎn)生。$hold(data_event , reference_event , limit) ;(time_of_data_event-time_of_reference_event)limit仿真時(shí)間函數(shù) $time:返回6 4位的整型仿真時(shí)間給調(diào)用它的模塊。 $stime:返回3 2位的時(shí)間。 $realtime:向調(diào)用它的模塊返回實(shí)型仿真時(shí)間。隨機(jī)數(shù)產(chǎn)生函數(shù)$random(seed)根據(jù)種子變量(s e e d)的取值按3 2位的有符號(hào)整數(shù)形式返回一個(gè)隨機(jī)數(shù)。種子變量(必須是寄存器、整數(shù)或時(shí)間寄存器類型)控制函數(shù)的返回值,即不同的種子將產(chǎn)生不同的隨機(jī)數(shù)。如果沒有指定種子,每次$random函數(shù)被調(diào)用時(shí)根據(jù)缺省種子產(chǎn)生隨機(jī)數(shù)。其他分布的隨機(jī)數(shù)產(chǎn)生$distuniform(seed,start,end)$distnormal(seed,mean,standarddeviation,upper)$distexp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論