《電子系統(tǒng)集成設(shè)計導(dǎo)論》課件第7章_第1頁
《電子系統(tǒng)集成設(shè)計導(dǎo)論》課件第7章_第2頁
《電子系統(tǒng)集成設(shè)計導(dǎo)論》課件第7章_第3頁
《電子系統(tǒng)集成設(shè)計導(dǎo)論》課件第7章_第4頁
《電子系統(tǒng)集成設(shè)計導(dǎo)論》課件第7章_第5頁
已閱讀5頁,還剩265頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

7.1VerilogHDL概要7.2VerilogHDL基礎(chǔ)知識7.3邏輯門及延遲模型7.4數(shù)據(jù)流風(fēng)格描述7.5行為風(fēng)格描述7.6結(jié)構(gòu)風(fēng)格描述7.7編譯仿真輔助技術(shù)7.8VerilogHDL調(diào)試與測試7.9VerilogHDL與VHDL的對比7.10課程設(shè)計練習(xí)7.11VerilogHDL擴展與支撐技術(shù)第7章VerilogHDL系統(tǒng)設(shè)計語言

7.1VerilogHDL概要

VerilogHDL(簡稱Verilog)是一種通用的硬件電路設(shè)計高級語言,設(shè)計師用它來進(jìn)行數(shù)字系統(tǒng)與電路的設(shè)計。它最初由GDA(GatewayDesignAutomation)公司的PhilMoorby于1983年創(chuàng)建。之后GDA公司并入Cadence公司,Verilog遂成為Cadence公司的專利技術(shù)。其出色的門級快速仿真工具Verilog-XL迅速獲得成功,為Verilog的廣泛應(yīng)用奠定了基礎(chǔ)。

(1)從1990年開始,經(jīng)過OVI(OpenVerilogInternational)VerilogHDL研究開發(fā)計劃的推動,Verilog于1995年被正式確定為IEEEStd1364-1995標(biāo)準(zhǔn)。

(2)2001年9月公布了Verilog標(biāo)準(zhǔn)的新版本IEEEStd1364-2001。2001版本主要在行為描述、ASIC底層、外圍環(huán)境接口三個方面進(jìn)行了改進(jìn)。在本書后面的附錄2中給出了IEEE-1364-2001版本新增的保留關(guān)鍵字和按類別不同的句法匯總修訂。

(3)國際標(biāo)準(zhǔn)化部門于2002年又推出了IEEEStd1364.1-2002,它是一個關(guān)于寄存器轉(zhuǎn)移級綜合方面的附屬標(biāo)準(zhǔn)。

(4)經(jīng)過OSCI(OpenSystemCinitiative,SystemC開放促進(jìn)會)的努力,于2005年將SystemC確定為IEEE1666標(biāo)準(zhǔn),可以免費下載。

(5)2006年,公布了Verilog2001的修訂版IEEEStd1364-2005,詳見參考文獻(xiàn)《IEEEStandardforVerilogHardwareDescriptionLanguage2005及附錄2》。同年,SystemVerilog也被確定為IEEEStd1800-2005標(biāo)準(zhǔn),全面包容Verilog,所編同樣功能的代碼,其行數(shù)約為Verilog的1/2~1/5。目前,這兩個IEEE-2005標(biāo)準(zhǔn)之間是一致和兼容的。根據(jù)計劃安排,2008年要將IEEE-1364整合進(jìn)IEEE-1800標(biāo)準(zhǔn)之中。7.1.1VerilogHDL的特點

1.語法結(jié)構(gòu)簡單,易學(xué)實用

VerilogHDL語言與C語言很接近,易學(xué)易用。借助于本書前面的VHDL基礎(chǔ),學(xué)習(xí)VerilogHDL就顯得比較容易。目前,Verilog在國外,尤其是美國和歐洲得到廣泛的應(yīng)用。與VHDL一樣,VerilogHDL支持系統(tǒng)與電路設(shè)計創(chuàng)建描述(輸入歸檔、交流修改)、設(shè)計模擬仿真(驗證、時序分析、調(diào)試聯(lián)試,這方面Verilog尤其擅長)、設(shè)計綜合(有底層庫的強力支撐)、設(shè)計測試(故障覆蓋、測試代碼生成ATPG)等貫穿產(chǎn)品研制全程四個方面的功能。

2.具有豐富的底層器件資源和ASIC廠商支持

VerilogHDL便于開展自底向上的設(shè)計,因為它的一個顯著特點是具有豐富的底層器件資源支持。方便的內(nèi)建基元和用戶定義基元適于采用模塊化、結(jié)構(gòu)化設(shè)計;特別是與底層門級開關(guān)電路打交道較多的設(shè)計比較優(yōu)化;綜合成EDIF格式電路結(jié)構(gòu)化網(wǎng)表的效率較高。現(xiàn)在許多ASIC制造廠商將其作為設(shè)計制造間簽發(fā)(Sign-Off)的工具。

3.支持行為、結(jié)構(gòu)、數(shù)據(jù)流三種風(fēng)格描述,具有較好的可綜合性

VerilogHDL支持行為、結(jié)構(gòu)兩種類型風(fēng)格描述,數(shù)據(jù)流采用類似于行為風(fēng)格的描述,但是對應(yīng)于寄存器轉(zhuǎn)移一級(RTL)的結(jié)構(gòu)。一個模塊內(nèi)允許行為風(fēng)格和結(jié)構(gòu)風(fēng)格相互連接。VerilogHDL在綜合,特別在RTL級的綜合方面具有明顯的優(yōu)勢。然而,Verilog在系統(tǒng)級接近頂層的抽象設(shè)計能力較弱,而且還有許多是不可綜合的。設(shè)計前期可以多用些行為描述與仿真,設(shè)計后期再用結(jié)構(gòu)手法以便綜合。目前出現(xiàn)的SystemVerilog彌補了這方面的不足。

4.面向Top-Down設(shè)計的機制

VerilogHDL以模塊(Module)設(shè)計手法為主,由大小不同的模塊直接嵌套形成層次結(jié)構(gòu)化設(shè)計體系。憑借豐富的函數(shù)和任務(wù)等復(fù)用手段,高層設(shè)計可以方便地進(jìn)行行為風(fēng)格描述和仿真。這些都是設(shè)計師采用自上而下設(shè)計策略的基礎(chǔ)。

5.豐富的編譯調(diào)試手段和EDA廠商支持

與EDA關(guān)系密切的VerilogHDL,本身就具有豐富的編譯調(diào)試手段,大量實用的編譯預(yù)處理宏命令、系統(tǒng)函數(shù)和任務(wù),使得編譯、仿真、綜合的交互性較好。

6.提供與其他語言和開發(fā)環(huán)境間強大的接口能力

VerilogHDL提供編程語言接口(PLI)、Verilog接口例程(VPI)、ACC(Access,訪問接口)、標(biāo)準(zhǔn)延遲格式(SDF)等,使得外圍可擴展能力非常強。7.1.2VerilogHDL模塊

1.模塊句法結(jié)構(gòu)

模塊設(shè)計在句法中又被總稱為模塊聲明(module_

declaration),其基本格式如下:

module

module_identifier[(list_of_ports)];//模塊命名并列出端口名

/*以下是關(guān)于模塊項聲明(module_item_declarations)段*/

input_declaration|output_…|inout_…

|reg_…|net_…|parameter_…|integer_…

|function_…|task_…|event_…|…

/*以下是模塊項(module_items)描述段*/

initial_construct

|always_construct

|module_instantiation

|gate_instantiation

|udp_instantiation

|continuous-_assign

|parameter_override

|specify_block

endmodule

2.模塊中的項語句結(jié)構(gòu)

VerilogHDL程序由模塊組成,每個模塊都是安排在module和endmodule兩個關(guān)鍵字之間。每個模塊功能明確,模塊間可以實現(xiàn)從底層到頂層層次化的模塊嵌套調(diào)用。

模塊內(nèi)的基本架構(gòu)主要是由兩大段項語句組成:①相關(guān)的項聲明(module_item_declarations)段;②其他實質(zhì)性項描述語句(module_items)段。項聲明對模塊中用到的各種數(shù)據(jù)、端口、函數(shù)、任務(wù)等加以聲明,項描述語句則用來描述電路的功能或結(jié)構(gòu)。有三類項描述語句可用來設(shè)計模塊,即行為構(gòu)件、持續(xù)賦值、實例生成。此外,還有參數(shù)重置、規(guī)定塊兩類項描述語句。

除了endmodule之外,每個項聲明和項描述語句的最后必須有分號。Verilog允許一行寫幾個語句;也可以一個語句占有幾行。

3.端口定義和模塊項聲明

在模塊名后面緊接著定義端口的圓括號中,對模塊的輸入輸出端口進(jìn)行定義。

然后,在項聲明段中給出端口模式的聲明。端口可以是input、output、inout三種模式,均需要在這里明確聲明。reg不能做為input或inout端口。

端口定義及端口I/O模式聲明的格式為

module模塊名[(口1,口2,口3,…)];//圓括號中給出端口定義

input

口2,口3,…;//在項聲明段給出端口模式聲明

output

口1,…;

inout…;

…;在模塊項聲明段module_item_declarations的部分,還要對模塊內(nèi)部所用其他項進(jìn)行聲明。一方面要對模塊中用到的各種數(shù)據(jù)類型加以聲明,包括參數(shù)(parameter)、線網(wǎng)(net)、寄存器(reg)、整數(shù)(integer)、實數(shù)(real)、時間(time)等;另一方面要對公用子程序,包括函數(shù)(function)、任務(wù)(task),以及事件(event)等加以聲明。

4.模塊項描述段和層次

在模塊聲明段之后的項描述段,給出模塊輸入輸出關(guān)系的描述;給出模塊功能及結(jié)構(gòu)描述。包括描述行為的構(gòu)件類(initial_construct;always_construct等)、描述結(jié)構(gòu)的實例生成(module_instantiation;gate_instantiation;udp_instantiation)、描述數(shù)據(jù)流的獨立持續(xù)賦值(continuous_assign)等語句。下面先用設(shè)計簡例分別大致加以介紹。

Verilog實質(zhì)性的設(shè)計嵌套,實現(xiàn)起來非常簡單。與VHDL不同的是,Verilog的模塊中可以調(diào)用(實例生成)其他模塊,但不能聲明其他模塊。調(diào)用時采用名稱相關(guān)和位置相關(guān)兩種手法,如7.1.3中例3所示。另外,還可以采用層次化名稱法引用其他模塊內(nèi)部的標(biāo)識符。7.1.3VerilogHDL設(shè)計簡例

為了對采用VerilogHDL語言設(shè)計盡早有一個感性認(rèn)識,這里舉出幾種風(fēng)格的典型設(shè)計簡例。通過分析并與VHDL比較,有助于深入理解后面更為復(fù)雜的設(shè)計。

1.例1——與或非門設(shè)計

/*如圖7-1所示給出數(shù)據(jù)流描述的結(jié)構(gòu)*/

`timescale1ns/100ps

/*指定時間單位1ns和精度100ps*/

moduleaoi21(d,a,b,c);

inputa,b,c;

outputd;

assign

#5d=~((a&b)|c);

/*賦值延遲為5ns,按位操作,持續(xù)賦值,實現(xiàn)與或非*/

endmodule圖7-1與或非門aoi21設(shè)計

2.例2——四位加法器設(shè)計

/*如圖7-2所示為數(shù)據(jù)流描述的結(jié)構(gòu)*/

moduleFulladder(sum,cout,a,b,cin);

input[3:0]a,b;

inputcin;

outputcout;

output[3:0]sum;

assign{cout,sum}=a+b+cin;//并置后共計五位

endmodule圖7-2四位加法器

3.例3——模塊調(diào)用

采用層次化結(jié)構(gòu)風(fēng)格,頂層主模塊topmd調(diào)用底層三態(tài)門子模塊bomtri實例生成一個bot_ins。如圖7-3所示,給出的是一種層次結(jié)構(gòu)。

modulebomtri(out,int,exp1);

outputout;

inputint,exp1;

assignout=exp1?int:‘bz;

/*當(dāng)條件exp1為真,out=int(輸入);當(dāng)exp1為假,out=’bz(高阻)*/

endmodule

moduletopmd(ou,in,enb);

outputou;

inputin,enb;

bomtribot_ins(ou,in,enb);

/*也可以是bomtribot_ins(.int(in),.exp1(enb),.out(ou))*/

endmodule圖7-3層次化設(shè)計

4.例4——D觸發(fā)器設(shè)計

如圖7-4所示,采用行為風(fēng)格描述如下:

moduleFlop(q,d,clk,clr,ena);

inputd,clk,clr,ena;

outputq;

regq;

always@(posedgeclkorposedgeclr)

/*@為事件控制符,事件posedge含從某值到1的跳變以及從0到某值的跳變——總共五種(01,x1,z1,0x,0z,但一般不計z1和0z)。negedge與此類似*/

begin

if(clr)q<=0;//<=為非阻塞性賦值

elseif(ena)q<=d;

end

endmodule

注意,上面例4中if_else_if是時序語句,其順序為if→elseif。圖7-4D觸發(fā)器設(shè)計

7.2VerilogHDL基礎(chǔ)知識

7.2.1數(shù)據(jù)及類型

1.標(biāo)識符和注釋

由字母、數(shù)字、下劃線等組成的一組符號稱為標(biāo)識符(Identifier),在VerilogHDL中用它來表示各種線網(wǎng)、變量、參數(shù)或構(gòu)件的名稱,而且大寫與小寫是不一樣的。為了簡單起見,建議所給出的第一個字符采用英文字母,其余字符采用英文字母、下劃線和數(shù)字。例如7.1.3節(jié)中例1的模塊名稱aoi21等。

Verilog用不同的后綴表示不同的文件類型。例如,用*.v表示源程序(有些設(shè)計環(huán)境采用*.tf表示測試模塊)等。這里的*.v也是一種標(biāo)識符。

Verilog程序中的注釋有以下兩種。

短注釋:參見附錄2的句法匯總中綜合類關(guān)于one_line_comment的句法定義。在每行程序的后邊半行,以//開始的文字部分為注釋內(nèi)容。用\n表示注釋文字的后面通常跟有一個換行符。

長注釋:在程序行之間位于/*…*/之內(nèi),允許一行或多行的文字部分,也屬于注釋內(nèi)容。

注釋的目的是為了閱讀方便,并不進(jìn)入編譯。

2.線網(wǎng)形態(tài)數(shù)據(jù)類型

根據(jù)Verilog標(biāo)準(zhǔn)的定義,線網(wǎng)(net)類(wire、tri)是一類專門的數(shù)據(jù)類型。

線網(wǎng)類數(shù)據(jù)表示各結(jié)構(gòu)化元件之間的物理硬件互連線。它不能存儲值,而必須受到驅(qū)動器的驅(qū)動。當(dāng)沒有驅(qū)動器連接到線網(wǎng)類上時,該線網(wǎng)則呈現(xiàn)高阻。

最常用的線網(wǎng)類數(shù)據(jù)是wire和tri(二者等價。wire表示單個門驅(qū)動,tri表示多個門驅(qū)動)。ASIC設(shè)計中的wire不能存儲和保存值,只作傳輸被持續(xù)賦值語句驅(qū)動的值,其默認(rèn)值為z。

未聲明的數(shù)據(jù)默認(rèn)是net類型,后面將給出它的詳細(xì)格式。net的默認(rèn)位數(shù)為1,即標(biāo)量型;而矢量需要顯式聲明。對此,可以理解為:Verilog隱含的數(shù)值類型為標(biāo)量型線網(wǎng)邏輯類數(shù)據(jù)。但這里隱含的是四值邏輯,類似于VHDL中的bit量。

下面具體介紹這種數(shù)據(jù)形態(tài)類型。

線網(wǎng)中的wire又被稱為連線型線網(wǎng),用來表示連接單元的硬互連線。承載的是組合邏輯值,通常由單個門驅(qū)動或由持續(xù)賦值語句驅(qū)動。Verilog中的輸入、輸出默認(rèn)數(shù)據(jù)類型為wire(tri型則用來表示多驅(qū)動器驅(qū)動同一根連線的情況)。

多位wire類型定義語句格式為

wire[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,…,數(shù)據(jù)名k;(也可以用格式

[n-1:0])例如:

wire[3:0]c,d;

wire上的數(shù)據(jù)一般用持續(xù)賦值的assign語句來賦值。

其他可以歸為線網(wǎng)型同類數(shù)據(jù)的主要有:supply0、supply1(分別表示負(fù)、正電源);trireg(需要單獨聲明)、tri0、tri1、tri(總線輸入全1時輸出結(jié)果為1,輸入全0時則輸出為0,其余為x)、trior、triand、wor(wired-or線或型線網(wǎng))、wand(wired-and線與型線網(wǎng))、wire(可以與tri功能相同)等。其中惟有trireg特殊,它表示線網(wǎng)上掛有電容,可用來描述電荷存儲值。電荷強度級別有l(wèi)arge、medium(默認(rèn)強度值)、small。

沒有被聲明的線網(wǎng)默認(rèn)為1位線網(wǎng)。對線網(wǎng)類型的限定詞有標(biāo)量scalared、矢量vectored等,默認(rèn)值為標(biāo)量。被聲明為矢量的線網(wǎng)不允許按位直接運算。線網(wǎng)類可以擁有邏輯值。

3.變量類別數(shù)據(jù)

在Verilog的新標(biāo)準(zhǔn)中,取消了寄存器(register)一類的提法,以變量代替。與VHDL非常不同,這里的變量包括存儲類(reg、memory)、整數(shù)類、實數(shù)類、時間類等數(shù)據(jù)。

最常用的存儲類數(shù)據(jù)有寄存器型reg。存儲器型memory則是由reg組成的數(shù)組,它是Verilog的一種多維數(shù)據(jù)構(gòu)成的表征形式。

reg類可以在驅(qū)動撤銷時仍能保存數(shù)據(jù)值,但并不總與硬件的寄存器、觸發(fā)器、鎖存器等價。在個別情況下,它也可能是組合邏輯。

1)寄存器(reg)型

寄存器reg用來表示數(shù)據(jù)記憶單元,通過行為賦值語句可以改變存儲的值,reg的默認(rèn)位數(shù)也是1。用reg定義的變量將用在always構(gòu)件內(nèi),常用它代表觸發(fā)器。在always構(gòu)件內(nèi)賦值的每一個變量都必須定義成reg型。

多位reg類型定義語句格式為

reg[n:1]數(shù)據(jù)名1,數(shù)據(jù)名2,…,數(shù)據(jù)名k;//(也可以寫成[n-1:0])

例如:

reg[3:0]regc,regd;

r

eg的默認(rèn)初始值為未定值x。

2)存儲器(memory)型

在Verilog中,存儲器數(shù)據(jù)不是一個獨立的類型,它是寄存器類型reg派生出來的。通過對reg型數(shù)據(jù)建立數(shù)組來加以定義,用來描述RAM、ROM等存儲器電路和reg文件。

存儲器類型定義語句格式為

reg[n:1]存儲器名[m:1];//(也可以用格式[m-1:0])

其中reg[n:1]表示存儲器中寬度為n的一個單元。例如:reg[7:0]mema[255:0];定義了存儲器mema,其記憶單元地址范圍為從0~255。如果要對存儲器中的記憶單元進(jìn)行讀寫,必須指定它在存儲器中的一個地址。地址值可以用表達(dá)式表示,通過計算來獲得不同的地址值。不允許對存儲器單元的部分位進(jìn)行直接運算。

3)區(qū)間型

區(qū)間型變量主要包括integer(整數(shù))、real(實數(shù))、time(時間)、realtime(實時間)等。Verilog主要用區(qū)間數(shù)值類表示變化的數(shù)據(jù),它并不直接對應(yīng)于真實的硬件。

設(shè)計中使用較多的區(qū)間類數(shù)據(jù)是整數(shù)(integer)型。采用無符號基數(shù)表示整數(shù)的標(biāo)準(zhǔn)格式為

位寬'進(jìn)制數(shù)字

其中位寬為用十進(jìn)制表示的精確位寬常數(shù);整數(shù)的進(jìn)制有二進(jìn)制(b,B)、八進(jìn)制(o,O)、十六進(jìn)制(h,H)、十進(jìn)制(d,D)四種;數(shù)字可以是x,z,數(shù)字間可以添加下劃線。例如:

4‘b10x0

表示是一個位寬為4的二進(jìn)制數(shù)10x0,其中從低位數(shù)起的第二位是未知值。

當(dāng)表達(dá)式只有數(shù)字時,意味著采用默認(rèn)的十進(jìn)制表示。這時在數(shù)字表達(dá)式前可以加一減號,表示是負(fù)數(shù)。

需要指出的是,在Verilog中,整數(shù)表示與邏輯集合表示是相通的。一個x或者z,可以被用來表示十六進(jìn)制數(shù)中的四位(或者八進(jìn)制的三位,二進(jìn)制的一位)的未知或者高阻狀態(tài)。

其他的實數(shù)(real)型、字符串?dāng)?shù)值集合等不再介紹。整數(shù)、實數(shù)、時間量集合都是變量數(shù)據(jù)類型。

4.參數(shù)類數(shù)據(jù)

VerilogHDL中常見的常數(shù)形式是參數(shù)(parameter)。參數(shù)實質(zhì)上就是采用parameter格式定義的標(biāo)識符常數(shù)。這樣定義的參數(shù)在程序正式運行前可以被多次指定、改變和推翻,有點類似于VHDL的類屬(generic)。Verilog規(guī)定常數(shù)在程序運行中不能再改變它的值。

用paramete定義標(biāo)識符來表示常數(shù),即參數(shù)型常數(shù),又稱為符號常數(shù)。其格式為

parameter參數(shù)名1=表達(dá)式1,參數(shù)名2=表達(dá)式2,…,參數(shù)名n=表達(dá)式n;

例如:

parameterr=1.5,f=2.4;

parametermean_delay=(r+f)/2.0;參數(shù)型常數(shù)常用來定義延遲和變量寬度。其主要優(yōu)點是通過參數(shù)傳遞,可以改變被引用模塊中已經(jīng)定義的參數(shù)。定義參數(shù)的格式為

#(參數(shù)1,…,參數(shù)n)

模塊生成中用#表示參數(shù)(例如變量寬度),而延遲控制中也用#給出延遲專用參數(shù),注意不要混淆。

例如,在設(shè)計模塊Decode(A,F)時定義上升下降延遲參數(shù)為parameterr=1,f=1;,它們就成為該參數(shù)的默認(rèn)值。后面允許將默認(rèn)的參數(shù)值再推翻,比如用Decode#(4,0)D1(A1,F1);實例生成D1時,此時,參數(shù)值變?yōu)閞=4,f=0。

與參數(shù)定義有關(guān)的關(guān)鍵字還有specparam、defparam。

5.邏輯數(shù)值集合

VerilogHDL設(shè)計中使用最多的是邏輯數(shù)值集合,但并不被稱作是一種數(shù)據(jù)類型。邏輯值(0,1,x,z)集合是默認(rèn)的,不需要說明。邏輯數(shù)值集合被用來表示線網(wǎng)、變量和參數(shù)的數(shù)值。

Verilog標(biāo)準(zhǔn)中規(guī)定的二進(jìn)制邏輯值集合含有四個值——1,0,x,z

(也可以是X、Z,此處大小寫一樣)。

邏輯值x表示未知值或者未初始化的未定值,未知的邏輯值可能是1,0,或者是一個處于變化中的值。邏輯值z表示一個高阻值。邏輯值?也是表示z|Z。

布爾量的表示也采用邏輯值的集合:用1表示真,0表示假,x表示真假未定,z則無定義。

6.其他廣義數(shù)據(jù)類型

1)用于數(shù)據(jù)行為特征描述的類

(1)驅(qū)動強度類(線網(wǎng)被賦予1或0的強度——strength0、strength1)。

0強度類supply0、strong0、pull0、weak0、highz0。

1強度類supply1、strong1、pull1、weak1、highz1等。

默認(rèn)值為strong0、strong1。

(2)邊沿跳變事件(event)類。

開關(guān)級是介于邏輯門和晶體管之間的一個層次,這些強度類數(shù)據(jù)主要用于開關(guān)級建模,包括:

①邊沿描述。posedge表示正邊沿的01、0x、x1(也可加上z1、0z);negedge表示負(fù)邊沿的10、1x、x0(也可以加上1z、z0)。

②邊沿符號。r、R(狹義上升);f、F(狹義下降);p、P(三種上升);n、N(三種下降)。還有一種是在標(biāo)準(zhǔn)中給出的用*表示邊沿的任何變化,等同于(??)。

2)用于結(jié)構(gòu)描述的內(nèi)建模型類數(shù)據(jù)

(1)開關(guān)模型。

MOS通路晶體管類有nmos、pmos、rnmos、rpmos(nmos、pmos的高阻態(tài)版本,在輸入輸出間有高阻抗存在,使得數(shù)據(jù)強度衰減)。

CMOS傳輸門類有cmos、rcmos(以下帶r的與上述解釋類似)。

無使能控制的雙向傳輸門類有tran、rtran。

有使能控制的雙向傳輸門類有tranif0、tranif1、rtranif1、rtranif0。

(2)上拉、下拉(即電源、地)類:pullup、pulldown。

上述兩類數(shù)據(jù)類型主要用于開關(guān)級建模。

(3)基本邏輯門模型。

多(n)個輸入端的邏輯門類:and、nand、or、nor、xor、nxor。

多(n)個輸出端的邏輯門類:buf、not。

(4)使能控制同相反相三態(tài)門類:bufif0、bufif1、notif0、notif1。7.2.2表達(dá)式中的操作符

(1)算術(shù)操作符:

+-*/%**

上述六種算術(shù)操作符分別為加(正)、減(負(fù))、乘、除、求余、指數(shù)運算,乘法符號一般被寫作*。

當(dāng)+、-表示正、負(fù)時,為一元運算,否則為二元運算。

%為對整型數(shù)求余數(shù)的模運算。例如,7%3=1,其結(jié)果的符號與第一個操作數(shù)相同。注意要與系統(tǒng)任務(wù)中的%區(qū)別開。

在進(jìn)行算術(shù)運算時,如果有一個操作數(shù)為x,則結(jié)果為x。

(2)布爾邏輯關(guān)系:

&&||!

以上符號是三種布爾操作符,分別為邏輯與關(guān)系、邏輯或關(guān)系、邏輯非關(guān)系。

與普通的邏輯運算規(guī)則相同,其真值表如表7-1所示。

布爾邏輯運算中的a、b通常是一個表達(dá)式。真、假采用邏輯值1、0表示。

對于矢量的布爾邏輯運算規(guī)則是:非零矢量整體作為1處理;如果任何一個操作數(shù)含有x,則結(jié)果為x表示真假未定。

(3)大小關(guān)系:

><>=<=

上述四種操作符分別為大于、小于、大于或等于、小于或等于。

在大小關(guān)系運算時,如果該關(guān)系為真(true),則返回1;如果關(guān)系為假(false),則返回0;如果某個操作數(shù)的值未定,則該關(guān)系為模糊,返回未定值x。

(4)相等關(guān)系:

==:等于,是一種簡單的相等比較,它只比較邏輯值中的1、0。相等時結(jié)果為1,否則為0;如果某操作數(shù)含有邏輯值x或z,則結(jié)果為x。

!=:不等于,與等于相反。

===:全等于,全面的全等比較,比較邏輯值中全部可能的1、0、x、z,當(dāng)完全相等時結(jié)果為1,否則結(jié)果為0。

!==:不全等于,也是比較全部邏輯值,其規(guī)則與全等于相反。

兩個等于的差別體現(xiàn)在表7-2的真值表中。

===和!==常用于case表達(dá)式的判別,所以又被稱為“case等式操作符”。

(5)算術(shù)邏輯移位:

<<>><<<>>>

這四種操作符分別代表:操作數(shù)a邏輯左移n位,記作a<<n;a邏輯右移n位,記作a>>n。邏輯移規(guī)定用0填補移出的空位。

例如:

4‘b1001<<1=5’b10010;

a算術(shù)左移n位,記作a<<<n;a算術(shù)右移n位,記作a>>>n。對于無符號操作數(shù),用0填補移出的空位;對于有符號的操作數(shù)a,則補上a的符號位值。其中n作為無符號數(shù)處理,當(dāng)n為未知或高阻時,其結(jié)果為未知。

(6)按位運算:

~&|^^~(~^)

上述五種操作符分別為按位取反、按位與、按位或、按位異或、按位異或非運算。

按位取反~的情況比較簡單。例如,一個操作數(shù)的情況:

rega=b‘1100;

rega=~rega;//取反后rega變?yōu)閎'0011。對于兩個操作數(shù)的情況,操作數(shù)各位的取值允許為0、1、x。此時除了正常的0、1運算之外,做了非常簡單合理的擴展延伸,解釋如下:當(dāng)兩個操作數(shù)的數(shù)據(jù)位數(shù)不同時,則在運算前,首先將操作數(shù)右端對齊,然后將位數(shù)少的操作數(shù)高位填0后以使左邊也對齊,最后再按位運算。

按位與&的約定是:只有兩個對應(yīng)位均為1時,輸出為1;兩個中有一個為0時,輸出為0;其余情況的輸出為x。

按位或?|?的約定是:只要兩個對應(yīng)位中有一個為1,則輸出為1;兩個同時為0時,輸出為0;其余情況的輸出為x。按位異或^的約定是:只有兩個對應(yīng)位分別為1、0時,輸出為1;兩個同時為0或同時為1時,輸出為0;其余輸出均為x。

按位異或非^~的約定是:只有兩個同時為0或1時,輸出為1;兩個對應(yīng)位分別為1、0時,輸出為0;其余輸出均為x。

Verilog可以同時進(jìn)行多位按位運算,所以在設(shè)計模塊時可以定義總線級多位并行運算的與門、或門、異或門等。

(7)歸約(reduced):

&|~&~|^~^(^~)

歸約操作符只對單個操作數(shù)進(jìn)行自身各位間的與、或、與非、或非、異或、異或非等單一遞推縮減運算,最后結(jié)果是一位二進(jìn)制數(shù)。

歸約運算的步驟是:先將操作數(shù)的第0位和第1位進(jìn)行與、或、異或等運算;中間結(jié)果再與第2位進(jìn)行同樣的運算……以此類推,直到變成一位數(shù)為止。例如:

reg[3:0]B;regC;C=&B;

則相當(dāng)于

C=((B[0]&B[1])&B[2])&B[3];

(8)并置:

{}

它把兩個或多個線網(wǎng)、變量的若干位拼接起來。例如:

{a,b[3:0],w,3'b101}

(9)條件表達(dá)式:

如圖7-5所示,對于表中最后的條件選擇表達(dá)式,語法解釋如下:

exp1?expt:expf

其中exp1、expt、expf均為表達(dá)式。上式表示當(dāng)條件exp1為真時選擇expt。當(dāng)條件exp1為假時選擇expf。當(dāng)exp1為模糊值x、z時,將表達(dá)式expt、expf分別加以計算,并按位運算,然后根據(jù)下面的規(guī)則給出判斷結(jié)果:對于結(jié)果的每一位來說,如果兩個表達(dá)式均為1,則結(jié)果為1;如果兩個表達(dá)式均為0,則結(jié)果為0;否則,結(jié)果為x。

由條件選擇組成的條件賦值,例如out=enab?a:b可用于持續(xù)賦值和一般行為賦值。圖7-5條件表達(dá)式

(10)優(yōu)先等級:

Verilog操作符約定的運算順序與VHDL相似,優(yōu)先等級如表7-3所示。其中用豎杠與箭頭相連表示屬于同一個優(yōu)先級;并置運算的優(yōu)先級應(yīng)是最高。

7.3邏輯門及延遲模型

7.3.1內(nèi)建門與開關(guān)基元

Verilog的內(nèi)建(Built-In)門與開關(guān)模型有下述一些基元(Primitive)。

(1)多輸入單輸出門(出,入1,入2,…,入k):

and,or,xor,nand,nor,xnor

上述每個門有多個輸入端(每一種都可以有2~n個),但惟一的一個輸出端放在第一個端位置。

(2)多輸出單輸入門(出1,出2,…,出k,入):

buf,not

上述每個門可以有多個輸出端,但一個輸入端放在最后一個端位置。

(3)三態(tài)門(單入多出):

bufif0,bufif1,notif0,notif1

(4)上拉、下拉(即接地、接電源,可多點):

pullup,pulldown

(5)?MOS開關(guān)(即通路晶體管和傳輸門):

nmos,pmos,rnmos,rpmos,cmos,rcmos

(6)雙向開關(guān)(雙向傳輸門):

tran,tranif0,tranif1,rtran,rtranif0,rtranif1

在設(shè)計模塊時可以使用它們,同時可以顯式定義邏輯值強度和門延遲,如圖7-6所示。例如:圖7-6模塊Primit設(shè)計前面兩個門用的是強0、強1,門延遲為2.2ns。第三個門Nand_3沒有顯式聲明,用的是默認(rèn)驅(qū)動強度值——也是強0、強1,但門延遲為0。

上拉電阻舉例:

pulluppup(pwr);

這里單端上拉器件的實例名為pup,它將惟一的實例輸出端pwr置為高電平。在pup之前還可以給出強度,后面還可以同時列出多個上拉器件。7.3.2用戶定義基元——UDP

UDP是一種由用戶自己定義的庫基元(User-DefinedPrimitives)。它也是源文件的一種,是用戶根據(jù)自己的需要而建立的基本邏輯門模型,具體格式參見附錄2中的udp_declaration。在udp_port_list中的第一個為惟一的標(biāo)量輸出端。它不能是矢量型vertor數(shù)據(jù),不能是inout模式。在body部分,有組合電路和時序邏輯兩類體格式,但都是采用Verilog約定的真值表格式定義和解釋。輸入端可以是多個(編寫非UDP的正常模塊時不受上述限制)。

下面以設(shè)計半加器本級和的用戶定義基元Adder為例,介紹比較簡單的組合電路UDP設(shè)計。至于半加器的另一個本級進(jìn)位

Carry,也可以如法炮制。注意,在定義UDP輸出時,可以采用0、1、x,但不允許采用z,如果輸入端中出現(xiàn)z,則作為x處理。

除了組合電路UDP之外,還有時序邏輯UDP。下面給出的例子是時序邏輯(sequential_body)UDP設(shè)計。UDP的調(diào)用步驟與內(nèi)建基元的調(diào)用句法相同。在調(diào)用這兩種基元時,可以有實元名稱,也可以沒有實元名稱。

時序電路中又分電平有效(鎖存器)和邊沿有效(觸發(fā)器)兩種。定義時序電路也是用列表形式完成,只是表內(nèi)的格式有所區(qū)別。這里舉一個正邊沿觸發(fā)的D觸發(fā)器UDP定義為例來加以闡明。注:VerilogUDP真值表定義中的格式(ab)表示從a電平到b電平。用?表示不必關(guān)心的任意值。用(??)表示無關(guān)的任意轉(zhuǎn)換。UDP中的?可能是0、1、x。與以前介紹過的?不同,在Verilog條件選擇表達(dá)式中用?表示選擇真假;在邏輯類數(shù)值集合中用?表示z。此外,UDP真值表中還用b|B表示是0或者1。7.3.3線網(wǎng)延遲和門延遲

Verilog中有許多定義線網(wǎng)和門延遲的詳細(xì)規(guī)定,主要用于結(jié)構(gòu)和數(shù)據(jù)流描述。延遲種類有四種:上升(Pd,to_1:從0、x、z到1);下降(Nd,to_0:從1、x、z到0);浮空(Zd,to_z);其他to_x。Verilog中采用#作為延遲(Delay)控制符。

上升、下降、浮空(從1、0到z)都是一種事件變化表征。書寫延遲的完整格式示例如下:

#(0.2:0.3:0.4,0.3:0.4:0.5,0.1:0.2:0.3);

該式中按順序給出上升、下降、浮空的最小、典型、最大值。

此外,規(guī)定to_x的延遲取(上升、下降、浮空)之中的最小值。

1.線網(wǎng)延遲

下面舉例闡明線網(wǎng)延遲的設(shè)計。

設(shè)計時可以用#來指定線網(wǎng)的線延遲,例如:

wire#(1.1:1.3:1.7)a_delay;

這句程序給出線網(wǎng)a_delay被驅(qū)動源驅(qū)動時的線延遲,括號內(nèi)的三個值分別表示線延遲參數(shù)中的最小延遲、典型延遲、最大延遲。

#(1.1:1.3:1.7)assignq=a;

表示的是驅(qū)動源賦值階段的延遲。但是,下述是一種容易誤解的寫法:

wire#(1.1:1.3:1.7)a_delay=a;

在這種情況下,凡有驅(qū)動器出現(xiàn)的是指驅(qū)動源a的賦值延遲而不是a_delay的線延遲。

總之,驅(qū)動源的賦值延遲加上線延遲才是線網(wǎng)的實際驅(qū)動階段總延遲。

2.門延遲(同樣適用于UDP的延遲)

表示門延遲的方式與表示線網(wǎng)線延遲的方式是一樣的。這里表示的延遲類別有三種:#(Pd,Nd,Zd),它們是上升延遲(Pd)、下降延遲(Nd)、浮空(即Turnoff;又稱Float)延遲(Zd)。有些門,例如與非門等,只有前兩種延遲。對其中某一種延遲,還可以用#(a1:a2:a3)分別表示其最小值、典型值、最大值。如果這時只有a1,則不區(qū)分最小值、典型值、最大值。舉例闡明如下:

nand#3.0nd01(c,a,b);//上升、下降均為單一門延遲,即3.0ns

nand#(2.6:3.0:3.4)nd02(d,a,b);//單一門延遲中的最小值,典型值,最大值

nand#(2.8:3.2:3.4,2.6:2.8:2.9)nd03(e,a,b);

/*上升、下降兩種,每種各三個可能取值。這里的最小,典型,最大值算是一套值*/

3.引腳延遲

規(guī)定(Specify)塊是Verilog延遲表征的重要組成部分。在Specify塊中,可以進(jìn)行延遲參數(shù)聲明、模塊的路徑延遲聲明和系統(tǒng)時序校驗。在編寫Specify塊時,一般首先用specparam定義延遲參數(shù),再定義路徑及其延遲。一般黑體字,包括這里的specparam是Verilog的保留字,凡由specparam開頭的語句就是專門用來定義延遲參數(shù)的語句。

在Specify塊(specify…endspecify)中,可以規(guī)定模塊內(nèi)不同引腳間(Pin-to-Pin)的路徑延遲,符號為*>以及=>。

x*>y表示所謂的全路徑,則x的每一位與后面的y都有路徑相通。全路徑類似于時鐘一類的全局信號線,從一個輸入端到所有的輸出端都有線連接路徑,它們之間的路徑延遲均需計算。

例如:

specify

(a,b*>c,d)=10;

endspecify

表示a到c、d的延遲為10,b到c、d的延遲也為10。

x=>y表示所謂的并行路徑,要求x、y的位數(shù)相等。并行路徑類似于并行總線,是指前面引腳和后面引腳是成對出現(xiàn)的,相當(dāng)于計算從并行輸入端到并行輸出端的路徑延遲。

注意,Verilog中默認(rèn)的延遲模型也是慣性延遲。所謂“上升”延遲是指輸出端的上升邊,對其他有關(guān)下降等含義的解釋與此類似。

7.4數(shù)據(jù)流風(fēng)格描述

Verilog的一種常用手法是數(shù)據(jù)流風(fēng)格。從形式上看它也是一種對電路行為的描述,但實質(zhì)上它對應(yīng)于RTL一級的結(jié)構(gòu)模型,是一種容易被綜合的準(zhǔn)結(jié)構(gòu)類表征。數(shù)據(jù)流風(fēng)格常用于描述數(shù)據(jù)通路中簡單組合元件的邏輯電路設(shè)計。它采用行為過程外的獨立持續(xù)賦值語句,即assign語句描述。驅(qū)動強度和延遲值信息也被嵌套在持續(xù)賦值語句之中。

持續(xù)賦值(continuous_assign)語句類似于VHDL中的并發(fā)信號賦值,其格式為

assign[驅(qū)動強度][#延遲值]線網(wǎng)標(biāo)識符=表達(dá)式{,線網(wǎng)標(biāo)識符=表達(dá)式};它所表達(dá)的動作是:在行為風(fēng)格的構(gòu)件(過程)之外采用assign語句對一個或多個線網(wǎng)持續(xù)賦值。它與門基元類似,只能對線網(wǎng)類數(shù)據(jù)進(jìn)行賦值。線網(wǎng)結(jié)構(gòu)非常重要,它對應(yīng)的就是物理互連線。由于線網(wǎng)是默認(rèn)的,所以實現(xiàn)連接比較方便。在電路仿真中,一旦表達(dá)式中的一個值發(fā)生變化,就要重新計算表達(dá)式,并將結(jié)果賦給被驅(qū)動的標(biāo)識符。

它沒有保持的概念,需要不停地持續(xù)賦值才行。它完全類似于實際硬件中的一個邏輯門驅(qū)動一條實際互連線的真實情況?!俺掷m(xù)”的含義可以理解為右邊的“風(fēng)吹草動”直接聯(lián)動到左邊。例如:

assignpwr_on=1;

下面以8位數(shù)值比較器為例闡明:

moduleMgCp(A,B,AgtB,AeqB,AltB,C);

parameterBus=8;

parameterEQ_Dl=5,LT_Dl=8,GT_Dl=8;

input[1:Bus]A,B,C;

outputAgtB,AeqB,AltB;

assign#EQ_DlAeqB=A==B;

assign#GT_DlAgtB=A>B;

assign#LT_DlAltB=A<B,C=A+B;

endmodule持續(xù)賦值語句之間是并發(fā)的,每一句都是各自根據(jù)條件自行其是,與書寫的先后順序無關(guān)。

線網(wǎng)的延遲一般采用慣性延遲模型,即小于線延遲的輸入端電平變化在輸出端將被忽略。

注意,持續(xù)賦值、過程內(nèi)第一類force-release形式的持續(xù)賦值語句左端的數(shù)據(jù)類型為net,而一般的行為賦值語句(包括阻塞和非阻塞賦值)和過程內(nèi)assign-deassign、另一類force-release形式的持續(xù)賦值語句左端的數(shù)據(jù)類型則為reg。但需要提醒的是,對于賦值語句右端的數(shù)據(jù)類型則沒有太多的限制。此外,一個模塊中數(shù)據(jù)流還允許和其他風(fēng)格混合編寫。

7.5行為風(fēng)格描述

Verilog中行為風(fēng)格的概念與VHDL相類似,但是許多地方比較簡化,設(shè)計師用其來描述那些比較復(fù)雜的組合電路和時序邏輯。下面首先介紹構(gòu)件、塊、賦值、時序、程控的概念要點。

直接采用initial和always兩種構(gòu)件(Construct,見附錄2IEEE-1364標(biāo)準(zhǔn)句法匯總中的行為語句部分)進(jìn)行設(shè)計。構(gòu)件,又稱過程,主要由時序控制、程序控制語句和賦值語句組成。

?Verilog中的task、function的定義(聲明)是兩種比構(gòu)件低一級的公用子程序,它們定義的格式與構(gòu)件類似。在兩類子程序調(diào)用中,任務(wù)調(diào)用是一種專門的語句,而函數(shù)調(diào)用則是一個表達(dá)式。

Verilog的構(gòu)件中可以有begin_end格式的串行塊,也可以有fork_join格式的并行塊。

賦值語句,就是將由操作符加操作數(shù)組成表達(dá)式的值賦給賦值符號左邊的線網(wǎng)和變量。行為構(gòu)件過程中的賦值語句類別有兩種:一般行為賦值和(行為)過程內(nèi)持續(xù)賦值。在構(gòu)件的initial和always構(gòu)件內(nèi)的一般賦值稱為行為賦值(或稱過程內(nèi)一般賦值),其符號左邊必須是寄存器一類的變量類型,但是它仍然適用于描述比較復(fù)雜的組合邏輯;而過程內(nèi)持續(xù)賦值則是在構(gòu)件內(nèi)的強制性準(zhǔn)持續(xù)賦值。

一般的行為賦值也分為兩種:阻塞(Blocking)和非阻塞(Non-blocking)賦值。

無疑,構(gòu)件中需要延遲和事件等時序控制,此外,也需要分支、循環(huán)、等待、禁止等程序控制,這就是Verilog的程序控制語句。

在Verilog的兩種構(gòu)件、兩種子程序、兩種塊結(jié)構(gòu)框架下,根據(jù)要求將時序控制前綴、賦值語句和程序控制語句相組合去處理各種數(shù)據(jù),就可以構(gòu)建出異彩紛呈的行為描述,下面分別加以介紹。7.5.1構(gòu)件過程、子程序與塊語句

1.初始化(initial)構(gòu)件過程

initial構(gòu)件在整個仿真期間只被執(zhí)行一次。一個模塊中使用initial構(gòu)件的次數(shù)不受限制,所出現(xiàn)的位置也沒有約定和限制。實際上,在真正做邏輯綜合時,所有initial構(gòu)件都將被忽略。

初始化構(gòu)件過程的格式為

initial一般語句

上面格式中的一般語句(Statement)可以是賦值語句、帶有過程內(nèi)時序控制前綴的一般語句、程序控制語句(含if、case、loop、wait、disable等語句)、事件創(chuàng)建語句、塊(含串行、并行塊)語句、任務(wù)調(diào)用(或者系統(tǒng)任務(wù)調(diào)用)語句等。這些一般語句基本上都是允許嵌套的。

initial通常用來完成初始化。例如初始化寄存器和存儲器:

initial

begin

areg=0;

for(index=0;index<size;index=index+1)

memory[index]=0;

end

注意,initial也可以用于程序的結(jié)束,因為它也是一次性的。

2.總是(always)構(gòu)件過程

always構(gòu)件可以理解成一個“while(true)”循環(huán)執(zhí)行機制。它常用于描述時序邏輯電路。需要強調(diào)的是,兩個或更多的always構(gòu)件間是并發(fā)執(zhí)行的。always構(gòu)件不斷反復(fù)循環(huán)被執(zhí)行,直到仿真結(jié)束。一個模塊中使用always構(gòu)件的次數(shù)不受限制。

always構(gòu)件的格式為

always一般語句

與initial構(gòu)件一樣,這里的一般語句也可以是賦值語句、帶有過程內(nèi)時序控制前綴的一般語句、程序控制語句(含if、case、loop、wait、disable等語句)、事件創(chuàng)建語句、塊(含串行、并行塊)語句、任務(wù)調(diào)用語句、系統(tǒng)任務(wù)調(diào)用語句等。例如產(chǎn)生時鐘變量和不斷計數(shù):

(1)?always#20areg=~areg;

//#20是指20個時間單位

(2)?always@(posedgeareg)

//@表示當(dāng)…事件

begin

count=count+1;

end

(3)?always#5cun=(cun!=25)?(cun+1):5;需要提醒的是:由于多個always構(gòu)件間是并發(fā)的,一定要將賦值延遲設(shè)計恰當(dāng)。要與賦值的先后順序配合好,以防止出現(xiàn)不希望的數(shù)據(jù)滑動。

為了能夠有效地綜合,應(yīng)事先確認(rèn)always中所描述的狀態(tài)機是由惟一的時鐘所觸發(fā)。

always構(gòu)件中可以同時包含串行塊begin_end和并行塊fork_join。

3.任務(wù)(task)子程序及調(diào)用

task和function都是一種公用的子程序定義性描述,任務(wù)和函數(shù)只能在模塊項聲明中定義,然后可以在initial或always構(gòu)件中多次被調(diào)用。利用任務(wù)和函數(shù)完成大程序的化簡和層次分解。

任務(wù)可以啟動其他任務(wù)和函數(shù);任務(wù)可以包含時序控制;任務(wù)可以定義自己的仿真時間單位;任務(wù)可以有多個任何類型的輸入量(或者沒有輸入量);任務(wù)返回值通過輸出端口給出,如下面例子所示;任務(wù)可以返回,也可以不返回輸出值。任務(wù)定義的格式為

task

任務(wù)名;//無端口列表

輸入輸出端口聲明

數(shù)據(jù)類型聲明

一般語句

endtask

任務(wù)定義中的一般語句可以嵌入在串行塊和并行塊結(jié)構(gòu)中,允許展開成多個一般語句。

任務(wù)調(diào)用(enable)可以在always和initial構(gòu)件中使用,它的格式為

任務(wù)名[(表達(dá)式1,表達(dá)式2,…,表達(dá)式n)];下面給出任務(wù)設(shè)計及應(yīng)用舉例——完成8位數(shù)的高位和低位的交換:

moduleHas_Task;

parameterMAXBITS=8;

taskReverse_Bits;//任務(wù)定義

input[MAXBITS-1:0]Din;//端口聲明先后有序

output[MAXBITS-1:0]Dout;

integerk;

begin

for(k=0;k<MAXBITS;k=k+1)

Dout[MAXBITS-1-k]=Din[k];

end

endtask

reg[MAXBITS-1:0]Reg_X,New_Reg;//為了任務(wù)調(diào)用的聲明

Reverse_Bits(Reg_X,New_Reg);//此時參數(shù)的順序必須與定義時相一致

endmodule

4.函數(shù)(function)子程序及調(diào)用

函數(shù)至少有一個輸入?yún)⒘恐?;函?shù)也必須而且只能返回一個輸出函數(shù)值;定義函數(shù)時必須至少用一條賦值語句為函數(shù)輸出寄存器賦結(jié)果值;函數(shù)不能包含時序控制;函數(shù)只能和主程序共用一個仿真時間單位;函數(shù)無法啟動任務(wù)。在原程序中被調(diào)用的函數(shù)起到表達(dá)式的作用。函數(shù)常用來對組合邏輯建模。函數(shù)定義的格式為

function[返回輸出值的類型和范圍]函數(shù)名;

輸入端口聲明

數(shù)據(jù)類型聲明

一般語句

endfunction

函數(shù)定義中的一般語句可以嵌入在串行塊和并行塊結(jié)構(gòu)中,允許展開成多個一般語句。注意,函數(shù)定義中不能出現(xiàn)時序控制,即延遲#、事件@等標(biāo)識符,也不能包括wait語句。

格式中的[返回輸出值的類型和范圍],給出對以(函數(shù)名)命名的輸出寄存器的聲明;如果返回值聲明默認(rèn),則默認(rèn)該函數(shù)為一位數(shù)寄存器。

函數(shù)調(diào)用(call)是一個表達(dá)式,它的格式為

函數(shù)名(輸入表達(dá)式1,輸入表達(dá)式2,…,輸入表達(dá)式n);函數(shù)設(shè)計及應(yīng)用舉例——完成8位數(shù)的高位和低位的交換:

moduleFunction_Example;

parameterMAXBITS=8;

function[MAXBITS-1:0]Reverse_Bits; //函數(shù)定義

input[MAXBITS-1:0]Din; //端口聲明先后有序,輸出則勿須聲明

integerk;

begin

for(k=0;k<MAXBITS;k=k+1)

Reverse_Bits[MAXBITS-1-k]=Din[k];

end

endfunction

reg[MAXBITS-1:0]Reg_X,New_Reg; //為了函數(shù)調(diào)用的聲明

New_reg=Reverse_Bits(Reg_X); //多參數(shù)時順序必須與定義時相一致

endmodule

5.串行塊(seq_block)語句

在行為描述的構(gòu)件中主要有兩種塊語句:串行塊(seq_block)語句和并行塊(par_block)語句。塊內(nèi)由許多語句構(gòu)成一個總的統(tǒng)一塊語句。

在串行塊內(nèi)的begin和end(起始和結(jié)束)之間的語句按順序執(zhí)行,每條語句的延遲時間是相對于前一條語句的仿真時間而言的。整個塊的最初起始時間是塊內(nèi)第一個語句開始被執(zhí)行的時間;整個塊的最后結(jié)束時間是塊內(nèi)最后一條語句執(zhí)行結(jié)束的時間。串行塊語句的格式為

begin[:塊名]

[塊內(nèi)聲明]

一般語句1

一般語句2

一般語句n

end

格式中的[塊內(nèi)聲明],可以是多種數(shù)據(jù)類型聲明,包括integer、real、reg、parameter等。舉例:

begin

areg=breg;

creg=breg;

end

串行語句可以出現(xiàn)在initial和always構(gòu)件中;串行塊可以嵌套。串行塊中的延遲采用的是相對延遲。

6.并行塊(par_block)語句

在并行塊fork_join(分叉和匯合)內(nèi)的語句同時開始、并行執(zhí)行,每條語句的延遲量是相對于程序進(jìn)入到塊內(nèi)的仿真時間而言,相互間是獨立的。當(dāng)執(zhí)行完按絕對仿真時間排在最后的語句(不一定是寫在最后的語句)之后,或者程序執(zhí)行了一條禁止disable語句之后,程序就從塊語句跳出。整個塊的最初起始時間對于塊內(nèi)的所有語句都是相同的,即程序流進(jìn)入該塊的時間;塊結(jié)束時間是塊內(nèi)按絕對仿真時間排在最后的一條語句執(zhí)行結(jié)束的時間。只有該塊結(jié)束之后,跟在該塊后面的語句才得以執(zhí)行。fork_join塊內(nèi)的語句不必按順序給出。并行塊語句的格式為

fork[:塊名]

[塊內(nèi)聲明]

一般語句1

一般語句2

一般語句n

join

格式中的[塊內(nèi)聲明]可以是多種數(shù)據(jù)類型聲明,包括integer、real、reg、parameter、time、event等。舉例:

fork

#50r=‘h35; //無位寬的十六進(jìn)制數(shù)

#100r=’hE2;

#150r=‘h00;

#200r=’hF7;

#250->end_wave; //創(chuàng)建事件end_wave用的event_trigger語句

join

并行塊內(nèi)的延遲采用的是絕對延遲。

串行塊中可以嵌套并行塊,并行塊中可以嵌套串行塊。在設(shè)計ASIC時,要慎用fork_join語句,因為難于硬件實現(xiàn)。7.5.2行為風(fēng)格中的賦值語句

行為風(fēng)格中的賦值語句有兩類:構(gòu)件過程內(nèi)的一般賦值(包括阻塞和非阻塞賦值);構(gòu)件過程內(nèi)的持續(xù)賦值(包括assign-deassign和force-deforce兩種形式的賦值)。

1.一般賦值語句

行為風(fēng)格中的一般賦值語句,只能實現(xiàn)對reg類型變量數(shù)據(jù)的賦值。

=、<=分別為阻塞和非阻塞賦值符號(注意,不要將非阻塞賦值符號<=與小于等于符號<=混淆)。

1)阻塞式(Blocking)賦值

這是一種立即賦值,可以理解為排他性賦值。例如,a=b;使得a立即獲得值b。位于賦值關(guān)系式右側(cè)(RHS)的值或任何表達(dá)式按照定時要求更新位于左側(cè)(LHS)的寄存器或存儲器的值,并且保持該值直到另一個賦值語句啟動。

例如:

always@(c)y=a;賦值語句當(dāng)事件c出現(xiàn)時立即改變y(reg)的值,并將保持下去,其默認(rèn)初始值為x。此時,允許把wire上的值賦給reg。

又如:

begin

a=#2b;

c=#3a;

end

2)非阻塞式(Non-blocking)賦值

類似VHDL的信號賦值,它只對寄存器類型變量賦值,是在構(gòu)件過程結(jié)束后的統(tǒng)一時刻才真正賦值。這類非阻塞賦值語句將根據(jù)構(gòu)件規(guī)定的時序控制條件,同步同時并發(fā)地執(zhí)行。例如,某一模塊中有一個always@(c)a<=b;語句,則a不能立即獲得值b。需要和其他同類語句一起,等到條件c為真時同時賦值。大型數(shù)字系統(tǒng)行為中所有的記憶單元一般都是由相同時鐘邊沿同步并發(fā)控制地變化,非阻塞賦值就是與這種實際情況相對應(yīng)。

非阻塞賦值中的延遲是絕對延遲,從某一時刻起始統(tǒng)一計時。除了并行塊和非阻塞賦值外,其他均取相對延遲,即一句與一句之間的相對延遲值。構(gòu)件中的非阻塞賦值間是并發(fā)的,句法沒有規(guī)定它們的順序。如同VHDL一樣,語法規(guī)定賦值符號右邊表達(dá)式中要代入變量的原值。例如,下面表達(dá)式中的變量a。

begin

a<=#2b;

c<=#3a;

end

2.持續(xù)賦值語句

Verilog中過程內(nèi)持續(xù)賦值語句(ProceduralContinuousAssignment)是在構(gòu)件內(nèi)采用assign-deassign或force-release形式的強制性賦值語句。它們具有持續(xù)賦值的特征,也被稱為準(zhǔn)持續(xù)賦值。不過,這里給出的賦值只在一段時間內(nèi)有效。assign-deassign只對reg賦值,force-release可以對reg或net賦值。描述一個帶異步置位和異步復(fù)位端的D觸發(fā)器電路,可以加入assign-deassign。舉例:

always@(reset_orset_)//低電平有效

if(!reset_)assignq=0;

elseif(!set_)assignq=1;

else

deassignq;

/*上邊的deassign解賦值語句,使得強制賦值方式取消。寄存器q可以再賦它值,例如接著執(zhí)行下述賦值語句*/

always@(posedgeclock)q=d; … 在過程內(nèi)持續(xù)賦值句法中,assign-deassign對應(yīng)于一些異步操作。有學(xué)者認(rèn)為其風(fēng)格怪異,主張盡量少用。

與上述assign-deassign形式對稱的還有force-release形式。兩種形式的共同點是:右端表達(dá)式中操作數(shù)的任何變化都會導(dǎo)致強制執(zhí)行賦值語句,這正是準(zhǔn)持續(xù)的含義。它們的不同點是:assign-deassign用于寄存器reg賦值;而force-release除了可以對reg賦值外,還可以用于行為描述中對線網(wǎng)net賦值。force-release主要用于仿真調(diào)試。7.5.3過程內(nèi)語句中的時序控制

VerilogHDL過程內(nèi)語句(procedural_timing_control_statement)擁有時序控制的前綴。這樣,用時序控制來給出仿真器時間的推進(jìn)方式,在仿真中對發(fā)生時刻(用前綴符號#來表征)和事件次序(用前綴符號@來表征)實施控制。

時序控制分為門級時序模型和行為時序模型兩種。數(shù)據(jù)流和結(jié)構(gòu)對應(yīng)門級時序;行為風(fēng)格對應(yīng)行為時序。與7.3.3節(jié)中介紹過的門級時序模型相類似,這里的行為時序控制除了延遲控制之外,還有事件控制。一般設(shè)計中,可以讓延遲控制和事件控制共同起時序控制作用。

1)延遲控制

延遲控制采用符號#,少了上升、下降、高阻的區(qū)別。其格式有兩種:

#

延遲值

#

(最小延遲:典型延遲:最大延遲)

#6表示有6個時間單位延遲,其在語句中共有兩種寫法。舉例:

(1)?x=#3y;//它等價于下列內(nèi)插延遲

begin

hold=y;

#3;

x=hold;

end

(2)?#3x=y;//它等價于

begin

#3;

x=y;

end

Verilog的數(shù)據(jù)流和結(jié)構(gòu)風(fēng)格中,對于門延遲也是采用延遲控制描述。

2)事件控制

事件(Event)的含義與VHDL相似,主要指任何值的變化,即邊沿跳變,用得較多的有posedge表示正邊沿;negedge表示負(fù)邊沿。正邊沿描述有01、0x、x1三種;負(fù)邊沿描述有10、1x、x0三種(z也參與變化,但一般不考慮z)。

事件名就是事件標(biāo)識符,它是對事件進(jìn)行的專門標(biāo)識。例如變量ae可以產(chǎn)生值的變化,就可以將ae單獨命名為事件名,以表示“它的值發(fā)生了變化”這件事。用event聲明來定義具體的事件名,形如:

eventae;

事件控制的格式為

@事件名或

@(事件表達(dá)式)

@(事件表達(dá)式or

事件表達(dá)式)

事件表達(dá)式可以寫成單個或兩個操作數(shù)之間的運算。操作數(shù)可以是具體的數(shù)、標(biāo)識符或者表達(dá)式。例如,表示一直要等到事件ae發(fā)生這一條件的到來:

@ae注意下面二者的區(qū)別:

@事件名;一般語句

/*上面等價于兩句,如果出現(xiàn)在begin_end塊中在句法上就是對的。是要等待事件發(fā)生后執(zhí)行一個空語句,一般語句才執(zhí)行*/

@事件名一般語句//是指當(dāng)事件出現(xiàn)時刻,就執(zhí)行一般語句

#延遲量

->事件名;

上式表示在左邊的延遲條件下,將創(chuàng)建右邊的事件。形如:

#5->ae;這時從功能上它可以等效于:

#5

begin

ae=0;

#0a

溫馨提示

  • 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

提交評論