版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
7.1VerilogHDL概要7.2VerilogHDL基礎(chǔ)知識(shí)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)試與測(cè)試7.9VerilogHDL與VHDL的對(duì)比7.10課程設(shè)計(jì)練習(xí)7.11VerilogHDL擴(kuò)展與支撐技術(shù)第7章VerilogHDL系統(tǒng)設(shè)計(jì)語言
7.1VerilogHDL概要
VerilogHDL(簡(jiǎn)稱Verilog)是一種通用的硬件電路設(shè)計(jì)高級(jí)語言,設(shè)計(jì)師用它來進(jìn)行數(shù)字系統(tǒng)與電路的設(shè)計(jì)。它最初由GDA(GatewayDesignAutomation)公司的PhilMoorby于1983年創(chuàng)建。之后GDA公司并入Cadence公司,Verilog遂成為Cadence公司的專利技術(shù)。其出色的門級(jí)快速仿真工具Verilog-XL迅速獲得成功,為Verilog的廣泛應(yīng)用奠定了基礎(chǔ)。
(1)從1990年開始,經(jīng)過OVI(OpenVerilogInternational)VerilogHDL研究開發(fā)計(jì)劃的推動(dòng),Verilog于1995年被正式確定為IEEEStd1364-1995標(biāo)準(zhǔn)。
(2)2001年9月公布了Verilog標(biāo)準(zhǔn)的新版本IEEEStd1364-2001。2001版本主要在行為描述、ASIC底層、外圍環(huán)境接口三個(gè)方面進(jìn)行了改進(jìn)。在本書后面的附錄2中給出了IEEE-1364-2001版本新增的保留關(guān)鍵字和按類別不同的句法匯總修訂。
(3)國(guó)際標(biāo)準(zhǔn)化部門于2002年又推出了IEEEStd1364.1-2002,它是一個(gè)關(guān)于寄存器轉(zhuǎn)移級(jí)綜合方面的附屬標(biāo)準(zhǔn)。
(4)經(jīng)過OSCI(OpenSystemCinitiative,SystemC開放促進(jìn)會(huì))的努力,于2005年將SystemC確定為IEEE1666標(biāo)準(zhǔn),可以免費(fèi)下載。
(5)2006年,公布了Verilog2001的修訂版IEEEStd1364-2005,詳見參考文獻(xiàn)《IEEEStandardforVerilogHardwareDescriptionLanguage2005及附錄2》。同年,SystemVerilog也被確定為IEEEStd1800-2005標(biāo)準(zhǔn),全面包容Verilog,所編同樣功能的代碼,其行數(shù)約為Verilog的1/2~1/5。目前,這兩個(gè)IEEE-2005標(biāo)準(zhǔn)之間是一致和兼容的。根據(jù)計(jì)劃安排,2008年要將IEEE-1364整合進(jìn)IEEE-1800標(biāo)準(zhǔn)之中。7.1.1VerilogHDL的特點(diǎn)
1.語法結(jié)構(gòu)簡(jiǎn)單,易學(xué)實(shí)用
VerilogHDL語言與C語言很接近,易學(xué)易用。借助于本書前面的VHDL基礎(chǔ),學(xué)習(xí)VerilogHDL就顯得比較容易。目前,Verilog在國(guó)外,尤其是美國(guó)和歐洲得到廣泛的應(yīng)用。與VHDL一樣,VerilogHDL支持系統(tǒng)與電路設(shè)計(jì)創(chuàng)建描述(輸入歸檔、交流修改)、設(shè)計(jì)模擬仿真(驗(yàn)證、時(shí)序分析、調(diào)試聯(lián)試,這方面Verilog尤其擅長(zhǎng))、設(shè)計(jì)綜合(有底層庫(kù)的強(qiáng)力支撐)、設(shè)計(jì)測(cè)試(故障覆蓋、測(cè)試代碼生成ATPG)等貫穿產(chǎn)品研制全程四個(gè)方面的功能。
2.具有豐富的底層器件資源和ASIC廠商支持
VerilogHDL便于開展自底向上的設(shè)計(jì),因?yàn)樗囊粋€(gè)顯著特點(diǎn)是具有豐富的底層器件資源支持。方便的內(nèi)建基元和用戶定義基元適于采用模塊化、結(jié)構(gòu)化設(shè)計(jì);特別是與底層門級(jí)開關(guān)電路打交道較多的設(shè)計(jì)比較優(yōu)化;綜合成EDIF格式電路結(jié)構(gòu)化網(wǎng)表的效率較高。現(xiàn)在許多ASIC制造廠商將其作為設(shè)計(jì)制造間簽發(fā)(Sign-Off)的工具。
3.支持行為、結(jié)構(gòu)、數(shù)據(jù)流三種風(fēng)格描述,具有較好的可綜合性
VerilogHDL支持行為、結(jié)構(gòu)兩種類型風(fēng)格描述,數(shù)據(jù)流采用類似于行為風(fēng)格的描述,但是對(duì)應(yīng)于寄存器轉(zhuǎn)移一級(jí)(RTL)的結(jié)構(gòu)。一個(gè)模塊內(nèi)允許行為風(fēng)格和結(jié)構(gòu)風(fēng)格相互連接。VerilogHDL在綜合,特別在RTL級(jí)的綜合方面具有明顯的優(yōu)勢(shì)。然而,Verilog在系統(tǒng)級(jí)接近頂層的抽象設(shè)計(jì)能力較弱,而且還有許多是不可綜合的。設(shè)計(jì)前期可以多用些行為描述與仿真,設(shè)計(jì)后期再用結(jié)構(gòu)手法以便綜合。目前出現(xiàn)的SystemVerilog彌補(bǔ)了這方面的不足。
4.面向Top-Down設(shè)計(jì)的機(jī)制
VerilogHDL以模塊(Module)設(shè)計(jì)手法為主,由大小不同的模塊直接嵌套形成層次結(jié)構(gòu)化設(shè)計(jì)體系。憑借豐富的函數(shù)和任務(wù)等復(fù)用手段,高層設(shè)計(jì)可以方便地進(jìn)行行為風(fēng)格描述和仿真。這些都是設(shè)計(jì)師采用自上而下設(shè)計(jì)策略的基礎(chǔ)。
5.豐富的編譯調(diào)試手段和EDA廠商支持
與EDA關(guān)系密切的VerilogHDL,本身就具有豐富的編譯調(diào)試手段,大量實(shí)用的編譯預(yù)處理宏命令、系統(tǒng)函數(shù)和任務(wù),使得編譯、仿真、綜合的交互性較好。
6.提供與其他語言和開發(fā)環(huán)境間強(qiáng)大的接口能力
VerilogHDL提供編程語言接口(PLI)、Verilog接口例程(VPI)、ACC(Access,訪問接口)、標(biāo)準(zhǔn)延遲格式(SDF)等,使得外圍可擴(kuò)展能力非常強(qiáng)。7.1.2VerilogHDL模塊
1.模塊句法結(jié)構(gòu)
模塊設(shè)計(jì)在句法中又被總稱為模塊聲明(module_
declaration),其基本格式如下:
module
module_identifier[(list_of_ports)];//模塊命名并列出端口名
/*以下是關(guān)于模塊項(xiàng)聲明(module_item_declarations)段*/
input_declaration|output_…|inout_…
|reg_…|net_…|parameter_…|integer_…
|function_…|task_…|event_…|…
/*以下是模塊項(xiàng)(module_items)描述段*/
initial_construct
|always_construct
|module_instantiation
|gate_instantiation
|udp_instantiation
|continuous-_assign
|parameter_override
|specify_block
endmodule
2.模塊中的項(xiàng)語句結(jié)構(gòu)
VerilogHDL程序由模塊組成,每個(gè)模塊都是安排在module和endmodule兩個(gè)關(guān)鍵字之間。每個(gè)模塊功能明確,模塊間可以實(shí)現(xiàn)從底層到頂層層次化的模塊嵌套調(diào)用。
模塊內(nèi)的基本架構(gòu)主要是由兩大段項(xiàng)語句組成:①相關(guān)的項(xiàng)聲明(module_item_declarations)段;②其他實(shí)質(zhì)性項(xiàng)描述語句(module_items)段。項(xiàng)聲明對(duì)模塊中用到的各種數(shù)據(jù)、端口、函數(shù)、任務(wù)等加以聲明,項(xiàng)描述語句則用來描述電路的功能或結(jié)構(gòu)。有三類項(xiàng)描述語句可用來設(shè)計(jì)模塊,即行為構(gòu)件、持續(xù)賦值、實(shí)例生成。此外,還有參數(shù)重置、規(guī)定塊兩類項(xiàng)描述語句。
除了endmodule之外,每個(gè)項(xiàng)聲明和項(xiàng)描述語句的最后必須有分號(hào)。Verilog允許一行寫幾個(gè)語句;也可以一個(gè)語句占有幾行。
3.端口定義和模塊項(xiàng)聲明
在模塊名后面緊接著定義端口的圓括號(hào)中,對(duì)模塊的輸入輸出端口進(jìn)行定義。
然后,在項(xiàng)聲明段中給出端口模式的聲明。端口可以是input、output、inout三種模式,均需要在這里明確聲明。reg不能做為input或inout端口。
端口定義及端口I/O模式聲明的格式為
module模塊名[(口1,口2,口3,…)];//圓括號(hào)中給出端口定義
input
口2,口3,…;//在項(xiàng)聲明段給出端口模式聲明
output
口1,…;
inout…;
…;在模塊項(xiàng)聲明段module_item_declarations的部分,還要對(duì)模塊內(nèi)部所用其他項(xiàng)進(jìn)行聲明。一方面要對(duì)模塊中用到的各種數(shù)據(jù)類型加以聲明,包括參數(shù)(parameter)、線網(wǎng)(net)、寄存器(reg)、整數(shù)(integer)、實(shí)數(shù)(real)、時(shí)間(time)等;另一方面要對(duì)公用子程序,包括函數(shù)(function)、任務(wù)(task),以及事件(event)等加以聲明。
4.模塊項(xiàng)描述段和層次
在模塊聲明段之后的項(xiàng)描述段,給出模塊輸入輸出關(guān)系的描述;給出模塊功能及結(jié)構(gòu)描述。包括描述行為的構(gòu)件類(initial_construct;always_construct等)、描述結(jié)構(gòu)的實(shí)例生成(module_instantiation;gate_instantiation;udp_instantiation)、描述數(shù)據(jù)流的獨(dú)立持續(xù)賦值(continuous_assign)等語句。下面先用設(shè)計(jì)簡(jiǎn)例分別大致加以介紹。
Verilog實(shí)質(zhì)性的設(shè)計(jì)嵌套,實(shí)現(xiàn)起來非常簡(jiǎn)單。與VHDL不同的是,Verilog的模塊中可以調(diào)用(實(shí)例生成)其他模塊,但不能聲明其他模塊。調(diào)用時(shí)采用名稱相關(guān)和位置相關(guān)兩種手法,如7.1.3中例3所示。另外,還可以采用層次化名稱法引用其他模塊內(nèi)部的標(biāo)識(shí)符。7.1.3VerilogHDL設(shè)計(jì)簡(jiǎn)例
為了對(duì)采用VerilogHDL語言設(shè)計(jì)盡早有一個(gè)感性認(rèn)識(shí),這里舉出幾種風(fēng)格的典型設(shè)計(jì)簡(jiǎn)例。通過分析并與VHDL比較,有助于深入理解后面更為復(fù)雜的設(shè)計(jì)。
1.例1——與或非門設(shè)計(jì)
/*如圖7-1所示給出數(shù)據(jù)流描述的結(jié)構(gòu)*/
`timescale1ns/100ps
/*指定時(shí)間單位1ns和精度100ps*/
moduleaoi21(d,a,b,c);
inputa,b,c;
outputd;
assign
#5d=~((a&b)|c);
/*賦值延遲為5ns,按位操作,持續(xù)賦值,實(shí)現(xiàn)與或非*/
endmodule圖7-1與或非門aoi21設(shè)計(jì)
2.例2——四位加法器設(shè)計(jì)
/*如圖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;//并置后共計(jì)五位
endmodule圖7-2四位加法器
3.例3——模塊調(diào)用
采用層次化結(jié)構(gòu)風(fēng)格,頂層主模塊topmd調(diào)用底層三態(tài)門子模塊bomtri實(shí)例生成一個(gè)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è)計(jì)
4.例4——D觸發(fā)器設(shè)計(jì)
如圖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,但一般不計(jì)z1和0z)。negedge與此類似*/
begin
if(clr)q<=0;//<=為非阻塞性賦值
elseif(ena)q<=d;
end
endmodule
注意,上面例4中if_else_if是時(shí)序語句,其順序?yàn)閕f→elseif。圖7-4D觸發(fā)器設(shè)計(jì)
7.2VerilogHDL基礎(chǔ)知識(shí)
7.2.1數(shù)據(jù)及類型
1.標(biāo)識(shí)符和注釋
由字母、數(shù)字、下劃線等組成的一組符號(hào)稱為標(biāo)識(shí)符(Identifier),在VerilogHDL中用它來表示各種線網(wǎng)、變量、參數(shù)或構(gòu)件的名稱,而且大寫與小寫是不一樣的。為了簡(jiǎn)單起見,建議所給出的第一個(gè)字符采用英文字母,其余字符采用英文字母、下劃線和數(shù)字。例如7.1.3節(jié)中例1的模塊名稱aoi21等。
Verilog用不同的后綴表示不同的文件類型。例如,用*.v表示源程序(有些設(shè)計(jì)環(huán)境采用*.tf表示測(cè)試模塊)等。這里的*.v也是一種標(biāo)識(shí)符。
Verilog程序中的注釋有以下兩種。
短注釋:參見附錄2的句法匯總中綜合類關(guān)于one_line_comment的句法定義。在每行程序的后邊半行,以//開始的文字部分為注釋內(nèi)容。用\n表示注釋文字的后面通常跟有一個(gè)換行符。
長(zhǎng)注釋:在程序行之間位于/*…*/之內(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)化元件之間的物理硬件互連線。它不能存儲(chǔ)值,而必須受到驅(qū)動(dòng)器的驅(qū)動(dòng)。當(dāng)沒有驅(qū)動(dòng)器連接到線網(wǎng)類上時(shí),該線網(wǎng)則呈現(xiàn)高阻。
最常用的線網(wǎng)類數(shù)據(jù)是wire和tri(二者等價(jià)。wire表示單個(gè)門驅(qū)動(dòng),tri表示多個(gè)門驅(qū)動(dòng))。ASIC設(shè)計(jì)中的wire不能存儲(chǔ)和保存值,只作傳輸被持續(xù)賦值語句驅(qū)動(dòng)的值,其默認(rèn)值為z。
未聲明的數(shù)據(jù)默認(rèn)是net類型,后面將給出它的詳細(xì)格式。net的默認(rèn)位數(shù)為1,即標(biāo)量型;而矢量需要顯式聲明。對(duì)此,可以理解為:Verilog隱含的數(shù)值類型為標(biāo)量型線網(wǎng)邏輯類數(shù)據(jù)。但這里隱含的是四值邏輯,類似于VHDL中的bit量。
下面具體介紹這種數(shù)據(jù)形態(tài)類型。
線網(wǎng)中的wire又被稱為連線型線網(wǎng),用來表示連接單元的硬互連線。承載的是組合邏輯值,通常由單個(gè)門驅(qū)動(dòng)或由持續(xù)賦值語句驅(qū)動(dòng)。Verilog中的輸入、輸出默認(rèn)數(shù)據(jù)類型為wire(tri型則用來表示多驅(qū)動(dòng)器驅(qū)動(dòng)同一根連線的情況)。
多位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(需要單獨(dú)聲明)、tri0、tri1、tri(總線輸入全1時(shí)輸出結(jié)果為1,輸入全0時(shí)則輸出為0,其余為x)、trior、triand、wor(wired-or線或型線網(wǎng))、wand(wired-and線與型線網(wǎng))、wire(可以與tri功能相同)等。其中惟有trireg特殊,它表示線網(wǎng)上掛有電容,可用來描述電荷存儲(chǔ)值。電荷強(qiáng)度級(jí)別有l(wèi)arge、medium(默認(rèn)強(qiáng)度值)、small。
沒有被聲明的線網(wǎng)默認(rèn)為1位線網(wǎng)。對(duì)線網(wǎng)類型的限定詞有標(biāo)量scalared、矢量vectored等,默認(rèn)值為標(biāo)量。被聲明為矢量的線網(wǎng)不允許按位直接運(yùn)算。線網(wǎng)類可以擁有邏輯值。
3.變量類別數(shù)據(jù)
在Verilog的新標(biāo)準(zhǔn)中,取消了寄存器(register)一類的提法,以變量代替。與VHDL非常不同,這里的變量包括存儲(chǔ)類(reg、memory)、整數(shù)類、實(shí)數(shù)類、時(shí)間類等數(shù)據(jù)。
最常用的存儲(chǔ)類數(shù)據(jù)有寄存器型reg。存儲(chǔ)器型memory則是由reg組成的數(shù)組,它是Verilog的一種多維數(shù)據(jù)構(gòu)成的表征形式。
reg類可以在驅(qū)動(dòng)撤銷時(shí)仍能保存數(shù)據(jù)值,但并不總與硬件的寄存器、觸發(fā)器、鎖存器等價(jià)。在個(gè)別情況下,它也可能是組合邏輯。
1)寄存器(reg)型
寄存器reg用來表示數(shù)據(jù)記憶單元,通過行為賦值語句可以改變存儲(chǔ)的值,reg的默認(rèn)位數(shù)也是1。用reg定義的變量將用在always構(gòu)件內(nèi),常用它代表觸發(fā)器。在always構(gòu)件內(nèi)賦值的每一個(gè)變量都必須定義成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)存儲(chǔ)器(memory)型
在Verilog中,存儲(chǔ)器數(shù)據(jù)不是一個(gè)獨(dú)立的類型,它是寄存器類型reg派生出來的。通過對(duì)reg型數(shù)據(jù)建立數(shù)組來加以定義,用來描述RAM、ROM等存儲(chǔ)器電路和reg文件。
存儲(chǔ)器類型定義語句格式為
reg[n:1]存儲(chǔ)器名[m:1];//(也可以用格式[m-1:0])
其中reg[n:1]表示存儲(chǔ)器中寬度為n的一個(gè)單元。例如:reg[7:0]mema[255:0];定義了存儲(chǔ)器mema,其記憶單元地址范圍為從0~255。如果要對(duì)存儲(chǔ)器中的記憶單元進(jìn)行讀寫,必須指定它在存儲(chǔ)器中的一個(gè)地址。地址值可以用表達(dá)式表示,通過計(jì)算來獲得不同的地址值。不允許對(duì)存儲(chǔ)器單元的部分位進(jìn)行直接運(yùn)算。
3)區(qū)間型
區(qū)間型變量主要包括integer(整數(shù))、real(實(shí)數(shù))、time(時(shí)間)、realtime(實(shí)時(shí)間)等。Verilog主要用區(qū)間數(shù)值類表示變化的數(shù)據(jù),它并不直接對(duì)應(yīng)于真實(shí)的硬件。
設(shè)計(jì)中使用較多的區(qū)間類數(shù)據(jù)是整數(shù)(integer)型。采用無符號(hào)基數(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
表示是一個(gè)位寬為4的二進(jìn)制數(shù)10x0,其中從低位數(shù)起的第二位是未知值。
當(dāng)表達(dá)式只有數(shù)字時(shí),意味著采用默認(rèn)的十進(jìn)制表示。這時(shí)在數(shù)字表達(dá)式前可以加一減號(hào),表示是負(fù)數(shù)。
需要指出的是,在Verilog中,整數(shù)表示與邏輯集合表示是相通的。一個(gè)x或者z,可以被用來表示十六進(jìn)制數(shù)中的四位(或者八進(jìn)制的三位,二進(jìn)制的一位)的未知或者高阻狀態(tài)。
其他的實(shí)數(shù)(real)型、字符串?dāng)?shù)值集合等不再介紹。整數(shù)、實(shí)數(shù)、時(shí)間量集合都是變量數(shù)據(jù)類型。
4.參數(shù)類數(shù)據(jù)
VerilogHDL中常見的常數(shù)形式是參數(shù)(parameter)。參數(shù)實(shí)質(zhì)上就是采用parameter格式定義的標(biāo)識(shí)符常數(shù)。這樣定義的參數(shù)在程序正式運(yùn)行前可以被多次指定、改變和推翻,有點(diǎn)類似于VHDL的類屬(generic)。Verilog規(guī)定常數(shù)在程序運(yùn)行中不能再改變它的值。
用paramete定義標(biāo)識(shí)符來表示常數(shù),即參數(shù)型常數(shù),又稱為符號(hào)常數(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)點(diǎn)是通過參數(shù)傳遞,可以改變被引用模塊中已經(jīng)定義的參數(shù)。定義參數(shù)的格式為
#(參數(shù)1,…,參數(shù)n)
模塊生成中用#表示參數(shù)(例如變量寬度),而延遲控制中也用#給出延遲專用參數(shù),注意不要混淆。
例如,在設(shè)計(jì)模塊Decode(A,F)時(shí)定義上升下降延遲參數(shù)為parameterr=1,f=1;,它們就成為該參數(shù)的默認(rèn)值。后面允許將默認(rèn)的參數(shù)值再推翻,比如用Decode#(4,0)D1(A1,F1);實(shí)例生成D1時(shí),此時(shí),參數(shù)值變?yōu)閞=4,f=0。
與參數(shù)定義有關(guān)的關(guān)鍵字還有specparam、defparam。
5.邏輯數(shù)值集合
VerilogHDL設(shè)計(jì)中使用最多的是邏輯數(shù)值集合,但并不被稱作是一種數(shù)據(jù)類型。邏輯值(0,1,x,z)集合是默認(rèn)的,不需要說明。邏輯數(shù)值集合被用來表示線網(wǎng)、變量和參數(shù)的數(shù)值。
Verilog標(biāo)準(zhǔn)中規(guī)定的二進(jìn)制邏輯值集合含有四個(gè)值——1,0,x,z
(也可以是X、Z,此處大小寫一樣)。
邏輯值x表示未知值或者未初始化的未定值,未知的邏輯值可能是1,0,或者是一個(gè)處于變化中的值。邏輯值z(mì)表示一個(gè)高阻值。邏輯值?也是表示z|Z。
布爾量的表示也采用邏輯值的集合:用1表示真,0表示假,x表示真假未定,z則無定義。
6.其他廣義數(shù)據(jù)類型
1)用于數(shù)據(jù)行為特征描述的類
(1)驅(qū)動(dòng)強(qiáng)度類(線網(wǎng)被賦予1或0的強(qiáng)度——strength0、strength1)。
0強(qiáng)度類supply0、strong0、pull0、weak0、highz0。
1強(qiáng)度類supply1、strong1、pull1、weak1、highz1等。
默認(rèn)值為strong0、strong1。
(2)邊沿跳變事件(event)類。
開關(guān)級(jí)是介于邏輯門和晶體管之間的一個(gè)層次,這些強(qiáng)度類數(shù)據(jù)主要用于開關(guān)級(jí)建模,包括:
①邊沿描述。posedge表示正邊沿的01、0x、x1(也可加上z1、0z);negedge表示負(fù)邊沿的10、1x、x0(也可以加上1z、z0)。
②邊沿符號(hào)。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ù)強(qiáng)度衰減)。
CMOS傳輸門類有cmos、rcmos(以下帶r的與上述解釋類似)。
無使能控制的雙向傳輸門類有tran、rtran。
有使能控制的雙向傳輸門類有tranif0、tranif1、rtranif1、rtranif0。
(2)上拉、下拉(即電源、地)類:pullup、pulldown。
上述兩類數(shù)據(jù)類型主要用于開關(guān)級(jí)建模。
(3)基本邏輯門模型。
多(n)個(gè)輸入端的邏輯門類:and、nand、or、nor、xor、nxor。
多(n)個(gè)輸出端的邏輯門類:buf、not。
(4)使能控制同相反相三態(tài)門類:bufif0、bufif1、notif0、notif1。7.2.2表達(dá)式中的操作符
(1)算術(shù)操作符:
+-*/%**
上述六種算術(shù)操作符分別為加(正)、減(負(fù))、乘、除、求余、指數(shù)運(yùn)算,乘法符號(hào)一般被寫作*。
當(dāng)+、-表示正、負(fù)時(shí),為一元運(yùn)算,否則為二元運(yùn)算。
%為對(duì)整型數(shù)求余數(shù)的模運(yùn)算。例如,7%3=1,其結(jié)果的符號(hào)與第一個(gè)操作數(shù)相同。注意要與系統(tǒng)任務(wù)中的%區(qū)別開。
在進(jìn)行算術(shù)運(yùn)算時(shí),如果有一個(gè)操作數(shù)為x,則結(jié)果為x。
(2)布爾邏輯關(guān)系:
&&||!
以上符號(hào)是三種布爾操作符,分別為邏輯與關(guān)系、邏輯或關(guān)系、邏輯非關(guān)系。
與普通的邏輯運(yùn)算規(guī)則相同,其真值表如表7-1所示。
布爾邏輯運(yùn)算中的a、b通常是一個(gè)表達(dá)式。真、假采用邏輯值1、0表示。
對(duì)于矢量的布爾邏輯運(yùn)算規(guī)則是:非零矢量整體作為1處理;如果任何一個(gè)操作數(shù)含有x,則結(jié)果為x表示真假未定。
(3)大小關(guān)系:
><>=<=
上述四種操作符分別為大于、小于、大于或等于、小于或等于。
在大小關(guān)系運(yùn)算時(shí),如果該關(guān)系為真(true),則返回1;如果關(guān)系為假(false),則返回0;如果某個(gè)操作數(shù)的值未定,則該關(guān)系為模糊,返回未定值x。
(4)相等關(guān)系:
==:等于,是一種簡(jiǎn)單的相等比較,它只比較邏輯值中的1、0。相等時(shí)結(jié)果為1,否則為0;如果某操作數(shù)含有邏輯值x或z,則結(jié)果為x。
!=:不等于,與等于相反。
===:全等于,全面的全等比較,比較邏輯值中全部可能的1、0、x、z,當(dāng)完全相等時(shí)結(jié)果為1,否則結(jié)果為0。
!==:不全等于,也是比較全部邏輯值,其規(guī)則與全等于相反。
兩個(gè)等于的差別體現(xiàn)在表7-2的真值表中。
===和!==常用于case表達(dá)式的判別,所以又被稱為“case等式操作符”。
(5)算術(shù)邏輯移位:
<<>><<<>>>
這四種操作符分別代表:操作數(shù)a邏輯左移n位,記作a<<n;a邏輯右移n位,記作a>>n。邏輯移規(guī)定用0填補(bǔ)移出的空位。
例如:
4‘b1001<<1=5’b10010;
a算術(shù)左移n位,記作a<<<n;a算術(shù)右移n位,記作a>>>n。對(duì)于無符號(hào)操作數(shù),用0填補(bǔ)移出的空位;對(duì)于有符號(hào)的操作數(shù)a,則補(bǔ)上a的符號(hào)位值。其中n作為無符號(hào)數(shù)處理,當(dāng)n為未知或高阻時(shí),其結(jié)果為未知。
(6)按位運(yùn)算:
~&|^^~(~^)
上述五種操作符分別為按位取反、按位與、按位或、按位異或、按位異或非運(yùn)算。
按位取反~的情況比較簡(jiǎn)單。例如,一個(gè)操作數(shù)的情況:
rega=b‘1100;
rega=~rega;//取反后rega變?yōu)閎'0011。對(duì)于兩個(gè)操作數(shù)的情況,操作數(shù)各位的取值允許為0、1、x。此時(shí)除了正常的0、1運(yùn)算之外,做了非常簡(jiǎn)單合理的擴(kuò)展延伸,解釋如下:當(dāng)兩個(gè)操作數(shù)的數(shù)據(jù)位數(shù)不同時(shí),則在運(yùn)算前,首先將操作數(shù)右端對(duì)齊,然后將位數(shù)少的操作數(shù)高位填0后以使左邊也對(duì)齊,最后再按位運(yùn)算。
按位與&的約定是:只有兩個(gè)對(duì)應(yīng)位均為1時(shí),輸出為1;兩個(gè)中有一個(gè)為0時(shí),輸出為0;其余情況的輸出為x。
按位或?|?的約定是:只要兩個(gè)對(duì)應(yīng)位中有一個(gè)為1,則輸出為1;兩個(gè)同時(shí)為0時(shí),輸出為0;其余情況的輸出為x。按位異或^的約定是:只有兩個(gè)對(duì)應(yīng)位分別為1、0時(shí),輸出為1;兩個(gè)同時(shí)為0或同時(shí)為1時(shí),輸出為0;其余輸出均為x。
按位異或非^~的約定是:只有兩個(gè)同時(shí)為0或1時(shí),輸出為1;兩個(gè)對(duì)應(yīng)位分別為1、0時(shí),輸出為0;其余輸出均為x。
Verilog可以同時(shí)進(jìn)行多位按位運(yùn)算,所以在設(shè)計(jì)模塊時(shí)可以定義總線級(jí)多位并行運(yùn)算的與門、或門、異或門等。
(7)歸約(reduced):
&|~&~|^~^(^~)
歸約操作符只對(duì)單個(gè)操作數(shù)進(jìn)行自身各位間的與、或、與非、或非、異或、異或非等單一遞推縮減運(yùn)算,最后結(jié)果是一位二進(jìn)制數(shù)。
歸約運(yùn)算的步驟是:先將操作數(shù)的第0位和第1位進(jìn)行與、或、異或等運(yùn)算;中間結(jié)果再與第2位進(jìn)行同樣的運(yùn)算……以此類推,直到變成一位數(shù)為止。例如:
reg[3:0]B;regC;C=&B;
則相當(dāng)于
C=((B[0]&B[1])&B[2])&B[3];
(8)并置:
{}
它把兩個(gè)或多個(gè)線網(wǎng)、變量的若干位拼接起來。例如:
{a,b[3:0],w,3'b101}
(9)條件表達(dá)式:
如圖7-5所示,對(duì)于表中最后的條件選擇表達(dá)式,語法解釋如下:
exp1?expt:expf
其中exp1、expt、expf均為表達(dá)式。上式表示當(dāng)條件exp1為真時(shí)選擇expt。當(dāng)條件exp1為假時(shí)選擇expf。當(dāng)exp1為模糊值x、z時(shí),將表達(dá)式expt、expf分別加以計(jì)算,并按位運(yùn)算,然后根據(jù)下面的規(guī)則給出判斷結(jié)果:對(duì)于結(jié)果的每一位來說,如果兩個(gè)表達(dá)式均為1,則結(jié)果為1;如果兩個(gè)表達(dá)式均為0,則結(jié)果為0;否則,結(jié)果為x。
由條件選擇組成的條件賦值,例如out=enab?a:b可用于持續(xù)賦值和一般行為賦值。圖7-5條件表達(dá)式
(10)優(yōu)先等級(jí):
Verilog操作符約定的運(yùn)算順序與VHDL相似,優(yōu)先等級(jí)如表7-3所示。其中用豎杠與箭頭相連表示屬于同一個(gè)優(yōu)先級(jí);并置運(yùn)算的優(yōu)先級(jí)應(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
上述每個(gè)門有多個(gè)輸入端(每一種都可以有2~n個(gè)),但惟一的一個(gè)輸出端放在第一個(gè)端位置。
(2)多輸出單輸入門(出1,出2,…,出k,入):
buf,not
上述每個(gè)門可以有多個(gè)輸出端,但一個(gè)輸入端放在最后一個(gè)端位置。
(3)三態(tài)門(單入多出):
bufif0,bufif1,notif0,notif1
(4)上拉、下拉(即接地、接電源,可多點(diǎn)):
pullup,pulldown
(5)?MOS開關(guān)(即通路晶體管和傳輸門):
nmos,pmos,rnmos,rpmos,cmos,rcmos
(6)雙向開關(guān)(雙向傳輸門):
tran,tranif0,tranif1,rtran,rtranif0,rtranif1
在設(shè)計(jì)模塊時(shí)可以使用它們,同時(shí)可以顯式定義邏輯值強(qiáng)度和門延遲,如圖7-6所示。例如:圖7-6模塊Primit設(shè)計(jì)前面兩個(gè)門用的是強(qiáng)0、強(qiáng)1,門延遲為2.2ns。第三個(gè)門Nand_3沒有顯式聲明,用的是默認(rèn)驅(qū)動(dòng)強(qiáng)度值——也是強(qiáng)0、強(qiáng)1,但門延遲為0。
上拉電阻舉例:
pulluppup(pwr);
這里單端上拉器件的實(shí)例名為pup,它將惟一的實(shí)例輸出端pwr置為高電平。在pup之前還可以給出強(qiáng)度,后面還可以同時(shí)列出多個(gè)上拉器件。7.3.2用戶定義基元——UDP
UDP是一種由用戶自己定義的庫(kù)基元(User-DefinedPrimitives)。它也是源文件的一種,是用戶根據(jù)自己的需要而建立的基本邏輯門模型,具體格式參見附錄2中的udp_declaration。在udp_port_list中的第一個(gè)為惟一的標(biāo)量輸出端。它不能是矢量型vertor數(shù)據(jù),不能是inout模式。在body部分,有組合電路和時(shí)序邏輯兩類體格式,但都是采用Verilog約定的真值表格式定義和解釋。輸入端可以是多個(gè)(編寫非UDP的正常模塊時(shí)不受上述限制)。
下面以設(shè)計(jì)半加器本級(jí)和的用戶定義基元Adder為例,介紹比較簡(jiǎn)單的組合電路UDP設(shè)計(jì)。至于半加器的另一個(gè)本級(jí)進(jìn)位
Carry,也可以如法炮制。注意,在定義UDP輸出時(shí),可以采用0、1、x,但不允許采用z,如果輸入端中出現(xiàn)z,則作為x處理。
除了組合電路UDP之外,還有時(shí)序邏輯UDP。下面給出的例子是時(shí)序邏輯(sequential_body)UDP設(shè)計(jì)。UDP的調(diào)用步驟與內(nèi)建基元的調(diào)用句法相同。在調(diào)用這兩種基元時(shí),可以有實(shí)元名稱,也可以沒有實(shí)元名稱。
時(shí)序電路中又分電平有效(鎖存器)和邊沿有效(觸發(fā)器)兩種。定義時(shí)序電路也是用列表形式完成,只是表內(nèi)的格式有所區(qū)別。這里舉一個(gè)正邊沿觸發(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è)計(jì)。
設(shè)計(jì)時(shí)可以用#來指定線網(wǎng)的線延遲,例如:
wire#(1.1:1.3:1.7)a_delay;
這句程序給出線網(wǎng)a_delay被驅(qū)動(dòng)源驅(qū)動(dòng)時(shí)的線延遲,括號(hào)內(nèi)的三個(gè)值分別表示線延遲參數(shù)中的最小延遲、典型延遲、最大延遲。
#(1.1:1.3:1.7)assignq=a;
表示的是驅(qū)動(dòng)源賦值階段的延遲。但是,下述是一種容易誤解的寫法:
wire#(1.1:1.3:1.7)a_delay=a;
在這種情況下,凡有驅(qū)動(dòng)器出現(xiàn)的是指驅(qū)動(dòng)源a的賦值延遲而不是a_delay的線延遲。
總之,驅(qū)動(dòng)源的賦值延遲加上線延遲才是線網(wǎng)的實(shí)際驅(qū)動(dòng)階段總延遲。
2.門延遲(同樣適用于UDP的延遲)
表示門延遲的方式與表示線網(wǎng)線延遲的方式是一樣的。這里表示的延遲類別有三種:#(Pd,Nd,Zd),它們是上升延遲(Pd)、下降延遲(Nd)、浮空(即Turnoff;又稱Float)延遲(Zd)。有些門,例如與非門等,只有前兩種延遲。對(duì)其中某一種延遲,還可以用#(a1:a2:a3)分別表示其最小值、典型值、最大值。如果這時(shí)只有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);
/*上升、下降兩種,每種各三個(gè)可能取值。這里的最小,典型,最大值算是一套值*/
3.引腳延遲
規(guī)定(Specify)塊是Verilog延遲表征的重要組成部分。在Specify塊中,可以進(jìn)行延遲參數(shù)聲明、模塊的路徑延遲聲明和系統(tǒng)時(shí)序校驗(yàn)。在編寫Specify塊時(shí),一般首先用specparam定義延遲參數(shù),再定義路徑及其延遲。一般黑體字,包括這里的specparam是Verilog的保留字,凡由specparam開頭的語句就是專門用來定義延遲參數(shù)的語句。
在Specify塊(specify…endspecify)中,可以規(guī)定模塊內(nèi)不同引腳間(Pin-to-Pin)的路徑延遲,符號(hào)為*>以及=>。
x*>y表示所謂的全路徑,則x的每一位與后面的y都有路徑相通。全路徑類似于時(shí)鐘一類的全局信號(hào)線,從一個(gè)輸入端到所有的輸出端都有線連接路徑,它們之間的路徑延遲均需計(jì)算。
例如:
specify
(a,b*>c,d)=10;
endspecify
表示a到c、d的延遲為10,b到c、d的延遲也為10。
x=>y表示所謂的并行路徑,要求x、y的位數(shù)相等。并行路徑類似于并行總線,是指前面引腳和后面引腳是成對(duì)出現(xiàn)的,相當(dāng)于計(jì)算從并行輸入端到并行輸出端的路徑延遲。
注意,Verilog中默認(rèn)的延遲模型也是慣性延遲。所謂“上升”延遲是指輸出端的上升邊,對(duì)其他有關(guān)下降等含義的解釋與此類似。
7.4數(shù)據(jù)流風(fēng)格描述
Verilog的一種常用手法是數(shù)據(jù)流風(fēng)格。從形式上看它也是一種對(duì)電路行為的描述,但實(shí)質(zhì)上它對(duì)應(yīng)于RTL一級(jí)的結(jié)構(gòu)模型,是一種容易被綜合的準(zhǔn)結(jié)構(gòu)類表征。數(shù)據(jù)流風(fēng)格常用于描述數(shù)據(jù)通路中簡(jiǎn)單組合元件的邏輯電路設(shè)計(jì)。它采用行為過程外的獨(dú)立持續(xù)賦值語句,即assign語句描述。驅(qū)動(dòng)強(qiáng)度和延遲值信息也被嵌套在持續(xù)賦值語句之中。
持續(xù)賦值(continuous_assign)語句類似于VHDL中的并發(fā)信號(hào)賦值,其格式為
assign[驅(qū)動(dòng)強(qiáng)度][#延遲值]線網(wǎng)標(biāo)識(shí)符=表達(dá)式{,線網(wǎng)標(biāo)識(shí)符=表達(dá)式};它所表達(dá)的動(dòng)作是:在行為風(fēng)格的構(gòu)件(過程)之外采用assign語句對(duì)一個(gè)或多個(gè)線網(wǎng)持續(xù)賦值。它與門基元類似,只能對(duì)線網(wǎng)類數(shù)據(jù)進(jìn)行賦值。線網(wǎng)結(jié)構(gòu)非常重要,它對(duì)應(yīng)的就是物理互連線。由于線網(wǎng)是默認(rèn)的,所以實(shí)現(xiàn)連接比較方便。在電路仿真中,一旦表達(dá)式中的一個(gè)值發(fā)生變化,就要重新計(jì)算表達(dá)式,并將結(jié)果賦給被驅(qū)動(dòng)的標(biāo)識(shí)符。
它沒有保持的概念,需要不停地持續(xù)賦值才行。它完全類似于實(shí)際硬件中的一個(gè)邏輯門驅(qū)動(dòng)一條實(shí)際互連線的真實(shí)情況?!俺掷m(xù)”的含義可以理解為右邊的“風(fēng)吹草動(dòng)”直接聯(lián)動(dòng)到左邊。例如:
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。但需要提醒的是,對(duì)于賦值語句右端的數(shù)據(jù)類型則沒有太多的限制。此外,一個(gè)模塊中數(shù)據(jù)流還允許和其他風(fēng)格混合編寫。
7.5行為風(fēng)格描述
Verilog中行為風(fēng)格的概念與VHDL相類似,但是許多地方比較簡(jiǎn)化,設(shè)計(jì)師用其來描述那些比較復(fù)雜的組合電路和時(shí)序邏輯。下面首先介紹構(gòu)件、塊、賦值、時(shí)序、程控的概念要點(diǎn)。
直接采用initial和always兩種構(gòu)件(Construct,見附錄2IEEE-1364標(biāo)準(zhǔn)句法匯總中的行為語句部分)進(jìn)行設(shè)計(jì)。構(gòu)件,又稱過程,主要由時(shí)序控制、程序控制語句和賦值語句組成。
?Verilog中的task、function的定義(聲明)是兩種比構(gòu)件低一級(jí)的公用子程序,它們定義的格式與構(gòu)件類似。在兩類子程序調(diào)用中,任務(wù)調(diào)用是一種專門的語句,而函數(shù)調(diào)用則是一個(gè)表達(dá)式。
Verilog的構(gòu)件中可以有begin_end格式的串行塊,也可以有fork_join格式的并行塊。
賦值語句,就是將由操作符加操作數(shù)組成表達(dá)式的值賦給賦值符號(hào)左邊的線網(wǎng)和變量。行為構(gòu)件過程中的賦值語句類別有兩種:一般行為賦值和(行為)過程內(nèi)持續(xù)賦值。在構(gòu)件的initial和always構(gòu)件內(nèi)的一般賦值稱為行為賦值(或稱過程內(nèi)一般賦值),其符號(hào)左邊必須是寄存器一類的變量類型,但是它仍然適用于描述比較復(fù)雜的組合邏輯;而過程內(nèi)持續(xù)賦值則是在構(gòu)件內(nèi)的強(qiáng)制性準(zhǔn)持續(xù)賦值。
一般的行為賦值也分為兩種:阻塞(Blocking)和非阻塞(Non-blocking)賦值。
無疑,構(gòu)件中需要延遲和事件等時(shí)序控制,此外,也需要分支、循環(huán)、等待、禁止等程序控制,這就是Verilog的程序控制語句。
在Verilog的兩種構(gòu)件、兩種子程序、兩種塊結(jié)構(gòu)框架下,根據(jù)要求將時(shí)序控制前綴、賦值語句和程序控制語句相組合去處理各種數(shù)據(jù),就可以構(gòu)建出異彩紛呈的行為描述,下面分別加以介紹。7.5.1構(gòu)件過程、子程序與塊語句
1.初始化(initial)構(gòu)件過程
initial構(gòu)件在整個(gè)仿真期間只被執(zhí)行一次。一個(gè)模塊中使用initial構(gòu)件的次數(shù)不受限制,所出現(xiàn)的位置也沒有約定和限制。實(shí)際上,在真正做邏輯綜合時(shí),所有initial構(gòu)件都將被忽略。
初始化構(gòu)件過程的格式為
initial一般語句
上面格式中的一般語句(Statement)可以是賦值語句、帶有過程內(nèi)時(shí)序控制前綴的一般語句、程序控制語句(含if、case、loop、wait、disable等語句)、事件創(chuàng)建語句、塊(含串行、并行塊)語句、任務(wù)調(diào)用(或者系統(tǒng)任務(wù)調(diào)用)語句等。這些一般語句基本上都是允許嵌套的。
initial通常用來完成初始化。例如初始化寄存器和存儲(chǔ)器:
initial
begin
areg=0;
for(index=0;index<size;index=index+1)
memory[index]=0;
end
注意,initial也可以用于程序的結(jié)束,因?yàn)樗彩且淮涡缘摹?/p>
2.總是(always)構(gòu)件過程
always構(gòu)件可以理解成一個(gè)“while(true)”循環(huán)執(zhí)行機(jī)制。它常用于描述時(shí)序邏輯電路。需要強(qiáng)調(diào)的是,兩個(gè)或更多的always構(gòu)件間是并發(fā)執(zhí)行的。always構(gòu)件不斷反復(fù)循環(huán)被執(zhí)行,直到仿真結(jié)束。一個(gè)模塊中使用always構(gòu)件的次數(shù)不受限制。
always構(gòu)件的格式為
always一般語句
與initial構(gòu)件一樣,這里的一般語句也可以是賦值語句、帶有過程內(nèi)時(shí)序控制前綴的一般語句、程序控制語句(含if、case、loop、wait、disable等語句)、事件創(chuàng)建語句、塊(含串行、并行塊)語句、任務(wù)調(diào)用語句、系統(tǒng)任務(wù)調(diào)用語句等。例如產(chǎn)生時(shí)鐘變量和不斷計(jì)數(shù):
(1)?always#20areg=~areg;
//#20是指20個(gè)時(shí)間單位
(2)?always@(posedgeareg)
//@表示當(dāng)…事件
begin
count=count+1;
end
(3)?always#5cun=(cun!=25)?(cun+1):5;需要提醒的是:由于多個(gè)always構(gòu)件間是并發(fā)的,一定要將賦值延遲設(shè)計(jì)恰當(dāng)。要與賦值的先后順序配合好,以防止出現(xiàn)不希望的數(shù)據(jù)滑動(dòng)。
為了能夠有效地綜合,應(yīng)事先確認(rèn)always中所描述的狀態(tài)機(jī)是由惟一的時(shí)鐘所觸發(fā)。
always構(gòu)件中可以同時(shí)包含串行塊begin_end和并行塊fork_join。
3.任務(wù)(task)子程序及調(diào)用
task和function都是一種公用的子程序定義性描述,任務(wù)和函數(shù)只能在模塊項(xiàng)聲明中定義,然后可以在initial或always構(gòu)件中多次被調(diào)用。利用任務(wù)和函數(shù)完成大程序的化簡(jiǎn)和層次分解。
任務(wù)可以啟動(dòng)其他任務(wù)和函數(shù);任務(wù)可以包含時(shí)序控制;任務(wù)可以定義自己的仿真時(shí)間單位;任務(wù)可以有多個(gè)任何類型的輸入量(或者沒有輸入量);任務(wù)返回值通過輸出端口給出,如下面例子所示;任務(wù)可以返回,也可以不返回輸出值。任務(wù)定義的格式為
task
任務(wù)名;//無端口列表
輸入輸出端口聲明
數(shù)據(jù)類型聲明
一般語句
endtask
任務(wù)定義中的一般語句可以嵌入在串行塊和并行塊結(jié)構(gòu)中,允許展開成多個(gè)一般語句。
任務(wù)調(diào)用(enable)可以在always和initial構(gòu)件中使用,它的格式為
任務(wù)名[(表達(dá)式1,表達(dá)式2,…,表達(dá)式n)];下面給出任務(wù)設(shè)計(jì)及應(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í)參數(shù)的順序必須與定義時(shí)相一致
…
endmodule
4.函數(shù)(function)子程序及調(diào)用
函數(shù)至少有一個(gè)輸入?yún)⒘恐?;函?shù)也必須而且只能返回一個(gè)輸出函數(shù)值;定義函數(shù)時(shí)必須至少用一條賦值語句為函數(shù)輸出寄存器賦結(jié)果值;函數(shù)不能包含時(shí)序控制;函數(shù)只能和主程序共用一個(gè)仿真時(shí)間單位;函數(shù)無法啟動(dòng)任務(wù)。在原程序中被調(diào)用的函數(shù)起到表達(dá)式的作用。函數(shù)常用來對(duì)組合邏輯建模。函數(shù)定義的格式為
function[返回輸出值的類型和范圍]函數(shù)名;
輸入端口聲明
數(shù)據(jù)類型聲明
一般語句
endfunction
函數(shù)定義中的一般語句可以嵌入在串行塊和并行塊結(jié)構(gòu)中,允許展開成多個(gè)一般語句。注意,函數(shù)定義中不能出現(xiàn)時(shí)序控制,即延遲#、事件@等標(biāo)識(shí)符,也不能包括wait語句。
格式中的[返回輸出值的類型和范圍],給出對(duì)以(函數(shù)名)命名的輸出寄存器的聲明;如果返回值聲明默認(rèn),則默認(rèn)該函數(shù)為一位數(shù)寄存器。
函數(shù)調(diào)用(call)是一個(gè)表達(dá)式,它的格式為
函數(shù)名(輸入表達(dá)式1,輸入表達(dá)式2,…,輸入表達(dá)式n);函數(shù)設(shè)計(jì)及應(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ù)時(shí)順序必須與定義時(shí)相一致
…
endmodule
5.串行塊(seq_block)語句
在行為描述的構(gòu)件中主要有兩種塊語句:串行塊(seq_block)語句和并行塊(par_block)語句。塊內(nèi)由許多語句構(gòu)成一個(gè)總的統(tǒng)一塊語句。
在串行塊內(nèi)的begin和end(起始和結(jié)束)之間的語句按順序執(zhí)行,每條語句的延遲時(shí)間是相對(duì)于前一條語句的仿真時(shí)間而言的。整個(gè)塊的最初起始時(shí)間是塊內(nèi)第一個(gè)語句開始被執(zhí)行的時(shí)間;整個(gè)塊的最后結(jié)束時(shí)間是塊內(nèi)最后一條語句執(zhí)行結(jié)束的時(shí)間。串行塊語句的格式為
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)件中;串行塊可以嵌套。串行塊中的延遲采用的是相對(duì)延遲。
6.并行塊(par_block)語句
在并行塊fork_join(分叉和匯合)內(nèi)的語句同時(shí)開始、并行執(zhí)行,每條語句的延遲量是相對(duì)于程序進(jìn)入到塊內(nèi)的仿真時(shí)間而言,相互間是獨(dú)立的。當(dāng)執(zhí)行完按絕對(duì)仿真時(shí)間排在最后的語句(不一定是寫在最后的語句)之后,或者程序執(zhí)行了一條禁止disable語句之后,程序就從塊語句跳出。整個(gè)塊的最初起始時(shí)間對(duì)于塊內(nèi)的所有語句都是相同的,即程序流進(jìn)入該塊的時(shí)間;塊結(jié)束時(shí)間是塊內(nèi)按絕對(duì)仿真時(shí)間排在最后的一條語句執(zhí)行結(jié)束的時(shí)間。只有該塊結(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)的延遲采用的是絕對(duì)延遲。
串行塊中可以嵌套并行塊,并行塊中可以嵌套串行塊。在設(shè)計(jì)ASIC時(shí),要慎用fork_join語句,因?yàn)殡y于硬件實(shí)現(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)格中的一般賦值語句,只能實(shí)現(xiàn)對(duì)reg類型變量數(shù)據(jù)的賦值。
=、<=分別為阻塞和非阻塞賦值符號(hào)(注意,不要將非阻塞賦值符號(hào)<=與小于等于符號(hào)<=混淆)。
1)阻塞式(Blocking)賦值
這是一種立即賦值,可以理解為排他性賦值。例如,a=b;使得a立即獲得值b。位于賦值關(guān)系式右側(cè)(RHS)的值或任何表達(dá)式按照定時(shí)要求更新位于左側(cè)(LHS)的寄存器或存儲(chǔ)器的值,并且保持該值直到另一個(gè)賦值語句啟動(dòng)。
例如:
always@(c)y=a;賦值語句當(dāng)事件c出現(xiàn)時(shí)立即改變y(reg)的值,并將保持下去,其默認(rèn)初始值為x。此時(shí),允許把wire上的值賦給reg。
又如:
begin
a=#2b;
c=#3a;
end
2)非阻塞式(Non-blocking)賦值
類似VHDL的信號(hào)賦值,它只對(duì)寄存器類型變量賦值,是在構(gòu)件過程結(jié)束后的統(tǒng)一時(shí)刻才真正賦值。這類非阻塞賦值語句將根據(jù)構(gòu)件規(guī)定的時(shí)序控制條件,同步同時(shí)并發(fā)地執(zhí)行。例如,某一模塊中有一個(gè)always@(c)a<=b;語句,則a不能立即獲得值b。需要和其他同類語句一起,等到條件c為真時(shí)同時(shí)賦值。大型數(shù)字系統(tǒng)行為中所有的記憶單元一般都是由相同時(shí)鐘邊沿同步并發(fā)控制地變化,非阻塞賦值就是與這種實(shí)際情況相對(duì)應(yīng)。
非阻塞賦值中的延遲是絕對(duì)延遲,從某一時(shí)刻起始統(tǒng)一計(jì)時(shí)。除了并行塊和非阻塞賦值外,其他均取相對(duì)延遲,即一句與一句之間的相對(duì)延遲值。構(gòu)件中的非阻塞賦值間是并發(fā)的,句法沒有規(guī)定它們的順序。如同VHDL一樣,語法規(guī)定賦值符號(hào)右邊表達(dá)式中要代入變量的原值。例如,下面表達(dá)式中的變量a。
begin
a<=#2b;
c<=#3a;
end
2.持續(xù)賦值語句
Verilog中過程內(nèi)持續(xù)賦值語句(ProceduralContinuousAssignment)是在構(gòu)件內(nèi)采用assign-deassign或force-release形式的強(qiáng)制性賦值語句。它們具有持續(xù)賦值的特征,也被稱為準(zhǔn)持續(xù)賦值。不過,這里給出的賦值只在一段時(shí)間內(nèi)有效。assign-deassign只對(duì)reg賦值,force-release可以對(duì)reg或net賦值。描述一個(gè)帶異步置位和異步復(fù)位端的D觸發(fā)器電路,可以加入assign-deassign。舉例:
…
always@(reset_orset_)//低電平有效
if(!reset_)assignq=0;
elseif(!set_)assignq=1;
else
deassignq;
/*上邊的deassign解賦值語句,使得強(qiáng)制賦值方式取消。寄存器q可以再賦它值,例如接著執(zhí)行下述賦值語句*/
always@(posedgeclock)q=d; … 在過程內(nèi)持續(xù)賦值句法中,assign-deassign對(duì)應(yīng)于一些異步操作。有學(xué)者認(rèn)為其風(fēng)格怪異,主張盡量少用。
與上述assign-deassign形式對(duì)稱的還有force-release形式。兩種形式的共同點(diǎn)是:右端表達(dá)式中操作數(shù)的任何變化都會(huì)導(dǎo)致強(qiáng)制執(zhí)行賦值語句,這正是準(zhǔn)持續(xù)的含義。它們的不同點(diǎn)是:assign-deassign用于寄存器reg賦值;而force-release除了可以對(duì)reg賦值外,還可以用于行為描述中對(duì)線網(wǎng)net賦值。force-release主要用于仿真調(diào)試。7.5.3過程內(nèi)語句中的時(shí)序控制
VerilogHDL過程內(nèi)語句(procedural_timing_control_statement)擁有時(shí)序控制的前綴。這樣,用時(shí)序控制來給出仿真器時(shí)間的推進(jìn)方式,在仿真中對(duì)發(fā)生時(shí)刻(用前綴符號(hào)#來表征)和事件次序(用前綴符號(hào)@來表征)實(shí)施控制。
時(shí)序控制分為門級(jí)時(shí)序模型和行為時(shí)序模型兩種。數(shù)據(jù)流和結(jié)構(gòu)對(duì)應(yīng)門級(jí)時(shí)序;行為風(fēng)格對(duì)應(yīng)行為時(shí)序。與7.3.3節(jié)中介紹過的門級(jí)時(shí)序模型相類似,這里的行為時(shí)序控制除了延遲控制之外,還有事件控制。一般設(shè)計(jì)中,可以讓延遲控制和事件控制共同起時(shí)序控制作用。
1)延遲控制
延遲控制采用符號(hào)#,少了上升、下降、高阻的區(qū)別。其格式有兩種:
#
延遲值
#
(最小延遲:典型延遲:最大延遲)
#6表示有6個(gè)時(shí)間單位延遲,其在語句中共有兩種寫法。舉例:
(1)?x=#3y;//它等價(jià)于下列內(nèi)插延遲
begin
hold=y;
#3;
x=hold;
end
(2)?#3x=y;//它等價(jià)于
begin
#3;
x=y;
end
Verilog的數(shù)據(jù)流和結(jié)構(gòu)風(fēng)格中,對(duì)于門延遲也是采用延遲控制描述。
2)事件控制
事件(Event)的含義與VHDL相似,主要指任何值的變化,即邊沿跳變,用得較多的有posedge表示正邊沿;negedge表示負(fù)邊沿。正邊沿描述有01、0x、x1三種;負(fù)邊沿描述有10、1x、x0三種(z也參與變化,但一般不考慮z)。
事件名就是事件標(biāo)識(shí)符,它是對(duì)事件進(jìn)行的專門標(biāo)識(shí)。例如變量ae可以產(chǎn)生值的變化,就可以將ae單獨(dú)命名為事件名,以表示“它的值發(fā)生了變化”這件事。用event聲明來定義具體的事件名,形如:
eventae;
事件控制的格式為
@事件名或
@(事件表達(dá)式)
或
@(事件表達(dá)式or
事件表達(dá)式)
事件表達(dá)式可以寫成單個(gè)或兩個(gè)操作數(shù)之間的運(yùn)算。操作數(shù)可以是具體的數(shù)、標(biāo)識(shí)符或者表達(dá)式。例如,表示一直要等到事件ae發(fā)生這一條件的到來:
@ae注意下面二者的區(qū)別:
@事件名;一般語句
/*上面等價(jià)于兩句,如果出現(xiàn)在begin_end塊中在句法上就是對(duì)的。是要等待事件發(fā)生后執(zhí)行一個(gè)空語句,一般語句才執(zhí)行*/
@事件名一般語句//是指當(dāng)事件出現(xiàn)時(shí)刻,就執(zhí)行一般語句
#延遲量
->事件名;
上式表示在左邊的延遲條件下,將創(chuàng)建右邊的事件。形如:
#5->ae;這時(shí)從功能上它可以等效于:
#5
begin
ae=0;
#0a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度高性能混凝土材料承包協(xié)議3篇
- 2024版物流運(yùn)輸購(gòu)銷合同范本
- 2025年新員工試用期間勞動(dòng)合同范本3篇
- 主體墻面刷漆施工專項(xiàng)合同版B版
- 2025年度貨運(yùn)司機(jī)安全責(zé)任合同3篇
- 二零二五年度二手商品攤位租賃與交易平臺(tái)合作協(xié)議3篇
- 二零二五年餐廳員工加班及休息時(shí)間合同范本3篇
- 2024聘用培訓(xùn)講師合作協(xié)議書包含師資評(píng)估體系3篇
- 2024茶葉行業(yè)市場(chǎng)開拓與推廣合同
- 2024的證券居間合同
- 《國(guó)有控股上市公司高管薪酬的管控研究》
- 餐飲業(yè)環(huán)境保護(hù)管理方案
- 人教版【初中數(shù)學(xué)】知識(shí)點(diǎn)總結(jié)-全面+九年級(jí)上冊(cè)數(shù)學(xué)全冊(cè)教案
- 食品安全分享
- 礦山機(jī)械設(shè)備安全管理制度
- 計(jì)算機(jī)等級(jí)考試二級(jí)WPS Office高級(jí)應(yīng)用與設(shè)計(jì)試題及答案指導(dǎo)(2025年)
- 造價(jià)框架協(xié)議合同范例
- 糖尿病肢端壞疽
- 心衰患者的個(gè)案護(hù)理
- 醫(yī)護(hù)人員禮儀培訓(xùn)
- 無人機(jī)飛行安全協(xié)議書
評(píng)論
0/150
提交評(píng)論