VERILOG資料集 Verilog 教程 語法2_第1頁
VERILOG資料集 Verilog 教程 語法2_第2頁
VERILOG資料集 Verilog 教程 語法2_第3頁
VERILOG資料集 Verilog 教程 語法2_第4頁
VERILOG資料集 Verilog 教程 語法2_第5頁
已閱讀5頁,還剩115頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、語法詳細(xì)講解強(qiáng)制激勵(lì),在一個(gè)過程塊中,可以用兩種不同的方式對(duì)信號(hào)變量或表達(dá)式進(jìn)行連續(xù)賦值。 過程連續(xù)賦值往往是不可以綜合的,通常用在測試模塊中。 兩種方式都有各自配套的命令來停止賦值過程。 兩種不同方式均不允許賦值語句間的時(shí)間控制。 assign和deassign 適用于對(duì)寄存器類型的信號(hào)(例如:RTL級(jí)上 的節(jié)點(diǎn)或測試模塊中在多個(gè)地方被賦值的信號(hào))進(jìn)行賦值。 initial begin #10 assign top.dut.fsml.state_reg = init_state;,#20 deassign top.dut.fsml.state_reg; end force 和 release

2、 用于寄存器類型和網(wǎng)絡(luò)連接類型(例如:門級(jí)掃描寄存器的輸出)的強(qiáng)制賦值,強(qiáng)制改寫其它地方的賦值。 initial begin # 10 force top.dut.counter.scan_reg.q=0; # 20 release top.dut.counter.scan_reg.q; end 在以上兩個(gè)例子中,在10到20 這個(gè)時(shí)間段內(nèi),網(wǎng)絡(luò)或寄存器類型的信號(hào)被強(qiáng)制賦值,而別處對(duì)該變量的賦值均無效。 force的賦值優(yōu)先級(jí)高于assign。 如果先使用assign,再使用force對(duì)同一信號(hào)賦值,則信號(hào)的值為force所賦 的值,,語法詳細(xì)講解強(qiáng)制激勵(lì),語法詳細(xì)講解字符串,語法詳細(xì)講解強(qiáng)制

3、激勵(lì),語法詳細(xì)講解強(qiáng)制激勵(lì),當(dāng)執(zhí)行release后,則信號(hào)的值為assign所賦 的值。 如果用force對(duì)同一個(gè)信號(hào)賦了幾次值,再執(zhí)行release,則所有賦的值均不再存在。 可以對(duì)信號(hào)的某(確定)位、某些(確定)位或拼接的信號(hào),使用force和release賦值;但不能對(duì)信號(hào)的可變位使用force和release 來賦值。 不能對(duì)寄存器類型的信號(hào)某位或某些位使用 assign 和deassign 來賦值。,語法詳細(xì)講解強(qiáng)制激勵(lì),語法詳細(xì)講解建立時(shí)鐘,雖然有時(shí)在設(shè)計(jì)中會(huì)包含時(shí)鐘,但時(shí)鐘通常用在測試模塊中。下面 三個(gè)例子分別說明如何在門級(jí)和行為級(jí)建立不同波形的時(shí)鐘模型。 例1 簡單的對(duì)稱方波時(shí)

4、鐘:,語法詳細(xì)講解建立時(shí)鐘,reg clk; always begin #period/2 clk=0; #period/2 clk=1; end,reg go; wire clk; nand #(period/2) ul (clk,clk,go); initial begin go=0; #(period/2) go=1; end,注:在有些仿真器中,如果設(shè)計(jì)所用的時(shí)鐘是由與其相同抽象級(jí)別的時(shí)鐘模型產(chǎn)生的,則仿真器的性能就能得到提高。,例2簡單的帶延遲的對(duì)稱方波時(shí)鐘:,語法詳細(xì)講解建立時(shí)鐘,reg clk; initial begin clk=0; #(period) forever #(p

5、eriod/2) clk=!clk end,reg go; wire clk; nand #(period/2) ul (clk,clk,go); initial begin go=0; #(period) go=1; end,注:這兩個(gè)時(shí)鐘模型有些不同,行為描述的模型延遲期間一直是低電平,而門級(jí)描述的模型開始延遲有半個(gè)周期是不確定的。,語法詳細(xì)講解建立時(shí)鐘,例3. 帶延遲、頭一個(gè)脈沖不規(guī)則的、占空比不為1的時(shí)鐘:,語法詳細(xì)講解建立時(shí)鐘,reg clk; initial begin #(period+1) clk=1; #(period/2-1) forever begin #(period/

6、4) clk=0; #(3*period/4) clk=1; end end,reg go; wire clk; nand #(3*period/4,period/4) ul(clk,clk,go); initial begin #(period/4+1) go=0; #(5*period/4-1) go=1; end,注:這兩個(gè)時(shí)鐘模型也有些不同,行為描述的模型一開始就有確定的電平,而門級(jí)描述的模型有延遲開始時(shí)電平是不確定的。,語法詳細(xì)講解怎樣使用任務(wù),mocule bus_ctrl_tb reg 7:0 data; reg data_valid, data_rd; cpu ul(data_

7、valid,data,data_rd); initial begin cpu_driver(8b0000_0000); cpu_driver(8b1010_1010); cpu_driver(8b0101_0101); end task cpu_driver;,語法詳細(xì)講解怎樣使用任務(wù),語法詳細(xì)講解怎樣使用任務(wù),input 7:0 data_in; begin #30 data_valid=1; wait(data_rd=1); #20 data=data_in; wait(data_rd=0); #20 data=8hzz; #30 data_valid=0; end endtask,語法詳

8、細(xì)講解怎樣使用任務(wù),語法詳細(xì)講解怎樣使用任務(wù),endmodule 在測試模塊中使用任務(wù)可以提高程序代碼的效率,可以進(jìn)行多次重復(fù)操作。,語法詳細(xì)講解怎樣使用任務(wù),wait,wait,wait,wait,data1,data2,data3,data4,cpu_data,clk,data_valid,data_read,read_cpu_state,語法詳細(xì)講解存儲(chǔ)建模,目標(biāo) 學(xué)會(huì)使用Verilog進(jìn)行存儲(chǔ)建模。 學(xué)會(huì)在Verilog中進(jìn)行雙向口建模。,語法詳細(xì)講解存儲(chǔ)建模,存儲(chǔ)設(shè)備建模必須注意以下兩個(gè)方面的問題: 聲明存儲(chǔ)容量的大小。 提供對(duì)內(nèi)容的訪問權(quán)限,例如: 只讀 讀寫 同步讀寫 多次讀,同

9、時(shí)進(jìn)行一次寫 多次同步讀寫,同時(shí)提供一些方法保證一致性,語法詳細(xì)講解存儲(chǔ)設(shè)備建模,myrom.v timescale 1ns/10ps module myrom(read_data,addr,read_en_); input read_en_; input 3:0 addr; output 3:0 read_data; reg 3:0 read_data; reg 3:0 mem 0:15; initial $readmemb(“my_rom_data”,mem); always (addr or read_en_) if(!read_en_) read_data=memaddr; endmo

10、dule,語法詳細(xì)講解簡單ROM建模,my_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101,ROM的數(shù)據(jù)存儲(chǔ)在另外的一個(gè)獨(dú)立的文件中,語法詳細(xì)講解簡單ROM建模,上面所示的ROM模型中使用二維的存儲(chǔ)寄存器來定義存儲(chǔ)容量。ROM中的數(shù)據(jù)保存在一個(gè)獨(dú)立的文件中,如上面的右邊所示。這是一種保存ROM數(shù)據(jù)的通用的方法,它可以使數(shù)據(jù)和ROM模型分開。,語法詳細(xì)講解簡單RAM建模,timescale 1ns/1ns module mymem(data,addr,read,wri

11、te); inout 3:0 data; inout 3:0 addr; input read, write; reg 3:0 memory 0:15; /4 bits, 16 words /read assign data=read? memoryaddr:4bz; /write always (posedge write) memoryaddr=data; endmodule,RAM模型比ROM模型稍微復(fù)雜,因?yàn)樗仨毦哂凶x寫能力,而進(jìn)行讀寫時(shí)通常使用相同的數(shù)據(jù)總線,這就需要新技術(shù)來處理雙向總線。當(dāng)讀出口沒有被激活時(shí),RAM模型不再激勵(lì)總線,如果此時(shí)的總線寫入變量也沒有被激活,則總線進(jìn)入高

12、阻狀態(tài),這就避免了RAM中的讀寫競爭。,上述模型是可綜合的,但是許多工具只產(chǎn)生一系列的寄存器,這一般就需要更大的空間,從而比實(shí)際的存儲(chǔ)器的價(jià)格更昂貴。,語法詳細(xì)講解簡單RAM建模,例: module scalable_ROM(mem_word,address); parameter addr_bits=8; /size of address bus parameter wordsize=8; /width of a word parameter words=(1addr_bits); /size of mem output wordsize:1 mem_word; /word of memor

13、y input addr_bits:1 address; /address bus reg wordsize:1 mem 0:words-1; /mem declaration /output one word of memory wire wordsize:1 mem_word=memaddress; endmodule,語法詳細(xì)講解容量可變的存儲(chǔ)器建模,語法詳細(xì)講解容量可變的存儲(chǔ)器建模,上述的例子演示了怎樣通過設(shè)置字長和地址位數(shù)來定義一個(gè)只讀存儲(chǔ)設(shè)備。 在上例中,存儲(chǔ)字的范圍從0開始的,而不是從1開始,這是因?yàn)閮?nèi)存是直接通過地址線定位的,同樣地,也可以用下面的方法來定義內(nèi)存和定位: reg

14、 wordsize:1 mem 1:words; /memory starts at word 1 /address must be incremented to address all words in memory wire wordsize:1 mem_word=memaddress+1;,可以通過使用一個(gè)循環(huán)或系統(tǒng)任務(wù)來載入存有數(shù)據(jù)的整個(gè)存儲(chǔ)器。 使用循環(huán)把值賦給存儲(chǔ)數(shù)組。 for(i=0;imemsize;i=i+i) / initialize memory memai=wordsize1b1; 調(diào)用$readmem系統(tǒng)任務(wù)。 /load memory data form a fil

15、e $readmemb(“mem_file.txt”,mem);,語法詳細(xì)講解載入存儲(chǔ)設(shè)備,語法詳細(xì)講解怎樣使用雙向口,使用inout關(guān)鍵字聲明雙向口。 inout 7:0 databus; 使用雙向口需要遵循下面的規(guī)則: 一個(gè)inout口只能聲明為網(wǎng)絡(luò)類型,而不能是寄存器類型的。 因此仿真器能確定多個(gè)激勵(lì)源的最終值。 在設(shè)計(jì)中,每次只能激活inout的一個(gè)方向。 例如:當(dāng)使用總線讀RAM中的數(shù)據(jù)時(shí),同時(shí)又向RAM模 型的雙向數(shù)據(jù)總線寫數(shù)據(jù),就會(huì)產(chǎn)生邏輯競爭,導(dǎo)致總 線脫離。 必須為inout口設(shè)計(jì)控制邏輯,用來保證正確的操作。,語法詳細(xì)講解怎樣使用雙向口,注: 可以聲明一個(gè)inout口,用來

16、輸入或輸出數(shù)據(jù)。inout口默認(rèn)為網(wǎng)絡(luò)類型,不可以對(duì)網(wǎng)絡(luò)類型的數(shù)據(jù)進(jìn)行過程賦值,但可以在過程塊外對(duì)寄存器數(shù)據(jù)類型進(jìn)行連續(xù)賦值,或者把它與元器件相連。 必須為inout口設(shè)計(jì)控制邏輯,用來保證正確的操作。當(dāng)把inout口做為輸入口時(shí),必須使輸出邏輯失效。,使用元器件,語法詳細(xì)講解雙向口建模,en_a_b,en_b_a,bus_a,bus_b,module bus_xcvr (bus_a,bus_b,en_a_b,en_b_a); inout bus_a,bus_b; input en_a_b,en_b_a; bufifl b1(bus_b,bus_a,en_a_b); bufifl b2(bus

17、_a,bus_b,en_b_a); /結(jié)構(gòu)模塊邏輯 endmodule,當(dāng)en_a_b=1時(shí),元器件b1激活,bus_a的值傳到bus_b上,當(dāng)en_b_a=1時(shí),元器件b1激活,bus_b的值傳到bus_a上,語法詳細(xì)講解雙向口建模,注:在上頁的例子中,使用了en_a_b和en_b_a 來控制元器件bufifl,如果進(jìn)行同時(shí)控制,則得不到預(yù)期的結(jié)果。,使用連續(xù)賦值,en_a_b,en_b_a,bus_a,bus_b,module bus_xcvr (bus_a,bus_b,en_a_b,en_b_a); inout bus_a,bus_b; input en_a_b,en_b_a; assi

18、gn bus_b=en_a_b? bus_a:bz; assign bus_a=en_b_a? bus_b:bz; /結(jié)構(gòu)模塊邏輯 endmodule,當(dāng)en_a_b=1時(shí),bus_a的值傳到bus_b上,當(dāng)en_b_a=1時(shí),bus_b的值傳到bus_a上,語法詳細(xì)講解雙向口建模,注:在assign語句中,通過en_a_b和en_b_a控制bus_a與bus_b之間的數(shù)據(jù)交換。 如果進(jìn)行同時(shí)控制,則得不到預(yù)期的結(jié)果。,語法詳細(xì)講解雙向口建模,存儲(chǔ)口建模,語法詳細(xì)講解雙向口建模,測試模塊,RAM單元,數(shù)據(jù)總線,數(shù)據(jù) 寄存 器,rd,wr,module ram_cell(databus,rd.w

19、r); inout databus; input rd,wr; reg datareg; assign databus=rd? datareg:bz; always (negedge sr) datareg=databus; endmodule,當(dāng)rd等于1時(shí)datareg的值被賦給databus,當(dāng)wr的下降沿到達(dá)時(shí),databus的值被寫入datareg,注:上頁存儲(chǔ)單元在wr的下降沿到達(dá)時(shí)存入數(shù)據(jù)。上頁模塊在 wr處于高電平時(shí),通過數(shù)據(jù)總線寫入數(shù)據(jù),但必須保證wr的高電平維持時(shí)間長于數(shù)據(jù)的寫入時(shí)間。 在rd處于高電平時(shí),上述存儲(chǔ)單元通過數(shù)據(jù)總線讀出數(shù)據(jù)。由于此模型為單口存儲(chǔ)模型,因此wr

20、和rd不能同時(shí)為高電平,否則就得不到預(yù)期的結(jié)果。,語法詳細(xì)講解雙向口建模,目標(biāo) 學(xué)會(huì)怎樣定義或調(diào)用任務(wù)和函數(shù)。 學(xué)會(huì)怎樣使用命名塊。 學(xué)會(huì)怎樣使命名塊和任務(wù)失效。 熟悉有限狀態(tài)機(jī)及怎樣進(jìn)行有限狀態(tài)機(jī)顯式建模。,語法詳細(xì)講解第十七部分 Verilog中的高級(jí)結(jié)構(gòu),可以通過把代碼分成小的模塊或者使用任務(wù)和函數(shù),來把一項(xiàng)任務(wù) 分成許多較小的、易于管理的部分,從而提高代碼的重用性。 任務(wù) 一般用于執(zhí)行調(diào)試操作,或者行為的描述硬件 可以包含時(shí)間控制(# delays, , wait) 可以包含input, output 和 inout參數(shù) 可以調(diào)用其他的任務(wù)或函數(shù) 函數(shù) 一般用于計(jì)算,或者用來代替組合邏

21、輯 不能包含任何延遲;函數(shù)在零時(shí)間執(zhí)行 只能使用input參數(shù),但可以通過函數(shù)名來返回一個(gè)值。 可以調(diào)用其他的函數(shù),但不可以調(diào)用任務(wù),語法詳細(xì)講解第十七部分 Verilog中的高級(jí)結(jié)構(gòu),注: 必須在模塊內(nèi)調(diào)用任務(wù)和函數(shù)。 在任務(wù)和函數(shù)中不能聲明連線類型的變量。 所有的輸入和輸出都是真正的本地寄存器類型的數(shù)據(jù)。 只有當(dāng)任務(wù)或函數(shù)調(diào)用并執(zhí)行完后,才能有返回值。例如:當(dāng)任務(wù)或函數(shù)中包含一個(gè)forever循環(huán)時(shí),就不可能有返回值。,語法詳細(xì)講解第十七部分 Verilog中的高級(jí)結(jié)構(gòu),語法詳細(xì)講解Verilog 任務(wù),下面的任務(wù)含有時(shí)間控制和一個(gè)輸入,并且指向一個(gè)模塊變量,但是不包含輸出、總線和內(nèi)部變量

22、,不顯示任何內(nèi)容。 時(shí)間控制中使用的信號(hào)(例如 clk)不必是任務(wù)的輸入,這是因?yàn)檩斎胫抵幌蛉蝿?wù)內(nèi)部傳遞一次。 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),語法詳細(xì)講解整數(shù)和實(shí)常數(shù),(negedge clk); endtask initial begin clk=0; a=1; b=1; neg_clocks(3); /任務(wù)調(diào)用 a=0; neg_clocks(

23、5); b=0; end endmodule 主要特征: 任務(wù)調(diào)用是通過在Verilog模塊中寫入任務(wù)名來實(shí)現(xiàn)的。 任務(wù)中可以包含input, output和inout參數(shù)。,語法詳細(xì)講解Verilog 任務(wù),傳遞給任務(wù)的參數(shù)與任務(wù)I/O聲明參數(shù)的順序相同。雖然傳遞給任務(wù)的參數(shù)名可以和任務(wù)內(nèi)部I/O聲明的參數(shù)名相同,但是為了提高任務(wù)的模塊化程度,傳遞給任務(wù)的參數(shù)名通常是唯一的,而不使用與任務(wù)內(nèi)部I/O聲明的參數(shù)名相同的參數(shù)名。 在任務(wù)中可以使用時(shí)間控制。 在Verilog中,任務(wù)定義了一個(gè)新的范圍。 使用關(guān)鍵字disable禁止任務(wù)。 注意:不要在程序的不同部分同時(shí)調(diào)用同一個(gè)任務(wù)。這是因?yàn)槿蝿?wù)

24、只有一組本地變量,同時(shí)調(diào)用兩次將會(huì)導(dǎo)致錯(cuò)誤。這種情況通常發(fā)生在使用時(shí)間控制的任務(wù)中。 在任務(wù)或函數(shù)中,應(yīng)給在父模塊中聲明的變量加注釋。若在其它模塊中調(diào)用任務(wù)或函數(shù),任務(wù)和函數(shù)中所使用的變量必須包含在輸入/輸出口列表中。,語法詳細(xì)講解Verilog 任務(wù),下面模塊中的任務(wù)含有一個(gè)雙口總線和一個(gè)內(nèi)部變量,但是沒有輸入、輸出和定時(shí)控制,沒有引用本模塊的變量,不顯示任何內(nèi)容。 在任務(wù)調(diào)用時(shí),任務(wù)參數(shù)(口)類型被視為內(nèi)部寄存器類型。 parameter MAX_BITS=8; reg MAX_BITS:1 D; task reverse_bits; inout 7:0 data; /雙口總線被視為寄存器

25、類型! integer K; for (k=0; kMAX_BITS; K=K+1) reverse_bits MAXBITS (K+1)=dataK; endtask always (posedge clk) reverse_bits (D); ,語法詳細(xì)講解Verilog 任務(wù),下面模塊中的任務(wù)含有輸入、輸出、時(shí)間控制和一個(gè)內(nèi)部變量,并且引用了一個(gè)本模塊的變量,但是沒有輸出,不顯示任何內(nèi)容。 任務(wù)調(diào)用時(shí)的參數(shù)順序應(yīng)與任務(wù)定義中聲明的順序相同。 module mult(clk, a, b, out, en_mult); input clk, en_mult; input 3:0 a, b;

26、output 7:0 out; reg 15:0 out; always (posedge clk) multme(a, b, out); /任務(wù)調(diào)用,語法詳細(xì)講解Verilog 任務(wù),task muotme; /任務(wù)定義 input 3:0 xme, tome; output 7:0 result; wait (en_mult) result=xme*tome; endtask endmodule,語法詳細(xì)講解Verilog 任務(wù),module orand(a, b, c, d, e, out); input 7:0 a, b, c, d, e; output 7:0 out; reg 7:

27、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) endfunction endmodule,語法詳細(xì)講解Verilog 函數(shù),雖然函數(shù)不能包含定時(shí)控制,但是可以在包含定時(shí)控制的過程塊中調(diào)用函數(shù)。 在上述函數(shù)中使用了函數(shù)名f_or_and作為寄存器類型的變量。 要點(diǎn) 函數(shù)定義不能包含定時(shí)控制語句。 函數(shù)必須含有輸出,但不能含有輸出和總線口; 一個(gè)函數(shù)只能返回一

28、個(gè)值,該值的變量名與函數(shù)同名,數(shù)據(jù)類型默認(rèn)為reg類型。 傳遞給函數(shù)參數(shù)的順序與函數(shù)輸入?yún)?shù)聲明的順序相同。 函數(shù)定義必須包含在模塊定義之內(nèi)。 函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。 函數(shù)使Verilog有更廣闊的適用范圍。,語法詳細(xì)講解Verilog 函數(shù),雖然函數(shù)只能返回一個(gè)值,但是它們的返回值可以直接的賦給一個(gè)信號(hào)拼接,從而使它們有多個(gè)輸出。 o1, o2, o3, o4=f_or_and(a, b, c, d, e);,語法詳細(xì)講解Verilog 函數(shù),語法詳細(xì)講解命名塊,可以通過在關(guān)鍵字begin或fork后加上:塊名來給塊命名。 module named_blk; begin :s

29、eq_blk end fork : par_blk join endmodule 可以在命名塊中聲明本地變量。 可以使用disable禁止命名塊。,注意: 命名塊使Verilog有更廣闊的適用范圍。 命名塊的使用縮短了仿真的時(shí)間。,語法詳細(xì)講解命名塊,語法詳細(xì)講解禁止命名塊和任務(wù),module do_arith(out, a, b, c, d, e, clk, en_mult); input clk, en_mult; input 7:0 a, b, c, d, e; output 15:0 out; reg 14:0 out; always (posedge clk) begin : ari

30、th_block /*命名塊* reg 3:0 tmp1, tmp2; /*本地變量* tmp, tmp2=f_or_and(a, b, c, d, e); / 函數(shù)調(diào)用 if(en_mult) multme(tmp1, tmp2, out); /任務(wù)調(diào)用 end always (negedge en_mult) begin /停止計(jì)算 disable multme; /*禁止任務(wù)的執(zhí)行* diable arith_block; /*禁止命名塊的執(zhí)行* end /在此定義任務(wù)和函數(shù) endmodle,注意: disable語句用來終止命名塊或任務(wù)的執(zhí)行,因此可以在執(zhí)行所有的語句前,就能從命名塊

31、或任務(wù)的執(zhí)行中返回。 語法: disable 塊名 或 disable 任務(wù)名 禁止執(zhí)行命名塊或任務(wù)后,所有在事件隊(duì)列中安排的事件都將被刪除。 在綜合中一般不支持disable語句。 在上頁的例子中,只禁止命名塊也可以得到預(yù)期的結(jié)果:命名塊中所有的事件、任務(wù)和函數(shù)的執(zhí)行都將被取消。,語法詳細(xì)講解禁止命名塊和任務(wù),語法詳細(xì)講解有限狀態(tài)機(jī)(FSM),隱式FSM: 不需要狀態(tài)寄存器 仿真更加有效 只能很好的處理線形狀態(tài)改變 大部分綜合工具不支持隱式FSM,state 1,state 2,state 3,state 4,語法詳細(xì)講解編譯引導(dǎo)語句,顯式FSM: 結(jié)構(gòu)更加復(fù)雜 可以很方便的用來處理默認(rèn)狀態(tài)

32、 能夠處理復(fù)雜的狀態(tài)改變 所有的綜合工具均支持顯式FSM,語法詳細(xì)講解有限狀態(tài)機(jī)(FSM),state A,state A,state A,state A,state A,注意: 在隱式 FSMs 中,無論什么時(shí)候在一個(gè)時(shí)鐘周期內(nèi)寫數(shù)據(jù)和在在另一個(gè)時(shí)鐘周期內(nèi)讀數(shù)據(jù),都會(huì)創(chuàng)建寄存器。 所有的 FSMs 都必須能復(fù)位,狀態(tài)改變必須與一個(gè)單一的時(shí)鐘信號(hào)同步。 一般的,如果狀態(tài)改變比較簡單,又定義的比較好,而且綜合工具支持隱式狀態(tài)機(jī),就可以使用隱式類型。如果狀態(tài)改變比較復(fù)雜,最好使用顯式類型,這樣會(huì)更加有效。 隱式狀態(tài)機(jī)應(yīng)屬于行為級(jí),而不應(yīng)屬于RTL級(jí),代碼中主要包含循環(huán)、嵌入的定時(shí)控制,有時(shí)也含有命

33、名事件、wait 和 disable 語句。因此,綜合中一般不支持隱式機(jī)。,語法詳細(xì)講解有限狀態(tài)機(jī)(FSMs),語法詳細(xì)講解Verilog 函數(shù),要返回一個(gè)矢量值(超過一個(gè)位寬),可以在函數(shù)名前聲明變量的位寬。在函數(shù)中,將語句放在 begin 和 end 塊中。 在函數(shù)中無論多少次對(duì)函數(shù)名進(jìn)行賦值,值只返回一次。下面的函數(shù)中聲明了一個(gè)內(nèi)部整型變量。 module foo; input 7:0 loo; output 7:0 goo; /可以從連續(xù)賦值中調(diào)用函數(shù) wire 7:0 goo=zero_count(loo); function 3:0 zero_count; input 7:0 in

34、_bus;,語法詳細(xì)講解Verilog 函數(shù),integer I; begin zero_count=0; for(I=0; I8; I=I+1) if(!in_busI) zero_count=zero_count+1; end endfunction endmodule,可以聲明函數(shù)的返回值的類型為 integer、real 或 time, 可以在任何表達(dá)式中調(diào)用函數(shù)。 module checksub(neg, in_a, in_b); output neg; reg neg; function integer_subtr; input 7:0 in_a, in_b; subtr=in_a

35、-in_b; /結(jié)果可能是負(fù)數(shù) endfunction always (a or b) if(subtr(a, b)0) neg=1; else neg=0; endmodule,語法詳細(xì)講解Verilog 函數(shù),可以給返回變量的每一位賦值,還可以參數(shù)化函數(shù)的大小、函數(shù)口、甚至函數(shù)的行為。 parameter MAX_BITS=8; reg MAX_BITS:1 D; function MAX_BITS:1 reverse_bits; input 7:0 data; integer K; for(K=0; KMAX_BITS; K=K+1) reverse_bits MAX_BITS-(K+1

36、)=dataK; endfunction always (posedge clk) D=reverse_bits(D); ,語法詳細(xì)講解Verilog 函數(shù),語法詳細(xì)講解顯式有限狀態(tài)機(jī),module exp(out, datain, clk, rst); input clk, rst, datain; output out; reg out; ret state; always (pasedge clk or posedge rst) if(rst) state, out=2b00; else case(state) 1b0: begin out=1b0; if(!datain) state=

37、1b0; else state=1b1; end 1b1 begin,狀態(tài)變量,語法詳細(xì)講解顯式有限狀態(tài)機(jī),case語句,out=datain; state=1b0; end default: state, out=2b00; endcase endmodule 注: 可以在過程塊中使用一個(gè)單一的時(shí)鐘沿和一個(gè) case 語句來描述一個(gè)顯式狀態(tài)機(jī)。 必須規(guī)定一個(gè)狀態(tài)變量,用來定義狀態(tài)機(jī)的狀態(tài)。 要改變當(dāng)前的狀態(tài),必須改變狀態(tài)變量的值,狀態(tài)變量的值的改變要與時(shí)鐘沿同步。 最好為通常不會(huì)發(fā)生的狀態(tài)規(guī)定默認(rèn)動(dòng)作。,語法詳細(xì)講解顯式有限狀態(tài)機(jī),轉(zhuǎn)到下一個(gè)狀態(tài),默認(rèn)狀態(tài)指針,module imp(out,

38、 datain, clk, rst); output out; reg out; input clk, datain, rst; always (rst) /協(xié)同復(fù)位方法 if (rst) assing out=1b0; else begin deassign out; disable seq_block; /返回到初始狀態(tài) end always (posedge clk),語法詳細(xì)講解隱式有限狀態(tài)機(jī),begin: seq_block out=1b0; if(!datain) /狀態(tài)一:輸出零 disable seq_block; (posedge clk) /狀態(tài)二:輸出第二位 out=da

39、tain; end endmodule,語法詳細(xì)講解隱式有限狀態(tài)機(jī),注意: 可以在過程塊使用多個(gè)時(shí)鐘沿(一個(gè)狀態(tài)一個(gè))、條件語句、循環(huán)語句、disable語句來描述隱式FSM。 不必定義一個(gè)狀態(tài)變量。 若沒有強(qiáng)制狀態(tài)重復(fù)(例如:在循環(huán)語句或disable語句中強(qiáng)制狀態(tài)重復(fù)),當(dāng)下一個(gè)激活時(shí)鐘沿到達(dá)時(shí),狀態(tài)改變。下一個(gè)裝態(tài)將由條件語句決定。 在隱式狀態(tài)機(jī)中,很難規(guī)定一個(gè)默認(rèn)動(dòng)作。,語法詳細(xì)講解隱式有限狀態(tài)機(jī),目標(biāo) 學(xué)會(huì)怎樣創(chuàng)建邏輯使用的用戶定義的原語。 用戶定義的原語 (UDP) 的行為與嵌入的 Verilog 原器件相似,可以用一個(gè)表格來定義它的功能。,語法詳細(xì)講解第十八部分 用戶定義的原語,

40、在 Verilog 結(jié)構(gòu)模型中,可以使用: 二十多個(gè)門級(jí)原器件。 用戶定義的原語。 UDP 可用于ASIC 庫單元設(shè)計(jì)和小規(guī)模芯片和中規(guī)模芯片設(shè)計(jì)。 可以使用 UDP 擴(kuò)大預(yù)定義原器件的范圍。 UDP 是自包含的, 不能調(diào)用其他的模塊。 UDP 既可以用來代替時(shí)序邏輯元件,也可以代替組合邏輯元件。 使用真值表來描述 UDP 的行為。 調(diào)用 UDP 的方式與調(diào)用嵌入的原器件的方式相同。,語法詳細(xì)講解什么是UDP?,注: UDP 是一種很好的代替邏輯方式。 在嵌入原器件中,輸入中包含的 x 不能在輸出時(shí)自動(dòng)轉(zhuǎn)變成 x,而在 UDP 中則不會(huì)出現(xiàn)此種情況。 UDP 可以代替許多原器件邏輯。另外,UD

41、P 的仿真時(shí)間和內(nèi)存需要大大低于運(yùn)行分立原器件。如果仿真工具合適,相同邏輯的行為模型甚至可以更快。,語法詳細(xì)講解什么是UDP?,UDP 只能有一個(gè)輸出端,而且必須是端口的說明列表的第一項(xiàng)。 UDP 可以有多個(gè)輸入端,最多允許有 10 個(gè)。 UDP 所有端口變量必須是標(biāo)量,不允許使用雙向端口。 UDP 不支持 Z 邏輯值。 在仿真的開始,UDP 的輸出可以使用 initial 語句初始化為一個(gè)已知值。 UDP 不能被綜合。,語法詳細(xì)講解特征,注: UDP 只能有一個(gè)輸出。如果設(shè)計(jì)時(shí)的輸出多于一個(gè),則需要把其它的原器件連接到 UDP 輸出,或同時(shí)使用多個(gè) UDP。 UDP 輸入端最多可以有 10

42、個(gè),但是當(dāng)輸入的個(gè)數(shù)多于 5 個(gè)時(shí),內(nèi)存的需要將大大的增加。下頁表列出了輸入數(shù)目不同時(shí),每個(gè)輸入所需要的內(nèi)存。,語法詳細(xì)講解特征,語法詳細(xì)講解特征,組合邏輯示例:2-1 多路器,語法詳細(xì)講解示例,primitive multiplexer(o, a, b, s); output o; input s, a, b; table / a b s : o 0 ? 1 : 0; 1 ? 1 : 1; ? 0 0 : 0; ? 1 0 : 1; 0 0 x : 0; 1 1 x : 1; endtable endprimitive,原語名,輸出端口必須為第一個(gè)端口,注: 在模塊外定義 UDP 。 如果在

43、表中沒有規(guī)定輸入組合,將輸出 x。 表的列中元素的順序應(yīng)與端口列表中的一致。 表中的 ?的意義是:重復(fù)的輸入 0,1或 x ;邏輯值。 表中開始兩行表示:當(dāng) s等于 1 時(shí),不管 b 如何取值,輸出 o 將與 輸入 a 保持一致。 表中的下兩行表示:當(dāng) s 等于 0 時(shí),不管 a 如何取值,輸出 o 將與輸入 b 保持一致。 表中 的最后兩行使此器件更加的全面、準(zhǔn)確。它們表示:當(dāng)輸入 a 和 b 的邏輯值相同時(shí),如果 sel 等于 x,則輸出 o 的值 將與輸入 a 和 b 的值相同。這種行為不能使用 Verilog 嵌入原器件進(jìn)行建模。UDP 將 x 作為實(shí)際的未知值,而不是 Verilog

44、 值來進(jìn)行處理,使其比嵌入原器件更加準(zhǔn)確。,語法詳細(xì)講解示例,可以僅使用兩個(gè) UDP 設(shè)計(jì)全加器。 / 全加器進(jìn)位實(shí)現(xiàn)部分 primitive U_ADDR2_C(CO, A, B, CI); output CO; input A, B, CI, table / A B CI : CO 1 1 ? : 1; 1 ? 1 : 1; ? 1 1 : 1; 0 0 ? : 0; 0 ? 0 : 0; ? 0 0 : 0; endtalbe endprimitive,語法詳細(xì)講解組合示例:全加器,/全加器求和實(shí)現(xiàn)部分 primitive U_ADDR2_S(S, A, B,CI); output S;

45、 input A, B, CI; table / A B CI : S 0 0 0 : 0; 0 0 1 : 1; 0 1 0 : 1; 0 1 1 : 0; 1 0 0 : 1; 1 0 1 : 0; 1 1 0 : 0; 1 1 1 : 1; endtable endprimitive,語法詳細(xì)講解組合示例:全加器,若使用 UDP 設(shè)計(jì)全加器,僅需要兩個(gè) UDP; 而使用 Verilog 嵌入原器件,則需要 5 個(gè)Verilog 嵌入原器件。 大量使用全加器時(shí),這將大大減少內(nèi)存的需要。 事件的數(shù)目將大大降低。 ?代表 0,1或 x。,語法詳細(xì)講解組合邏輯示例:全加器,primitive l

46、atch(q, clock, data); output q; reg q; input clock, data; initial q=1b1; table / clock data current next / state state 0 1 : ? 1; 0 0 : ? 0; 1 ? : : -; endtable endprimitive,語法詳細(xì)講解級(jí)觸發(fā)時(shí)序邏輯示例:鎖存器,注意此寄存器的用法,此寄存器用來存儲(chǔ)。,輸出初始化為 1b1.,? 表示無須考慮輸入和當(dāng)前狀態(tài)的值,注: 鎖存器的動(dòng)作行為如下: 當(dāng)時(shí)鐘信號(hào)為 0時(shí),輸入數(shù)據(jù)的值直接傳給輸出。 當(dāng)時(shí)鐘信號(hào)為1時(shí),輸出保持當(dāng)前狀態(tài)

47、不變。 next state 欄中的 “-” 表示輸出保持不變。 輸出必須定義為寄存器類型,用來保存前一個(gè)狀態(tài)。 initial q=1b1; 是時(shí)序 UDP 的初始化語句。使用此語句可以在仿真的開始對(duì)輸出進(jìn)行賦值。 在實(shí)際的部件模型中,很少使用初始賦值。但在測試 UDP 的功能時(shí),初始賦值相當(dāng)有用。,語法詳細(xì)講解級(jí)觸發(fā)時(shí)序邏輯示例:鎖存器,primitive d_edge_ff (q, clk, data); output q; input clk, data; reg q; table / clk dat state next (01) 0 : ? : 0; (01) 1 : ? : 1;

48、 (0 x) 1 : 1 : 1; (0 x) 0 : 0 : 0; (x1) 0 : 0 : 0; (x1) 1 : 1 : 1;,語法詳細(xì)講解邊沿敏感的時(shí)序邏輯示例:D 觸發(fā)器,/ 忽略時(shí)鐘的下降沿 (?0) ? : ? : -; (1x) ? : ? : -; / 忽略時(shí)鐘穩(wěn)定時(shí)的數(shù)據(jù)改變 endtable endprimitive 在大多數(shù)情況下,可以在任何表入口語句中規(guī)定一個(gè)輸入過渡。 如果規(guī)定了任何輸入過渡,則必須規(guī)定所有輸入的所有過渡。,語法詳細(xì)講解邊沿敏感的時(shí)序邏輯示例:D 觸發(fā)器,建模類型概述 在任何時(shí)候,如果輸出直接由當(dāng)前的輸入組合決定,則此邏輯為組合邏輯。 如果邏輯中具有

49、記憶功能,則此邏輯為時(shí)序邏輯。在任何給定的時(shí)刻,如果輸出不能由輸入的狀態(tài)確定,則此邏輯具有記憶功能。,語法詳細(xì)講解第十九部分 Verilog綜合建模類型,綜合工具一般不支持下面的 Verilog 結(jié)構(gòu): initial 一些循環(huán)語句: repeat forever while for 的非結(jié)構(gòu)用法 一些數(shù)據(jù)類型 event real time,語法詳細(xì)講解不受支持的 Verilog 結(jié)構(gòu),UDPs forkjoin 塊 wait 過程連續(xù)賦值語句 assign 和 deassign force 和 release 一些操作符 = = = != =,語法詳細(xì)講解不受支持的 Verilog 結(jié)構(gòu),

50、兩個(gè)邊沿的任一個(gè) 過程塊到達(dá)所有輸入信號(hào)的任一個(gè)邊沿產(chǎn)生組合邏輯。此塊稱為組合塊。 always (a or b) / 實(shí)現(xiàn)與門 y=a,語法詳細(xì)講解過程塊,同步塊也可能對(duì)異步復(fù)位信號(hào)的改變敏感。 always (posedge clk or negedge rst_) if(!rst_) q=0; else q=d;,語法詳細(xì)講解過程塊,當(dāng)在同步塊中使用 reg 類型的信號(hào)變量時(shí): 如果此信號(hào)變量在一個(gè)時(shí)鐘周期中被附值,而在另一個(gè)時(shí)鐘周期中創(chuàng)建了其實(shí)例,則此信號(hào)變量僅作為硬件寄存器使用。 如果此信號(hào)變量也是基本輸出,則其將顯示在綜合列表中,但不一定是硬件寄存器。 否則,信號(hào)可以被優(yōu)化掉。 當(dāng)

51、在組合塊中使用 reg 類型的信號(hào)變量時(shí): 如果當(dāng)塊的任何輸入的值改變時(shí),此信號(hào)變量的值也隨之改變,則此信號(hào)變量在綜合輸出中并不屬于硬件寄存器。 如果當(dāng)塊的任何輸入的值改變時(shí),此信號(hào)變量的值并一定改變,則此信號(hào)變量在綜合輸出中屬于鎖存器。,語法詳細(xì)講解過程塊中寄存器類型的信號(hào)變量,同步寄存器示例 在下面的例子中,rega 僅用作臨時(shí)存儲(chǔ)器,因此它被優(yōu)化掉。 module ex1reg(d, clk, q); input d, clk; output q; reg q, rega; always (posedge clk) begin rega=0; if(d) rega=1; q=rega;

52、end endmodule,語法詳細(xì)講解寄存器,在下面的例子中,兩個(gè)時(shí)鐘沿包含兩個(gè)存儲(chǔ)元素,因此 rega 未被優(yōu)化掉。 module ex2reg(d, clk, q); input d, clk; output q; reg q, rega; always (posedge clk) begin rega=0; if(d) rega=1; end,語法詳細(xì)講解寄存器,always (posedge clk) q=rega; endmodule 注:在后面的例子中,塊執(zhí)行的順序是不確定的,因此 q 可以獲得 在前一個(gè)周期中賦給 rega 的值。,語法詳細(xì)講解寄存器,組合寄存器示例 在下面的兩

53、個(gè)例子中,rega 是一個(gè)臨時(shí)變量且被優(yōu)化掉。 在下面的例子中,y和rega 不斷被賦新值;因此,下例是一個(gè)純的組合邏輯。 module ex3reg(y, a, b, c); input a, b, c; output y; reg y, rega; always (a or b or c) begin,語法詳細(xì)講解寄存器,if(a end endmodule 在下面的例子中,rega 只是有時(shí)被賦新值;因此此例是一個(gè)以 y 作為輸出的鎖存器。,語法詳細(xì)講解寄存器,moudule ex4reg(y, a, b, c); input a, b, c; output y; reg y, rega

54、; always (a or b or c) begin if(a end endmodule,語法詳細(xì)講解寄存器,在下面的例子中,a、b 和 sl 均是塊的輸入。 在兩個(gè)例子中, sl 均為 always 塊的條件。 在第二個(gè)例子中, a 和 b 也用作always 塊的條件。 不完整敏感列表: module sens(a, q, b, sl); input a, b, sl; output q; reg q; always (sl) begin,語法詳細(xì)講解敏感列表,if(!sl) q=a; else q=b; end endmodule 完整敏感列表: module sens(q, a,

55、 b, sl); input a, b, sl; output q;,語法詳細(xì)講解敏感列表,reg q; always (sl or a or b) begin if(!sl) q=a; else q=b; end endmodule 注:在敏感列表中最好包括所有的輸入。對(duì)于不完整列表,不同的綜合工具處理的方法不同:一些綜合工具認(rèn)為不完整列表是不合,語法詳細(xì)講解敏感列表,法的,而其他的綜合工具則發(fā)出警告并將其當(dāng)作完整列表處理。因此,綜合輸出可能與 RTL 描述有所不同。,語法詳細(xì)講解敏感列表,在進(jìn)行連續(xù)賦值時(shí),輸入的任何改變都將導(dǎo)致輸出的同步更新。 module orand(out, a, b

56、, c, d, e); input a, b, c, d, e; output out; assign out=3 endmodule,語法詳細(xì)講解連續(xù)賦值,過程連續(xù)賦值是在過程塊(always 和 initial 塊)內(nèi)部對(duì)寄存器類型的數(shù)據(jù)進(jìn)行的連續(xù)賦值。 module latch_quasi(q, en, d); input en, d; output q; reg q; always (en) if(en) assign q=d; else deassign q; endmodule,語法詳細(xì)講解過程連續(xù)賦值,大部分綜合工具都能處理指令。 可在 Verilog 語句之間嵌入指令,Veri

57、log 仿真器將忽略嵌入的指令,但在綜合工具編譯時(shí),它們是有意義的。 不同的綜合工具有不同的指令語法,當(dāng)它們使用指令的目的都是優(yōu)化 RTL 代碼。 下面給出了一部分 Cadence 綜合工具中支持的綜合指令的列表,它們與其他綜合工具(例如:Synopsys 設(shè)計(jì)編譯器)中的指令非常相似。 /ambit synthesis on /ambit synthesis off /ambit synthesis case=full、parallel、mux,語法詳細(xì)講解綜合指令,結(jié)構(gòu)指令 /ambit synthesis architecture=cla or rpl 有限狀態(tài)機(jī)指令 /ambit synthesis enum xyz /ambit synthesis stat_vector sig state_vector_flag 注:指令中通常包括綜合工具或公司的名稱,例如:上面指令中的am

溫馨提示

  • 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)論