Verilog的用途_第1頁
Verilog的用途_第2頁
Verilog的用途_第3頁
Verilog的用途_第4頁
Verilog的用途_第5頁
已閱讀5頁,還剩124頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Verilog的用途,Verilog的主要應(yīng)用包括: ASIC和FPGA工程師編寫可綜合的RTL代碼 高抽象級系統(tǒng)仿真進(jìn)行系統(tǒng)結(jié)構(gòu)開發(fā) 測試工程師用于編寫各種層次的測試程序 用于ASIC和FPGA單元或更高層次的模塊的模型開發(fā),抽象級(Levels of Abstraction),Verilog既是一種行為描述的語言也是一種結(jié)構(gòu)描述語言。Verilog模型可以是實際電路的不同級別的抽象。這些抽象的級別包括:,系統(tǒng)說明 -設(shè)計文檔/算法描述 RTL/功能級 -Verilog 門級/結(jié)構(gòu)級 -Verilog 版圖/物理級 -幾何圖形,行為綜合 綜合前仿真 邏輯綜合 綜合后仿真 版圖,抽象級(Lev

2、els of Abstraction),在抽象級上需要進(jìn)行折衷,系統(tǒng)說明 -設(shè)計文檔/算術(shù)描述 RTL/功能級 -Verilog 門級/結(jié)構(gòu)級 -Verilog 版圖/物理級 -幾何圖形,詳細(xì)程度 低 高,輸入/仿真速度 高 低,抽象級(Levels of Abstraction),Verilog可以在三種抽象級上進(jìn)行描述,行為級 用功能塊之間的數(shù)據(jù)流對系統(tǒng)進(jìn)行描述 在需要時在函數(shù)塊之間進(jìn)行調(diào)度賦值。 RTL級/功能級 用功能塊內(nèi)部或功能塊之間的數(shù)據(jù)流和控制信號描述系統(tǒng) 基于一個已定義的時鐘的周期來定義系統(tǒng)模型 結(jié)構(gòu)級/門級 用基本單元(primitive)或低層元件(component)的連

3、接來描述系統(tǒng)以得到更高的精確性,特別是時序方面。 在綜合時用特定工藝和低層元件將RTL描述映射到門級網(wǎng)表,抽象級(Levels of Abstraction),設(shè)計工程師在不同的設(shè)計階段采用不同的抽象級 首先在行為級描述各功能塊,以降低描述難度,提高仿真速度。 在綜合前將各功能模塊進(jìn)行RTL級描述。 用于綜合的庫中的大多數(shù)單元采用結(jié)構(gòu)級描述。在本教程中的結(jié)構(gòu)級描述部分將對結(jié)構(gòu)級(門級)描述進(jìn)行更詳細(xì)的說明。 Verilog還有一定的晶體管級描述能力及算法級描述能力,行為級和RTL級,MUX的行為可以描述為:只要信號a或b或sel發(fā)生變化,如果sel為0則選擇a輸出;否則選擇b輸出。,modul

4、e muxtwo (out, a, b, sel); input a, b, sel; output out; reg out; always ( sel or a or b) if (! sel) out = a; else out = b; endmodule,這個行為級RTL描述不處理X和Z狀態(tài)輸入,并且沒有延時。 在行為級模型中,邏輯功能描述采用高級語言結(jié)構(gòu),如, while,wait,if, case。 Testbench(test fixture)通常采用行為級描述。所有行為級結(jié)構(gòu)在testbench描述中都可以采用。 RTL模型中數(shù)據(jù)流都是基于時鐘的。任何時鐘元件在時鐘沿處的行為

5、都要精確描述。RTL級描述是行為級Verilog的子集。,結(jié)構(gòu)級描述,結(jié)構(gòu)級Verilog適合開發(fā)小規(guī)模元件,如ASIC和FPGA的單元 Verilog內(nèi)部帶有描述基本邏輯功能的基本單元(primitive),如and門。 用戶可以定義自己的基本單元UDP(User Defined Privitives) 綜合產(chǎn)生的結(jié)果網(wǎng)表通常是結(jié)構(gòu)級的。用戶可以用結(jié)構(gòu)級描述粘接(glue)邏輯。 下面是MUX的結(jié)構(gòu)級描述,采用Verilog基本單元(門)描述。描述中含有傳輸延時。,module twomux (out, a, b, sl); input a, b, sl; output out; not u

6、1 (nsl, sl ); and #1 u2 (sela, a, nsl); and #1 u3 (selb, b, sl); or #2 u4 (out, sela, selb); endmodule,綜合不支持!,僅需一種語言,Verilog的一個主要特點(diǎn)是可應(yīng)用于各種抽象級。建模時可采用門級和RTL級混合描述,在開發(fā)testfixture時可以采用行為級描述。,復(fù)習(xí),什么是Verilog ? Verilog是公開的嗎? 設(shè)計時什么時候采用Verilog RTL級描述? Verilog適合做什么樣的設(shè)計?,解答: Verilog是用于硬件描述的具有時間概念的并行編程語言 Verilog是

7、一種公開語言, 由OVI負(fù)責(zé)組織,有IEEE1394標(biāo)準(zhǔn) RTL描述用于綜合,或用于必須精確到每個時鐘周期的模型的建模。 Verilog適用于各種抽象級模型的開發(fā)及驗證,第四章 設(shè)計舉例,進(jìn)一步學(xué)習(xí)Verilog的結(jié)構(gòu)描述和行為描述 Verilog混合(抽象)級仿真,學(xué)習(xí)目標(biāo):,語言的主要特點(diǎn),module(模塊),module能夠表示: 物理塊,如IC或ASIC單元 邏輯塊,如一個CPU設(shè)計的ALU部分 整個系統(tǒng) 每一個模塊的描述從關(guān)鍵詞module開始,有一個名稱(如SN74LS74,DFF,ALU等等),由關(guān)鍵詞endmodule結(jié)束。,module是層次化設(shè)計的基本構(gòu)件,邏輯描述放在m

8、odule內(nèi)部,語言的主要特點(diǎn)模塊端口(module ports),端口在模塊名字后的括號中列出,端口可以說明為input, output及inout,端口等價于硬件的引腳(pin),注意模塊的名稱DFF,端口列表及說明 模塊通過端口與外部通信,語言的主要特點(diǎn),模塊實例化(module instances),module DFF (d, clk, clr, q, qb); . endmodule module REG4( d, clk, clr, q, qb); output 3: 0 q, qb; input 3: 0 d; input clk, clr; DFF d0 (d 0, clk,

9、 clr, q 0, qb 0); DFF d1 (d 1, clk, clr, q 1, qb 1); DFF d2 (d 2, clk, clr, q 2, qb 2); DFF d3 (d 3, clk, clr, q 3, qb 3); endmodule,語言的主要特點(diǎn),可以將模塊的實例通過端口連接起來構(gòu)成一個大的系統(tǒng)或元件。 在上面的例子中,REG4有模塊DFF的四個實例。注意,每個實例都有自己的名字(d0, d1, d2, d3)。實例名是每個對象唯一的標(biāo)記,通過這個標(biāo)記可以查看每個實例的內(nèi)部。 實例中端口的次序與模塊定義的次序相同。 模塊實例化與調(diào)用程序不同。每個實例都是模塊的

10、一個完全的拷貝,相互獨(dú)立、并行。,模塊實例化(module instances),DUT 被測器件 (device under test),module MUX2_1 (out, a, b, sel); / Port declarations output out; input a, b, sel; wire out, a, b, sel; wire sel_, a1, b1; / The netlist not (sel_, sel); and (a1, a, sel_); and (b1, b, sel); or (out, a1, b1); endmodule,注釋行,已定義的 Veri

11、log基本單元的實例,a, b, sel是輸入端口,out是輸出端口。所有信號通過這些端口從模塊輸入/輸出。 另一個模塊可以通過模塊名及端口說明使用多路器。實例化多路器時不需要知道其實現(xiàn)細(xì)節(jié)。這正是自上而下設(shè)計方法的一個重要特點(diǎn)。模塊的實現(xiàn)可以是行為級也可以是門級,但并不影響高層次模塊對它的使用。,多路器由關(guān)鍵詞module和endmodule開始及結(jié)束。,Test Fixture template,module testfixture; / Data type declaration / Instantiate modules / Apply stimulus / Display resul

12、ts endmodule,為什么沒 有端口?,由于testfixture是最頂層模塊,不會被其它模塊實例化。因此不需要有端口。,Test Fixture 如何說明實例,module testfixture; / Data type declaration / Instantiate modules MUX2_1 mux (out, a, b, sel); / Apply stimulus / Display results endmodule,多路器實例化語句,MUX的實例化語句包括: 模塊名字:與引用模塊相同 實例名字:任意,但要符合標(biāo)記命名規(guī)則 端口列表:與引用模塊的次序相同,Test F

13、ixture 過程(procedural block),所有過程在時間0執(zhí)行一次 過程之間是并行執(zhí)行的,過程語句有兩種: initial :只執(zhí)行一次 always :循環(huán)執(zhí)行,Test Fixture 過程(procedural block),通常采用過程語句進(jìn)行行為級描述。test fixture的激勵信號在一個過程語句中描述。 過程語句的活動與執(zhí)行是有差別的 所有過程在時間0處于活動狀態(tài),并根據(jù)用戶定義的條件等待執(zhí)行; 所有過程并行執(zhí)行,以描述硬件內(nèi)在的并行性;,Test Fixture 過程(procedural block),通常采用過程語句進(jìn)行行為級描述。test fixture的

14、激勵信號在一個過程語句中描述。 過程語句的活動與執(zhí)行是有差別的 所有過程在時間0處于活動狀態(tài),并根據(jù)用戶定義的條件等待執(zhí)行; 所有過程并行執(zhí)行,以描述硬件內(nèi)在的并行性;,完整的Test Fixture,module testfixture; / Data type declaration reg a, b, sel; wire out; / MUX instance MUX2_1 mux (out, a, b, sel); / Apply stimulus initial begin a = 0; b = 1; sel = 0; #5 b = 0; #5 b = 1; sel = 1; #5

15、a = 1; #5 $finish; end / Display results initial $monitor($time, out=%b a=%b b=%b sel=%b, out, a, b, sel); endmodule,0 out= 0 a= 0 b= 1 sel= 0 5 out= 0 a= 0 b= 0 sel= 0 10 out= 1 a= 0 b= 1 sel= 1 15 out= 1 a= 1 b= 1 sel= 1,結(jié)果輸出,時間單位末的概念,timescale 1ns/1ns module testfixture; / Data type declaration r

16、eg a, b, sel; wire out; / MUX instance MUX2_1 mux (out, a, b, sel); / Apply stimulus initial begin a = 0; b = 1; sel = 0; #5.7 b = 0; #5 b = 1; sel = 1; #5 a = 1; #5 $finish; end / Display results initial $monitor($time, out=%b a=%b b=%b sel=%b, out, a, b, sel); endmodule,0 out= 0 a= 0 b= 1 sel= 0 6

17、 out= 0 a= 0 b= 0 sel= 0 11 out= 1 a= 0 b= 1 sel= 1 16 out= 1 a= 1 b= 1 sel= 1,結(jié)果輸出,復(fù)習(xí),Verilog的基本構(gòu)建模塊是什么?是如何構(gòu)成一個系統(tǒng)的? module怎樣與其它模塊通信? 仿真時兩個性質(zhì)不同的模塊是什么? 在test fixture中兩類不同的過程語句是什么?它們有什么不同? 用什么方法能以文本格式顯示仿真結(jié)果?,module是基本構(gòu)建單元。在module中實例化另一個module可以構(gòu)成一個復(fù)雜的層次化系統(tǒng)。 module之間通過端口的連接進(jìn)行互相通信 兩個模塊是設(shè)計模塊和激勵模塊。設(shè)計模塊又稱為

18、DUT,激勵模塊又稱為testbench或test fixture。測試模塊用于設(shè)計模塊驗證 在testbench中用到的兩類過程語句是initial和always。其不同處是initial只執(zhí)行一次,而always循環(huán)執(zhí)行。 $monitor語句以文本格式顯示仿真結(jié)果,空白符和注釋,module MUX2_1 (out, a, b, sel); / Port declarations output out; input sel, / control input b, /* data inputs */ a; /* The netlist logic selects input ”a” whe

19、n sel = 0 and it selects ”b” when sel = 1. */ not (sel_, sel); and (a1, a, sel_), (b1, b, sel); / What does this line do? or (out, a1, b1); endmodule,格式自由 使用空白符提高可讀性及代碼組織。Verilog忽略空白符除非用于分開其它的語言標(biāo)記。,多行注釋,在/* */內(nèi),單行注釋 到行末結(jié)束,整數(shù)常量和實數(shù)常量,整數(shù)的大小可以定義也可以不定義。整數(shù)表示為: 其中 size :大小,由十進(jìn)制數(shù)表示的位數(shù)(bit)表示。缺省為32位 base:數(shù)基,

20、可為2(b)、8(o)、10(d)、16(h)進(jìn)制。缺省為10進(jìn)制 value:是所選數(shù)基內(nèi)任意有效數(shù)字,包括X、Z。 實數(shù)常量可以用十進(jìn)制或科學(xué)表示法表示。,Verilog中,常量(literals)可是整數(shù)也可以是實數(shù),整數(shù)常量和實數(shù)常量,整數(shù)的大小可以定義也可以不定義。整數(shù)表示為: 數(shù)字中(_)忽略,便于查看 沒有定義大小(size)整數(shù)缺省為32位 缺省數(shù)基為十進(jìn)制 數(shù)基(base)和數(shù)字(16進(jìn)制)中的字母無大小寫之分 當(dāng)數(shù)值value大于指定的大小時,截去高位。如 2b1101表示的是2b01 實數(shù)常量 實數(shù)可用科學(xué)表示法或十進(jìn)制表示 科學(xué)表示法表示方式: , 表示: 尾數(shù)10指數(shù)

21、,字符串(string),字符串要在一行中用雙引號括起來,也就是不能跨行。 字符串中可以使用一些C語言轉(zhuǎn)義(escape)符,如t n 可以使用一些C語言格式符(如%b)在仿真時產(chǎn)生格式化輸出: ”This is a normal string” ”This string has a t tab and ends with a new linen” ”This string formats a value: val = %b”,Verilog中,字符串大多用于顯示信息的命令中。Verilog沒有字符串?dāng)?shù)據(jù)類型,字符串(string),轉(zhuǎn)義符及格式符將在驗證支持部分討論 格式符,轉(zhuǎn)義符,格式符%

22、0d表示沒有前導(dǎo)0的十進(jìn)制數(shù),標(biāo)識符(identifiers),標(biāo)識符是用戶在描述時給Verilog對象起的名字 標(biāo)識符必須以字母(a-z, A-Z)或( _ )開頭,后面可以是字母、數(shù)字、( $ )或( _ )。 最長可以是1023個字符 標(biāo)識符區(qū)分大小寫,sel和SEL是不同的標(biāo)識符 模塊、端口和實例的名字都是標(biāo)識符 module MUX2_1 (out, a, b, sel); output out; input a, b, sel; not not1 (sel_, sel); and and1 (a1, a, sel_); and and2 (b1, b, sel); or or1 (

23、out, a1, b1); endmodule,Verilog標(biāo)識符,標(biāo)識符(identifiers),有效標(biāo)識符舉例: shift_reg_a busa_index _bus3 無效標(biāo)識符舉例: 34net / 開頭不是字母或“_” a*b_net / 包含了非字母或數(shù)字, “$” “_” n238 /包含了非字母或數(shù)字, “$” “_” Verilog區(qū)分大小寫,所有Verilog關(guān)鍵詞使用小寫字母。,轉(zhuǎn)義標(biāo)識符( Escaped identifiers),可以包含任何可打印字符 反斜杠及空白符不是標(biāo)識符的一部分 module 2:1MUX (out, a, b, sel); output

24、 out; input a, b, sel; not not1(sel ,sel); and and1( a1, a, sel ); and and2( b1, b, sel); or or1( out, a1, b1); endmodule 使用轉(zhuǎn)義符可能會產(chǎn)生一些問題,并且不是所有工具都支持。有時用轉(zhuǎn)義符完成一些轉(zhuǎn)換,如產(chǎn)生邏輯圖的Verilog網(wǎng)表。綜合工具輸出綜合網(wǎng)表時也使用轉(zhuǎn)義符。不建議使用轉(zhuǎn)義符。,轉(zhuǎn)義標(biāo)識符由反斜杠“”開始,空白符結(jié)束,Escaped Identifiers,轉(zhuǎn)義標(biāo)識符( Escaped identifiers),轉(zhuǎn)義標(biāo)識符允許用戶在標(biāo)識符中使用非法字符。如: #

25、sel busa+ index A,B top. 3inst .net1 / 在層次化名字中轉(zhuǎn)義符 轉(zhuǎn)義標(biāo)識符必須以空格結(jié)束,語言專用標(biāo)記( tokens),系統(tǒng)任務(wù)及函數(shù),$ $符號指示這是系統(tǒng)任務(wù)和函數(shù) 系統(tǒng)函數(shù)有很多,如: 返回當(dāng)前仿真時間$time 顯示/監(jiān)視信號值($display, $monitor) 停止仿真$stop 結(jié)束仿真$finish $monitor($time, “a = %b, b = %h”, a, b); 當(dāng)信號a或b的值發(fā)生變化時,系統(tǒng)任務(wù)$monitor顯示當(dāng)前仿真時間,信號a值(二進(jìn)制格式), 信號b值(16進(jìn)制格式)。,語言專用標(biāo)記( tokens),延

26、時說明,“#”用于說明過程(procedural)語句和門的實例的延時,但不能用于模塊的實例化。 module MUX2_ 1 (out, a, b, sel) ; output out ; input a, b, sel ; not #1 not1( sel_, sel); and #2 and1( a1, a, sel_); and #2 and2( b1, b, sel); or #1 or1( out, a1, b1); endmodule 門延時有很多類名字:門延時(gate delay),傳輸延時(propagation delay),固有延時(intrinsic delay),對

27、象內(nèi)在延時(intra-object delay),復(fù)習(xí),Verilog中的空白符總是忽略的嗎? 在源代碼中插入注釋有哪兩種方法? 整數(shù)常數(shù)的尺寸如何指定?缺省的尺寸及數(shù)基是多少? 設(shè)置的編譯指導(dǎo)如何解除? 編譯指導(dǎo)影響全局嗎? 在仿真時為什么要用接近實際的最大timescale精度?,是的??瞻追糜诟糸_標(biāo)識符及關(guān)鍵詞,多余的忽略 /用于單行注釋,/* */用于多行注釋 整數(shù)常量的尺寸由10進(jìn)制數(shù)表示的位數(shù)確定。缺省為32位,缺省的數(shù)基為十進(jìn)制。 使用resetall解除 編譯指導(dǎo)是全局的。編譯時遇到編譯指導(dǎo)后開始有效,直至復(fù)位或被覆蓋,可能影響多個文件。 使用盡可能大的精度。精度越小,仿真

28、時間步越小,仿真時間越長。使用適當(dāng)?shù)木?,既達(dá)到必要的精度,又不會仿真太慢。,主要數(shù)據(jù)類型,Verilog主要有三類(class)數(shù)據(jù)類型:,net (線網(wǎng)) : 表示器件之間的物理連接 register (寄存器) :表示抽象存儲元件 parameters(參數(shù)) : 運(yùn)行時的常數(shù)(run-time constants),net(線網(wǎng)),net需要被持續(xù)的驅(qū)動,驅(qū)動它的可以是門和模塊。 當(dāng)net驅(qū)動器的值發(fā)生變化時, Verilog自動的將新值傳送到net上。在例子中,線網(wǎng)out由or門驅(qū)動。當(dāng)or門的輸入信號置位時將傳輸?shù)骄€網(wǎng)net上。,net類的類型(線網(wǎng)),有多種net類型用于設(shè)計(d

29、esign-specific)建模和工藝(technology-specific)建模 沒有聲明的net的缺省類型為 1 位(標(biāo)量)wire類型。但這個缺省類型可由下面的編譯指導(dǎo)改變: default_nettype ,綜合編譯器不支持的net類型,net類的類型(線網(wǎng)),wire類型是最常用的類型,只有連接功能。 wire和tri類型有相同的功能。用戶可根據(jù)需要將線網(wǎng)定義為wire或tri以提高可讀性。例如,可以用tri類型表示一個net有多個驅(qū)動源?;蛘邔⒁粋€net聲明為tri以指示這個net可以是高阻態(tài)Z(hign-impedance)。可推廣至wand和triand、wor和trior

30、 wand、wor有線邏輯功能;與wire的區(qū)別見下頁的表。 trireg類型很象wire類型,但trireg類型在沒有驅(qū)動時保持以前的值。這個值的強(qiáng)度隨時間減弱。 修改net缺省類型的編譯指導(dǎo): default_nettype nettype不能是supply1和supply0。,net類在發(fā)生邏輯沖突時的決斷,Verilog有預(yù)定義的決斷函數(shù) 支持與工藝無關(guān)的邏輯沖突決斷 wire-and用于集電極開路電路 wire-or用于射極耦合電路,寄存器類 (register),寄存器類型在賦新值以前保持原值 寄存器類型大量應(yīng)用于行為模型描述及激勵描述。在下面的例子中,reg_a、reg_b、re

31、g_sel用于施加激勵給2:1多路器。 用行為描述結(jié)構(gòu)給寄存器類型賦值。給reg類型賦值是在過程塊中。,寄存器類的類型,寄存器類有四種數(shù)據(jù)類型,不要混淆寄存器數(shù)據(jù)類型與結(jié)構(gòu)級存儲元件,如udp_dff,Verilog中net和register聲明語法,net聲明 range delay , net_name; net_type: net類型 range: 矢量范圍,以MSB:LSB格式 delay: 定義與net相關(guān)的延時 net_name: net名稱,一次可定義多個net, 用逗號分開。 寄存器聲明 range , reg_name; reg_type:寄存器類型 range: 矢量范圍,

32、以MSB:LSB格式。只對reg類型有效 reg_name :寄存器名稱,一次可定義多個寄存器,用逗號分開,Verilog中net和register聲明語法,舉例: reg a; /一個標(biāo)量寄存器 wand w; / 一個標(biāo)量wand類型net reg 3: 0 v; / 從MSB到LSB的4位寄存器向量 reg 7: 0 m, n; / 兩個8位寄存器 tri 15: 0 busa; / 16位三態(tài)總線 wire 0: 31 w1, w2; / 兩個32位wire,MSB為bit0,選擇正確的數(shù)據(jù)類型,module top; wire y; reg a, b; DUT u1 (y, a, b

33、) ; initial begin a = 0; b = 0; #5 a = 1; end endmodule,module DUT (Y, A, B); output Y; input A, B; wire Y, A, B; and (Y, A, B) ; endmodule,輸入端口可以由net/register驅(qū)動,但輸入端口只能是net,輸出端口可以是net/register類型,輸出端口只能驅(qū)動net,在過程塊中只能給register類型賦值,若Y,A,B說明為reg則會產(chǎn)生錯誤。,in1,in2,O,A,B,Y,雙向端口輸入/輸出只能是net類型,選擇數(shù)據(jù)類型時常犯的錯誤,用過程語

34、句給一個net類型的或忘記聲明類型的信號賦值。 信息:illegal assignment. 將實例的輸出連接到聲明為register類型的信號上。 信息: has illegal output port specification. 將模塊的輸入信號聲明為register類型。 信息:incompatible declaration, ,下面所列是常出的錯誤及相應(yīng)的錯誤信息(error message),信號可以分為端口信號和內(nèi)部信號。出現(xiàn)在端口列表中的信號是端口信號,其它的信號為內(nèi)部信號。 對于端口信號,輸入端口只能是net類型。輸出端口可以是net類型,也可以是register類型。若輸

35、出端口在過程塊中賦值則為register類型;若在過程塊外賦值(包括實例化語句),則為net類型。 內(nèi)部信號類型與輸出端口相同,可以是net或register類型。判斷方法也與輸出端口相同。若在過程塊中賦值,則為register類型;若在過程塊外賦值,則為net類型。 若信號既需要在過程塊中賦值,又需要在過程塊外賦值。這種情況是有可能出現(xiàn)的,如決斷信號。這時需要一個中間信號轉(zhuǎn)換。,信號類型確定方法總結(jié)如下:,選擇數(shù)據(jù)類型時常犯的錯誤舉例,修改前: module example(o1, o2, a, b, c, d); input a, b, c, d; output o1, o2; reg c

36、, d; reg o2 and u1(o2, c, d); always (a or b) if (a) o1 = b; else o1 = 0; endmodule,修改后: module example(o1, o2, a, b, c, d); input a, b, c, d; output o1, o2; / reg c, d; / reg o2 reg o1; and u1(o2, c, d); always (a or b) if (a) o1 = b; else o1 = 0; endmodule,example.v,選擇數(shù)據(jù)類型時常犯的錯誤舉例,Compiling source

37、 file example.v Error! Illegal left-hand-side assignment Verilog-ILHSA example.v, 11: o1 = b; Error! Illegal left-hand-side assignment Verilog-ILHSA example.v, 12: o1 = 0; 2 errors,第一次編譯信息 verilog c example.v,第二次編譯信息,Compiling source file example.v Error! Incompatible declaration, (c) defined as inp

38、ut at line 2 Verilog-IDDIL example.v, 5: Error! Incompatible declaration, (d) defined as input at line 2 Verilog-IDDIL example.v, 5: Error! Gate (u1) has illegal output specification Verilog-GHIOS example.v, 8: 3 errors,參數(shù)(parameters),用參數(shù)聲明一個可變常量,常用于定義延時及寬度變量。 參數(shù)定義的語法:parameter ; 可一次定義多個參數(shù),用逗號隔開。 在使

39、用文字(literal)的地方都可以使用參數(shù)。 參數(shù)的定義是局部的,只在當(dāng)前模塊中有效。 參數(shù)定義可使用以前定義的整數(shù)和實數(shù)參數(shù)。,module mod1( out, in1, in2); . . . parameter cycle = 20, prop_ del = 3, setup = cycle/2 - prop_del, p1 = 8, x_ word = 16bx, file = / usr1/ jdough/ design/ mem_ file. dat; . . . wire p1: 0 w1; / A wire declaration using parameter . . .

40、 endmodule,注意:參數(shù)file不是string,而是一個整數(shù),其值是所有字母的擴(kuò)展ASCII值。若file=“AB”,則file值為8h4142。用法: $fopen(file); $display(“%s”, file);,參數(shù)重載(overriding),可用defparam語句在編譯時重載參數(shù)值。 defparam語句引用參數(shù)的層次化名稱 使用defparam語句可單獨(dú)重載任何參數(shù)值。,Defparam語句(現(xiàn)在綜合工具還不支持),module mod1( out, in1, in2); . . . parameter p1 = 8, real_constant = 2.039

41、, x_word = 16bx, file = /usr1/jdough/design/mem_file.dat; . . . endmodule,module test; . . . mod1 I1( out, in1, in2); defparam I1. p1 = 6, I1. file = ./ my_mem.dat; . . . endmodule,參數(shù)重載(overriding),module mod1( out, in1, in2); . . . parameter p1 = 8, real_constant = 2.039, x_word = 16bx, file = /usr

42、1/jdough/design/mem_file.dat; . . . endmodule module top; . . . mod1 #( 5, 3.0, 16bx, ./ my_mem. dat) I1( out, in1, in2); . . . endmodule,模塊實例化時參數(shù)重載,使用#,次序與原說明相同,不需要給所有參數(shù)賦新值,但不能跳躍賦值,假設(shè)模塊MOD順序定義三個參數(shù)a, b, c,則: MOD u1 #( a, b) (.); MOD u2 #(a) (.); MOD u3 #(a, ,c) (.); MOD u4 #(, b, c) (.);,為什么編譯器認(rèn)為這是參

43、數(shù)而不是延時呢?,因為#說明延時的時候只能用于gate或過程語句,不能用于模塊實例。 gate(primitives)在實例化時只能有延時,不能有模塊參數(shù)。,寄存器數(shù)組(Register Arrays),在Verilog中可以說明一個寄存器數(shù)組。 integer NUMS 7: 0; / 包含8個整數(shù)數(shù)組變量 time t_vals 3: 0; / 4個時間數(shù)組變量 reg類型的數(shù)組通常用于描述存儲器 其語法為: reg MSB:LSB first_addr:last_addr; MSB:LSB定義存儲器字的位數(shù) first_addr:last_addr定義存儲器的深度 例如: reg 15:

44、 0 MEM 0:1023; / 1K x 16存儲器 reg 7: 0 PREP hFFFE: hFFFF; / 2 x 8存儲器 描述存儲器時可以使用參數(shù)或任何合法表達(dá)式 parameter wordsize = 16; parameter memsize = 1024; reg wordsize-1: 0 MEM3 memsize-1: 0;,存儲器尋址(Memory addressing),存儲器元素可以通過存儲器索引(index)尋址,也就是給出元素在存儲器的位置來尋址。 mem_name addr_expr Verilog不支持多維數(shù)組。也就是說只能對存儲器字進(jìn)行尋址,而不能對存儲

45、器中一個字的位尋址。,module mems; reg 8: 1 mema 0: 255; / declare memory called mema reg 8: 1 mem_word; / temp register called mem_ word . . . initial begin $displayb( mema5); /顯示存儲器中第6個字的內(nèi)容 mem_word = mema5; $displayb( mem_word8); / /顯示第6個字的最高有效位 end endmodule,若要對存儲器字的某些位存取,只能通過暫存器傳遞,復(fù)習(xí)(review),問題: 在Verilog中

46、,什么情況下輸出端會輸出X值? net和register類型的主要區(qū)別是什么? 在Verilog中如何定義一個常數(shù)?,解答: 若輸出端輸出X值, 一種可能是輸出net上發(fā)生驅(qū)動沖突,二是由一個未知值傳遞到net上引起。 register有存儲功能,而net必須持續(xù)驅(qū)動。 在Verilog中使用parameter定義一個常數(shù)。文本宏也是常數(shù)的一種形式。,術(shù)語及定義 (terms and definations),結(jié)構(gòu)描述 : 用門來描述器件的功能 primitives(基本單元) : Verilog語言已定義的具有簡單邏輯功能的功能模型(models),結(jié)構(gòu)描述,Verilog結(jié)構(gòu)描述表示一個邏

47、輯圖 結(jié)構(gòu)描述用已有的元件構(gòu)造。,module MUX4x1( Z, D0, D1, D2, D3, S0, S1); output Z; input D0, D1, D2, D3, S0, S1; and (T0, D0, S0_, S1_), (T1, D1, S0_, S1), (T2, D2, S0, S1_), (T3, D3, S0, S1); not (S0_, S0), (S1_, S1); or (Z, T0, T1, T2, T3); endmodule module rs_latch (y, yb, r, s); output y, yb; input r, s; nor

48、 n1( y, r, yb); nor n2( yb, s, y); endmodule,結(jié)構(gòu)描述等價于邏輯圖,都是連接簡單元件構(gòu)成更復(fù)雜元件,通過門的實例使用門,忽略了門的實例名。,同一種門可以通過一個語句實例化,Latch,結(jié)構(gòu)描述(續(xù)),結(jié)構(gòu)描述等價于邏輯圖。它們都是連接簡單元件來構(gòu)成更為復(fù)雜的元件。Verilog使用其連接特性完成簡單元件的連接。 在描述中使用元件時,通過建立這些元件的實例來完成。 上面的例子中MUX是沒有反饋的組合電路,使用中間或內(nèi)部信號將門連接起來。描述中忽略了門的實例名,并且同一種門的所有實例可以在一個語句中實例化。 上面的鎖存器(latch)是一個時序元件,其輸

49、出反饋到輸入上。它沒有使用任何內(nèi)部信號。它使用了實例名并且對兩個nor門使用了分開的實例化語句。,Verilog基本單元(primitives),Verilog基本單元提供基本的邏輯功能,也就是說這些邏輯功能是預(yù)定義的,用戶不需要再定義這些基本功能。 基本單元是Verilog開發(fā)庫的一部分。大多數(shù)ASIC和FPGA元件庫是用這些基本單元開發(fā)的?;締卧獛焓亲韵露系脑O(shè)計方法的一部分。,基本單元的引腳 (pin)的可擴(kuò)展性,基本單元引腳的數(shù)目由連接到門上的net的數(shù)量決定。因此當(dāng)基本單元輸入或輸出的數(shù)量變化時用戶不需要重定義一個新的邏輯功能。 所有門(除了not和buf)可以有多個輸入,但只能有

50、一個輸出。 not和buf門可以有多個輸出,但只能有一個輸入。,帶條件的基本單元,Verilog有四種不同類型的條件基本單元 這四種基本單元只能有三個引腳:output, input, enable 這些單元由enable引腳使能。 當(dāng)條件基本單元使能信號無效時,輸出高阻態(tài)。,帶條件的基本單元(續(xù)),條件基本單元有三個端口:輸出、數(shù)據(jù)輸入、使能輸入,三種未知狀態(tài): 值 強(qiáng)度 x 1, 0, z 未知 L 0, z 未知 H 1, z 未知,基本單元實例化,在端口列表中,先說明輸出端口,然后是輸入端口 實例化時實例的名字是可選項 and (out, in1, in2, in3, in4); /

51、unnamed instance buf b1 (out1, out2, in); / named instance 延時說明是可選項。所說明的延時是固有延時。輸出信號經(jīng)過所說明的延時才變化。沒有說明時延時為0。 notif0 #3.1 n1 (out, in, cntrl); / delay specified 信號強(qiáng)度說明是可選項 not (strong1, weak0) n1 (inv, bit); / strength specified,module intr_sample; reg A; wire Y; not #10 intrinsic (Y, A); initial begin

52、 A = 0; #15 A = 1; #15 A = 0; #8 A = 1; #8 A = 0; #11 A = 1; #10 $finish; end endmodule,仿真波形,固有延時,模塊實例化(module instantiation),模塊實例化時實例必須有一個名字。 使用位置映射時,端口次序與模塊的說明相同。 使用名稱映射時,端口次序與位置無關(guān) 沒有連接的輸入端口初始化值為x。,module comp (o1, o2, i1, i2); output o1, o2; input i1, i2; . . . endmodule module test; comp c1 (Q,

53、R, J, K); / Positional mapping comp c2 (.i2(K), .o1(Q), .o2(R), .i1(J); / Named mapping comp c3 (Q, , J, K); / One port left unconnected comp c4 (.i1(J), .o1(Q); / Named, two unconnected ports endmodule,名稱映射的語法: .內(nèi)部信號(外部信號),沒有連接時通常會產(chǎn)生警告,module driver (in, out, en); input 2: 0 in; output 2: 0 out; in

54、put en; bufif0 u2:0 (out, in, en); / array of buffers endmodule,實例數(shù)組(Array of Instances),實例名字后有范圍說明時會創(chuàng)建一個實例數(shù)組。在說明實例數(shù)組時,實例必須有一個名字 (包括基本單元實例)。其說明語法為: ();,兩個模塊功 能完全等價,范圍說明語法: MSB : LSB,module driver_equiv (in, out, en); input 2: 0 in; output 2: 0 out; input en; / Each primitive instantiation is done se

55、parately bufif0 u2 (out2, in2, en); bufif0 u1 (out1, in1, en); bufif0 u0 (out0, in0, en); endmodule,實例數(shù)組(Array of Instances)(續(xù)),如果范圍中MSB與LSB相同,則只產(chǎn)生一個實例。 一個實例名字只能有一個范圍。 下面以模塊comp為例說明這些情況,module oops; wire y1, a1, b1; wire 3: 0 a2, b2, y2, a3, b3, y3; comp u1 5: 5 (y1, a1, b1); / 只產(chǎn)生一個comp實例 comp m1 0

56、: 3 (y2, a2, b2); comp m1 4: 7 (y3, a3, b3); / 非法 endmodule,ml作為實例陣列名字使用了兩次,Verilog多種強(qiáng)度決斷,在Verilog中,級別高的強(qiáng)度覆蓋級別低的強(qiáng)度,復(fù)習(xí),問題: 什么是Verilog中的結(jié)構(gòu)化描述? 連接模塊端口有哪兩種方法?哪一種更通用一些? 什么是實例數(shù)組? 什么時候?qū)嵗质强蛇x的?,解答: 結(jié)構(gòu)化描述是使用Verilog基本單元或單元(cell)級元件對設(shè)計進(jìn)行描述,與邏輯圖很相似。 可以根據(jù)次序(位置映射)或名字(名稱映射)來映射端口。雖然在這個教程中大多使用位置映射,這主要是為了節(jié)省空間。在實際設(shè)計中

57、,名稱映射可能更通用一些。 實例數(shù)組用一條語句創(chuàng)建模型(模塊或基本單元)的多個實例。 基本單元實例化時實例名是可選的,說明基本單元數(shù)組時除外。當(dāng)實例化模塊時,實例名是必須的。,術(shù)語及定義,模塊路徑(module path): 穿過模塊,連接模塊輸入(input端口或inout端口)到模塊輸出(output端口或inout端口)的路徑。 路徑延時(path delay):與特定路徑相關(guān)的延時 PLI:編程語言接口,提供 Verilog數(shù)據(jù)結(jié)構(gòu)的過程訪問。 時序檢查(timing check):監(jiān)視兩個輸入信號的關(guān)系并檢查的系統(tǒng)任務(wù),以保證電路能正確工作。 時序驅(qū)動設(shè)計(timing driven design):從前端到后端的完整設(shè)計流程中,用時序信息連接不同的設(shè)計階段,延時模型類型(Delay Modeling Types),延時有三種描述模型:,將全部延時集中到最后一個門,延時分布在每一個門上,分布延時,塊延時,路徑延時,塊延時(Lumped Delay),塊延時方法是將全部延時集中到最后一個門上。這種模型簡單但不夠精確,只適用于簡單電路。因為當(dāng)?shù)捷敵龆擞卸鄠€路徑時不能描述不同路徑的不同延時。

溫馨提示

  • 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

提交評論