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

付費下載

下載本文檔

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

文檔簡介

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

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

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

4、鐘:,語法詳細講解建立時鐘,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,注:在有些仿真器中,如果設計所用的時鐘是由與其相同抽象級別的時鐘模型產(chǎn)生的,則仿真器的性能就能得到提高。,例2簡單的帶延遲的對稱方波時鐘:,語法詳細講解建立時鐘,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,注:這兩個時鐘模型有些不同,行為描述的模型延遲期間一直是低電平,而門級描述的模型開始延遲有半個周期是不確定的。,語法詳細講解建立時鐘,例3. 帶延遲、頭一個脈沖不規(guī)則的、占空比不為1的時鐘:,語法詳細講解建立時鐘,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,注:這兩個時鐘模型也有些不同,行為描述的模型一開始就有確定的電平,而門級描述的模型有延遲開始時電平是不確定的。,語法詳細講解怎樣使用任務,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;,語法詳細講解怎樣使用任務,語法詳細講解怎樣使用任務,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、細講解怎樣使用任務,語法詳細講解怎樣使用任務,endmodule 在測試模塊中使用任務可以提高程序代碼的效率,可以進行多次重復操作。,語法詳細講解怎樣使用任務,wait,wait,wait,wait,data1,data2,data3,data4,cpu_data,clk,data_valid,data_read,read_cpu_state,語法詳細講解存儲建模,目標 學會使用Verilog進行存儲建模。 學會在Verilog中進行雙向口建模。,語法詳細講解存儲建模,存儲設備建模必須注意以下兩個方面的問題: 聲明存儲容量的大小。 提供對內(nèi)容的訪問權限,例如: 只讀 讀寫 同步讀寫 多次讀,同

9、時進行一次寫 多次同步讀寫,同時提供一些方法保證一致性,語法詳細講解存儲設備建模,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,語法詳細講解簡單ROM建模,my_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101,ROM的數(shù)據(jù)存儲在另外的一個獨立的文件中,語法詳細講解簡單ROM建模,上面所示的ROM模型中使用二維的存儲寄存器來定義存儲容量。ROM中的數(shù)據(jù)保存在一個獨立的文件中,如上面的右邊所示。這是一種保存ROM數(shù)據(jù)的通用的方法,它可以使數(shù)據(jù)和ROM模型分開。,語法詳細講解簡單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模型稍微復雜,因為它必須具有讀寫能力,而進行讀寫時通常使用相同的數(shù)據(jù)總線,這就需要新技術來處理雙向總線。當讀出口沒有被激活時,RAM模型不再激勵總線,如果此時的總線寫入變量也沒有被激活,則總線進入高

12、阻狀態(tài),這就避免了RAM中的讀寫競爭。,上述模型是可綜合的,但是許多工具只產(chǎn)生一系列的寄存器,這一般就需要更大的空間,從而比實際的存儲器的價格更昂貴。,語法詳細講解簡單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,語法詳細講解容量可變的存儲器建模,語法詳細講解容量可變的存儲器建模,上述的例子演示了怎樣通過設置字長和地址位數(shù)來定義一個只讀存儲設備。 在上例中,存儲字的范圍從0開始的,而不是從1開始,這是因為內(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;,可以通過使用一個循環(huán)或系統(tǒng)任務來載入存有數(shù)據(jù)的整個存儲器。 使用循環(huán)把值賦給存儲數(shù)組。 for(i=0;imemsize;i=i+i) / initialize memory memai=wordsize1b1; 調用$readmem系統(tǒng)任務。 /load memory data form a fil

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

16、輸入或輸出數(shù)據(jù)。inout口默認為網(wǎng)絡類型,不可以對網(wǎng)絡類型的數(shù)據(jù)進行過程賦值,但可以在過程塊外對寄存器數(shù)據(jù)類型進行連續(xù)賦值,或者把它與元器件相連。 必須為inout口設計控制邏輯,用來保證正確的操作。當把inout口做為輸入口時,必須使輸出邏輯失效。,使用元器件,語法詳細講解雙向口建模,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); /結構模塊邏輯 endmodule,當en_a_b=1時,元器件b1激活,bus_a的值傳到bus_b上,當en_b_a=1時,元器件b1激活,bus_b的值傳到bus_a上,語法詳細講解雙向口建模,注:在上頁的例子中,使用了en_a_b和en_b_a 來控制元器件bufifl,如果進行同時控制,則得不到預期的結果。,使用連續(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; /結構模塊邏輯 endmodule,當en_a_b=1時,bus_a的值傳到bus_b上,當en_b_a=1時,bus_b的值傳到bus_a上,語法詳細講解雙向口建模,注:在assign語句中,通過en_a_b和en_b_a控制bus_a與bus_b之間的數(shù)據(jù)交換。 如果進行同時控制,則得不到預期的結果。,語法詳細講解雙向口建模,存儲口建模,語法詳細講解雙向口建模,測試模塊,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,當rd等于1時datareg的值被賦給databus,當wr的下降沿到達時,databus的值被寫入datareg,注:上頁存儲單元在wr的下降沿到達時存入數(shù)據(jù)。上頁模塊在 wr處于高電平時,通過數(shù)據(jù)總線寫入數(shù)據(jù),但必須保證wr的高電平維持時間長于數(shù)據(jù)的寫入時間。 在rd處于高電平時,上述存儲單元通過數(shù)據(jù)總線讀出數(shù)據(jù)。由于此模型為單口存儲模型,因此wr

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

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

22、,不顯示任何內(nèi)容。 時間控制中使用的信號(例如 clk)不必是任務的輸入,這是因為輸入值只向任務內(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),語法詳細講解整數(shù)和實常數(shù),(negedge clk); endtask initial begin clk=0; a=1; b=1; neg_clocks(3); /任務調用 a=0; neg_clocks(

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

24、只有一組本地變量,同時調用兩次將會導致錯誤。這種情況通常發(fā)生在使用時間控制的任務中。 在任務或函數(shù)中,應給在父模塊中聲明的變量加注釋。若在其它模塊中調用任務或函數(shù),任務和函數(shù)中所使用的變量必須包含在輸入/輸出口列表中。,語法詳細講解Verilog 任務,下面模塊中的任務含有一個雙口總線和一個內(nèi)部變量,但是沒有輸入、輸出和定時控制,沒有引用本模塊的變量,不顯示任何內(nèi)容。 在任務調用時,任務參數(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); ,語法詳細講解Verilog 任務,下面模塊中的任務含有輸入、輸出、時間控制和一個內(nèi)部變量,并且引用了一個本模塊的變量,但是沒有輸出,不顯示任何內(nèi)容。 任務調用時的參數(shù)順序應與任務定義中聲明的順序相同。 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); /任務調用,語法詳細講解Verilog 任務,task muotme; /任務定義 input 3:0 xme, tome; output 7:0 result; wait (en_mult) result=xme*tome; endtask endmodule,語法詳細講解Verilog 任務,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ù)調用 function 7:0 f_or_and; input 7:0 a, b, c, d, e; if(e=1) f_or_and=(a|b) endfunction endmodule,語法詳細講解Verilog 函數(shù),雖然函數(shù)不能包含定時控制,但是可以在包含定時控制的過程塊中調用函數(shù)。 在上述函數(shù)中使用了函數(shù)名f_or_and作為寄存器類型的變量。 要點 函數(shù)定義不能包含定時控制語句。 函數(shù)必須含有輸出,但不能含有輸出和總線口; 一個函數(shù)只能返回一

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

29、eq_blk end fork : par_blk join endmodule 可以在命名塊中聲明本地變量。 可以使用disable禁止命名塊。,注意: 命名塊使Verilog有更廣闊的適用范圍。 命名塊的使用縮短了仿真的時間。,語法詳細講解命名塊,語法詳細講解禁止命名塊和任務,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ù)調用 if(en_mult) multme(tmp1, tmp2, out); /任務調用 end always (negedge en_mult) begin /停止計算 disable multme; /*禁止任務的執(zhí)行* diable arith_block; /*禁止命名塊的執(zhí)行* end /在此定義任務和函數(shù) endmodle,注意: disable語句用來終止命名塊或任務的執(zhí)行,因此可以在執(zhí)行所有的語句前,就能從命名塊

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

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

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

34、_bus;,語法詳細講解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, 可以在任何表達式中調用函數(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; /結果可能是負數(shù) endfunction always (a or b) if(subtr(a, b)0) neg=1; else neg=0; endmodule,語法詳細講解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); ,語法詳細講解Verilog 函數(shù),語法詳細講解顯式有限狀態(tài)機,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)變量,語法詳細講解顯式有限狀態(tài)機,case語句,out=datain; state=1b0; end default: state, out=2b00; endcase endmodule 注: 可以在過程塊中使用一個單一的時鐘沿和一個 case 語句來描述一個顯式狀態(tài)機。 必須規(guī)定一個狀態(tài)變量,用來定義狀態(tài)機的狀態(tài)。 要改變當前的狀態(tài),必須改變狀態(tài)變量的值,狀態(tài)變量的值的改變要與時鐘沿同步。 最好為通常不會發(fā)生的狀態(tài)規(guī)定默認動作。,語法詳細講解顯式有限狀態(tài)機,轉到下一個狀態(tài),默認狀態(tài)指針,module imp(out,

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

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

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

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

42、個,但是當輸入的個數(shù)多于 5 個時,內(nèi)存的需要將大大的增加。下頁表列出了輸入數(shù)目不同時,每個輸入所需要的內(nèi)存。,語法詳細講解特征,語法詳細講解特征,組合邏輯示例:2-1 多路器,語法詳細講解示例,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,原語名,輸出端口必須為第一個端口,注: 在模塊外定義 UDP 。 如果在

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

44、 值來進行處理,使其比嵌入原器件更加準確。,語法詳細講解示例,可以僅使用兩個 UDP 設計全加器。 / 全加器進位實現(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,語法詳細講解組合示例:全加器,/全加器求和實現(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,語法詳細講解組合示例:全加器,若使用 UDP 設計全加器,僅需要兩個 UDP; 而使用 Verilog 嵌入原器件,則需要 5 個Verilog 嵌入原器件。 大量使用全加器時,這將大大減少內(nèi)存的需要。 事件的數(shù)目將大大降低。 ?代表 0,1或 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,語法詳細講解級觸發(fā)時序邏輯示例:鎖存器,注意此寄存器的用法,此寄存器用來存儲。,輸出初始化為 1b1.,? 表示無須考慮輸入和當前狀態(tài)的值,注: 鎖存器的動作行為如下: 當時鐘信號為 0時,輸入數(shù)據(jù)的值直接傳給輸出。 當時鐘信號為1時,輸出保持當前狀態(tài)

47、不變。 next state 欄中的 “-” 表示輸出保持不變。 輸出必須定義為寄存器類型,用來保存前一個狀態(tài)。 initial q=1b1; 是時序 UDP 的初始化語句。使用此語句可以在仿真的開始對輸出進行賦值。 在實際的部件模型中,很少使用初始賦值。但在測試 UDP 的功能時,初始賦值相當有用。,語法詳細講解級觸發(fā)時序邏輯示例:鎖存器,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;,語法詳細講解邊沿敏感的時序邏輯示例:D 觸發(fā)器,/ 忽略時鐘的下降沿 (?0) ? : ? : -; (1x) ? : ? : -; / 忽略時鐘穩(wěn)定時的數(shù)據(jù)改變 endtable endprimitive 在大多數(shù)情況下,可以在任何表入口語句中規(guī)定一個輸入過渡。 如果規(guī)定了任何輸入過渡,則必須規(guī)定所有輸入的所有過渡。,語法詳細講解邊沿敏感的時序邏輯示例:D 觸發(fā)器,建模類型概述 在任何時候,如果輸出直接由當前的輸入組合決定,則此邏輯為組合邏輯。 如果邏輯中具有

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

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

51、在組合塊中使用 reg 類型的信號變量時: 如果當塊的任何輸入的值改變時,此信號變量的值也隨之改變,則此信號變量在綜合輸出中并不屬于硬件寄存器。 如果當塊的任何輸入的值改變時,此信號變量的值并一定改變,則此信號變量在綜合輸出中屬于鎖存器。,語法詳細講解過程塊中寄存器類型的信號變量,同步寄存器示例 在下面的例子中,rega 僅用作臨時存儲器,因此它被優(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,語法詳細講解寄存器,在下面的例子中,兩個時鐘沿包含兩個存儲元素,因此 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,語法詳細講解寄存器,always (posedge clk) q=rega; endmodule 注:在后面的例子中,塊執(zhí)行的順序是不確定的,因此 q 可以獲得 在前一個周期中賦給 rega 的值。,語法詳細講解寄存器,組合寄存器示例 在下面的兩

53、個例子中,rega 是一個臨時變量且被優(yōu)化掉。 在下面的例子中,y和rega 不斷被賦新值;因此,下例是一個純的組合邏輯。 module ex3reg(y, a, b, c); input a, b, c; output y; reg y, rega; always (a or b or c) begin,語法詳細講解寄存器,if(a end endmodule 在下面的例子中,rega 只是有時被賦新值;因此此例是一個以 y 作為輸出的鎖存器。,語法詳細講解寄存器,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,語法詳細講解寄存器,在下面的例子中,a、b 和 sl 均是塊的輸入。 在兩個例子中, sl 均為 always 塊的條件。 在第二個例子中, a 和 b 也用作always 塊的條件。 不完整敏感列表: module sens(a, q, b, sl); input a, b, sl; output q; reg q; always (sl) begin,語法詳細講解敏感列表,if(!sl) q=a; else q=b; end endmodule 完整敏感列表: module sens(q, a,

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

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

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

溫馨提示

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

評論

0/150

提交評論