版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
VerilogHDL簡(jiǎn)明教程(中文版)VerilogHDL是一種硬件描述語(yǔ)言,用于從算法級(jí)、門級(jí)到開關(guān)級(jí)的多種抽象設(shè)計(jì)層次的數(shù)字系統(tǒng)建模。被建模的數(shù)字系統(tǒng)對(duì)象的復(fù)雜性可以介于簡(jiǎn)單的門和完整的電子數(shù)字系統(tǒng)之間。數(shù)字系統(tǒng)能夠按層次描述,并可在相同描述中顯式地進(jìn)行時(shí)序建模。VerilogHDL語(yǔ)言具有下述描述能力:設(shè)計(jì)的行為特性、設(shè)計(jì)的數(shù)據(jù)流特性、設(shè)計(jì)的結(jié)構(gòu)組成以及包含響應(yīng)監(jiān)控和設(shè)計(jì)驗(yàn)證方面的時(shí)延和波形產(chǎn)生機(jī)制。所有這些都使用同一種建模語(yǔ)言。此外,VerilogHDL語(yǔ)言提供了編程語(yǔ)言接口,通過(guò)該接口可以在模擬、驗(yàn)證期間從設(shè)計(jì)外部訪問(wèn)設(shè)計(jì),包括模擬的具體控制和運(yùn)行。VerilogHDL語(yǔ)言不僅定義了語(yǔ)法,而且對(duì)每個(gè)語(yǔ)法結(jié)構(gòu)都定義了清晰的模擬、仿真語(yǔ)義。因此,用這種語(yǔ)言編寫的模型能夠使用Verilog仿真器進(jìn)行驗(yàn)證。語(yǔ)言從C編程語(yǔ)言中繼承了多種操作符和結(jié)構(gòu)。VerilogHDL提供了擴(kuò)展的建模能力,其中許多擴(kuò)展最初很難理解。但是,VerilogHDL語(yǔ)言的核心子集非常易于學(xué)習(xí)和使用,這對(duì)大多數(shù)建模應(yīng)用來(lái)說(shuō)已經(jīng)足夠。當(dāng)然,完整的硬件描述語(yǔ)言足以對(duì)從最復(fù)雜的芯片到完整的電子系統(tǒng)進(jìn)行描述。VerilogHDL是一種硬件描述語(yǔ)言,用于從算法級(jí)、門級(jí)到開關(guān)級(jí)的多種抽象設(shè)計(jì)層次的數(shù)字系統(tǒng)建模。被建模的數(shù)字系統(tǒng)對(duì)象的復(fù)雜性可以介于簡(jiǎn)單的門和完整的電子數(shù)字系統(tǒng)之間。數(shù)字系統(tǒng)能夠按層次描述,并可在相同描述中顯式地進(jìn)行時(shí)序建模。VerilogHDL語(yǔ)言具有下述描述能力:設(shè)計(jì)的行為特性、設(shè)計(jì)的數(shù)據(jù)流特性、設(shè)計(jì)的結(jié)構(gòu)組成以及包含響應(yīng)監(jiān)控和設(shè)計(jì)驗(yàn)證方面的時(shí)延和波形產(chǎn)生機(jī)制。所有這些都使用同一種建模語(yǔ)言。此外,VerilogHDL語(yǔ)言提供了編程語(yǔ)言接口,通過(guò)該接口可以在模擬、驗(yàn)證期間從設(shè)計(jì)外部訪問(wèn)設(shè)計(jì),包括模擬的具體控制和運(yùn)行。VerilogHDL語(yǔ)言不僅定義了語(yǔ)法,而且對(duì)每個(gè)語(yǔ)法結(jié)構(gòu)都定義了清晰的模擬、仿真語(yǔ)義。因此,用這種語(yǔ)言編寫的模型能夠使用Verilog仿真器進(jìn)行驗(yàn)證。語(yǔ)言從C編程語(yǔ)言中繼承了多種操作符和結(jié)構(gòu)。VerilogHDL提供了擴(kuò)展的建模能力,其中許多擴(kuò)展最初很難理解。但是,VerilogHDL語(yǔ)言的核心子集非常易于學(xué)習(xí)和使用,這對(duì)大多數(shù)建模應(yīng)用來(lái)說(shuō)已經(jīng)足夠。當(dāng)然,完整的硬件描述語(yǔ)言足以對(duì)從最復(fù)雜的芯片到完整的電子系統(tǒng)進(jìn)行描述。歷史VerilogHDL語(yǔ)言最初是于1983年由GatewayDesignAutomation公司為其模擬器產(chǎn)品開發(fā)的硬件建模語(yǔ)言。那時(shí)它只是一種專用語(yǔ)言。由于他們的模擬、仿真器產(chǎn)品的廣泛使用,VerilogHDL作為一種便于使用且實(shí)用的語(yǔ)言逐漸為眾多設(shè)計(jì)者所接受。在一次努力增加語(yǔ)言普及性的活動(dòng)中,VerilogHDL語(yǔ)言于1990年被推向公眾領(lǐng)域。OpenVerilogInternational(OVI)是促進(jìn)Verilog發(fā)展的國(guó)際性組織。1992年,OVI決定致力于推廣VerilogOVI標(biāo)準(zhǔn)成為IEEE標(biāo)準(zhǔn)。這一努力最后獲得成功V,erilog語(yǔ)言于1995年成為IEEE標(biāo)準(zhǔn),稱為IEEEStd1364-1995。完整的標(biāo)準(zhǔn)在Verilog硬件描述語(yǔ)言參考手冊(cè)中有詳細(xì)描述。主要能力下面列出的是Verilog硬件描述語(yǔ)言的主要能力:*基本邏輯門,例如and、or和nand等都內(nèi)置在語(yǔ)言中。*用戶定義原語(yǔ)(UDP)創(chuàng)建的靈活性。用戶定義的原語(yǔ)既可以是組合邏輯原語(yǔ),也可以是時(shí)序邏輯原語(yǔ)。*開關(guān)級(jí)基本結(jié)構(gòu)模型,例如pmos和nmos等也被內(nèi)置在語(yǔ)言中。*提供顯式語(yǔ)言結(jié)構(gòu)指定設(shè)計(jì)中的端口到端口的時(shí)延及路徑時(shí)延和設(shè)計(jì)的時(shí)序檢查。*可采用三種不同方式或混合方式對(duì)設(shè)計(jì)建模。這些方式包括:行為描述方式—使用過(guò)程化結(jié)構(gòu)建模;數(shù)據(jù)流方式—使用連續(xù)賦值語(yǔ)句方式建模;結(jié)構(gòu)化方式—使用門和模塊實(shí)例語(yǔ)句描述建模。*VerilogHDL中有兩類數(shù)據(jù)類型:線網(wǎng)數(shù)據(jù)類型和寄存器數(shù)據(jù)類型。線網(wǎng)類型表示構(gòu)件間的物理連線,而寄存器類型表示抽象的數(shù)據(jù)存儲(chǔ)元件。*能夠描述層次設(shè)計(jì),可使用模塊實(shí)例結(jié)構(gòu)描述任何層次。*設(shè)計(jì)的規(guī)模可以是任意的;語(yǔ)言不對(duì)設(shè)計(jì)的規(guī)模(大?。┦┘尤魏蜗拗啤?VerilogHDL不再是某些公司的專有語(yǔ)言而是IEEE標(biāo)準(zhǔn)。*人和機(jī)器都可閱讀Verilog語(yǔ)言,因此它可作為EDA的工具和設(shè)計(jì)者之間的交互語(yǔ)言。*VerilogHDL語(yǔ)言的描述能力能夠通過(guò)使用編程語(yǔ)言接口(PLI)機(jī)制進(jìn)一步擴(kuò)展。PLI是允許外部函數(shù)訪問(wèn)Verilog模塊內(nèi)信息、允許設(shè)計(jì)者與模擬器交互的例程集合。*設(shè)計(jì)能夠在多個(gè)層次上加以描述,從開關(guān)級(jí)、門級(jí)、寄存器傳送級(jí)(RTL)到算法級(jí),包括進(jìn)程和隊(duì)列級(jí)。*能夠使用內(nèi)置開關(guān)級(jí)原語(yǔ)在開關(guān)級(jí)對(duì)設(shè)計(jì)完整建模。*同一語(yǔ)言可用于生成模擬激勵(lì)和指定測(cè)試的驗(yàn)證約束條件,例如輸入值的指定。*VerilogHDL能夠監(jiān)控模擬驗(yàn)證的執(zhí)行,即模擬驗(yàn)證執(zhí)行過(guò)程中設(shè)計(jì)的值能夠被監(jiān)控和顯示。這些值也能夠用于與期望值比較,在不匹配的情況下,打印報(bào)告消息。*在行為級(jí)描述中,VerilogHDL不僅能夠在RTL級(jí)上進(jìn)行設(shè)計(jì)描述,而且能夠在體系結(jié)構(gòu)級(jí)描述及其算法級(jí)行為上進(jìn)行設(shè)計(jì)描述。*能夠使用門和模塊實(shí)例化語(yǔ)句在結(jié)構(gòu)級(jí)進(jìn)行結(jié)構(gòu)描述。*VerilogHDL的混合方式建模能力,即在一個(gè)設(shè)計(jì)中每個(gè)模塊均可以在不同設(shè)計(jì)層次上建模。*VerilogHDL還具有內(nèi)置邏輯函數(shù),例如&(按位與)和|(按位或)。*對(duì)高級(jí)編程語(yǔ)言結(jié)構(gòu),例如條件語(yǔ)句、情況語(yǔ)句和循環(huán)語(yǔ)句,語(yǔ)言中都可以使用。*可以顯式地對(duì)并發(fā)和定時(shí)進(jìn)行建模。*提供強(qiáng)有力的文件讀寫能力。*語(yǔ)言在特定情況下是非確定性的,即在不同的模擬器上模型可以產(chǎn)生不同的結(jié)果;例如,事件隊(duì)列上的事件順序在標(biāo)準(zhǔn)中沒有定義。習(xí)題VerilogHDL是在哪一年首次被IEEE標(biāo)準(zhǔn)化的?VerilogHDL支持哪三種基本描述方式?可以使用VerilogHDL描述一個(gè)設(shè)計(jì)的時(shí)序嗎?語(yǔ)言中的什么特性能夠用于描述參數(shù)化設(shè)計(jì)?能夠使用VerilogHDL編寫測(cè)試驗(yàn)證程序嗎?VerilogHDL是由哪個(gè)公司最先開發(fā)的?VerilogHDL中的兩類主要數(shù)據(jù)類型什么?UDP代表什么?寫出兩個(gè)開關(guān)級(jí)基本門的名稱。寫出兩個(gè)基本邏輯門的名稱。本章介紹VerilogHDL的基本要素,包括標(biāo)識(shí)符、注釋、數(shù)值、編譯程序指令、系統(tǒng)任務(wù)和系統(tǒng)函數(shù)。另外,本章還介紹了Verilog硬件描述語(yǔ)言中的兩種數(shù)據(jù)類型。標(biāo)識(shí)符VerilogHDL中的標(biāo)識(shí)符(identifier)可以是任意一組字母、數(shù)字、$符號(hào)和_(下劃線)符號(hào)的組合,但標(biāo)識(shí)符的第一個(gè)字符必須是字母或者下劃線。另外,標(biāo)識(shí)符是區(qū)分大小寫的。以下是標(biāo)識(shí)符的幾個(gè)例子:CountCOUNT//與Count不同。_R1_D2R56_68FIVE$轉(zhuǎn)義標(biāo)識(shí)符(escapedidentifier)可以在一條標(biāo)識(shí)符中包含任何可打印字符。轉(zhuǎn)義標(biāo)識(shí)符以\(反斜線)符號(hào)開頭,以空白結(jié)尾(空白可以是一個(gè)空格、一個(gè)制表字符或換行符)。下面例舉了幾個(gè)轉(zhuǎn)義標(biāo)識(shí)符:\7400\.*.$\{******}\~Q\OutGate與OutGate相同。最后這個(gè)例子解釋了在一條轉(zhuǎn)義標(biāo)識(shí)符中,反斜線和結(jié)束空格并不是轉(zhuǎn)義標(biāo)識(shí)符的一部分。也就是說(shuō),標(biāo)識(shí)符\OutGate和標(biāo)識(shí)符OutGate恒等。VerilogHDL定義了一系列保留字,叫做關(guān)鍵詞,它僅用于某些上下文中。附錄A列出了語(yǔ)言中的所有保留字。注意只有小寫的關(guān)鍵詞才是保留字。例如,標(biāo)識(shí)符always(這是個(gè)關(guān)鍵詞)與標(biāo)識(shí)符ALWAYS(非關(guān)鍵詞)是不同的。另外,轉(zhuǎn)義標(biāo)識(shí)符與關(guān)鍵詞并不完全相同。標(biāo)識(shí)符\initial與標(biāo)識(shí)符initial(這是個(gè)關(guān)鍵詞)不同。注意這一約定與那些轉(zhuǎn)義標(biāo)識(shí)符不同。注釋在VerilogHDL中有兩種形式的注釋。/*第一種形式:可以擴(kuò)展至多行*///第二種形式:在本行結(jié)束。格式VerilogHDL區(qū)分大小寫。也就是說(shuō)大小寫不同的標(biāo)識(shí)符是不同的。此外,VerilogHDL是自由格式的,即結(jié)構(gòu)可以跨越多行編寫,也可以在一行內(nèi)編寫。白空(新行、制表符和空格)沒有特殊意義。下面通過(guò)實(shí)例解釋說(shuō)明。initialbeginTop=3'b001;#2Top=3'b011;end和下面的指令一樣:initialbeginTop=3'b001;#2Top=3'b011;end系統(tǒng)任務(wù)和函數(shù)以$字符開始的標(biāo)識(shí)符表示系統(tǒng)任務(wù)或系統(tǒng)函數(shù)。任務(wù)提供了一種封裝行為的機(jī)制。這種機(jī)制可在設(shè)計(jì)的不同部分被調(diào)用。任務(wù)可以返回0個(gè)或多個(gè)值。函數(shù)除只能返回一個(gè)值以外與任務(wù)相同。此外,函數(shù)在0時(shí)刻執(zhí)行,即不允許延遲,而任務(wù)可以帶有延遲。$display("Hi,youhavereachedLTtoday");/*$display系統(tǒng)任務(wù)在新的一行中顯示。*/$time//該系統(tǒng)任務(wù)返回當(dāng)前的模擬時(shí)間。系統(tǒng)任務(wù)和系統(tǒng)函數(shù)在第10章中詳細(xì)講解。編譯指令以`(反引號(hào))開始的某些標(biāo)識(shí)符是編譯器指令。在Verilog語(yǔ)言編譯時(shí),特定的編譯器指令在整個(gè)編譯過(guò)程中有效(編譯過(guò)程可跨越多個(gè)文件),直到遇到其它的不同編譯程序指令。完整的標(biāo)準(zhǔn)編譯器指令如下:*`define,`undef*`ifdef,`else,`endif*`default_nettype*`include*`resetall*`timescale*`unconnected_drive,`nounconnected_drive*`celldefine,`endcelldefine`define和`undefdefine指令用于文本替換,它很像C語(yǔ)言中的#define指令,如:`defineMAX_BUS_SIZE32reg[`MAX_BUS_SIZE-1:0]AddReg;一旦define指令被編譯,其在整個(gè)編譯過(guò)程中都有效。例如,通過(guò)另一個(gè)文件中的`define指令,MAX_BUS_SIZE能被多個(gè)文件使用。undef指令取消前面定義的宏。例如:`defineWORD16//建立一個(gè)文本宏替代。wire[`WORD:1]Bus;`undefWORD//在undef編譯指令后,WORD的宏定義不再有效.`ifdef、`else和`endif這些編譯指令用于條件編譯,如下所示:`ifdefWINDOWSparameterWORD_SIZE=16elseparameterWORD_SIZE=32`endif在編譯過(guò)程中,如果已定義了名字為WINDOWS的文本宏,就選擇第一種參數(shù)聲明,否則選擇第二種參數(shù)說(shuō)明。else程序指令對(duì)于ifdef指令是可選的。`default_nettype該指令用于為隱式線網(wǎng)指定線網(wǎng)類型。也就是將那些沒有被說(shuō)明的連線定義線網(wǎng)類型。`default_nettypewand該實(shí)例定義的缺省的線網(wǎng)為線與類型。因此,如果在此指令后面的任何模塊中沒有說(shuō)明的連線,那么該線網(wǎng)被假定為線與類型。`include`include編譯器指令用于嵌入內(nèi)嵌文件的內(nèi)容。文件既可以用相對(duì)路徑名定義,也可以用全路徑名定義,例如:`include"../../primitives.v"編譯時(shí),這一行由文件“../../primitives.v”的內(nèi)容替代。`resetall該編譯器指令將所有的編譯指令重新設(shè)置為缺省值。`resetall例如,該指令使得缺省連線類型為線網(wǎng)類型。`timescale在VerilogHDL模型中,所有時(shí)延都用單位時(shí)間表述。使用timescale編譯器指令將時(shí)間單位與實(shí)際時(shí)間相關(guān)聯(lián)。該指令用于定義時(shí)延的單位和時(shí)延精度。`timescale編譯器指令格式為:`timescaletime_unit/time_precisiontime_unit和time_precision由值1、10、和100以及單位s、ms、us、ns、ps和fs組成。例如:`timescale1ns/100ps表示時(shí)延單位為1ns,時(shí)延精度為100ps。`timescale編譯器指令在模塊說(shuō)明外部出現(xiàn),并且影響后面所有的時(shí)延值。例如:timescale1ns/100ps
moduleAndFunc(Z,A,B);outputZ;inputA,B;and#(5.22,6.17)Al(Z,A,B);//規(guī)定了上升及下降時(shí)延值。endmodule編譯器指令定義時(shí)延以ns編譯器指令定義時(shí)延以ns為單位,并且時(shí)延精度為1/10ns(100ps)。因此,時(shí)延值5.22對(duì)應(yīng)5.2ns,時(shí)延6.17對(duì)應(yīng)6.2ns。如果用如下的`timescale程序指令代替上例中的編譯器指令,`timescale10ns/1ns那么5.22對(duì)應(yīng)52ns,6.17對(duì)應(yīng)62ns。在編譯過(guò)程中,`timescale指令影響這一編譯器指令后面所有模塊中的時(shí)延值,直至遇到另一個(gè)`timescale指令或`resetall指令。當(dāng)一個(gè)設(shè)計(jì)中的多個(gè)模塊帶有自身的`timescale編譯指令時(shí)將發(fā)生什么?在這種情況下,模擬器總是定位在所有模塊的最小時(shí)延精度上,并且所有時(shí)延都相應(yīng)地?fù)Q算為最小時(shí)延精度。例如,`timescale1ns/100psmoduleAndFunc(Z,A,B);outputZ;inputA,B;and#(5.22,6.17)Al(Z,A,B);endmoduletimescale10ns/1nsmoduleTB;regPutA,PutB;wireGetO;initialbeginPutA=0;PutB=0;#5.21PutB=1;#10.4PutA=1;#15PutB=0;endAndFuncAF1(GetO,PutA,PutB);endmodule在這個(gè)例子中,每個(gè)模塊都有自身的`timescale編譯器指令。`timescale編譯器指令第一次應(yīng)用于時(shí)延。因此,在第一個(gè)模塊中,5.22對(duì)應(yīng)5.2ns,6.17對(duì)應(yīng)6.2ns;在第二個(gè)模塊中5.21對(duì)應(yīng)52ns,10.4對(duì)應(yīng)104ns,15對(duì)應(yīng)150ns。如果仿真模塊TB,設(shè)計(jì)中的所有模塊最小時(shí)間精度為100ps。因此,所有延遲(特別是模塊TB中的延遲)將換算成精度為100ps。延遲52ns現(xiàn)在對(duì)應(yīng)520*100ps,104對(duì)應(yīng)1040*100ps,150對(duì)應(yīng)1500*100ps。更重要的是,仿真使用100ps為時(shí)間精度。如果仿真模塊AndFunc,由于模塊TB不是模塊AddFunc的子模塊,模塊TB中的`timescale程序指令將不再有效。`unconnected_drive和`nounconnected_drive在模塊實(shí)例化中,出現(xiàn)在這兩個(gè)編譯器指令間的任何未連接的輸入端口或者為正偏電路狀態(tài)或者為反偏電路狀態(tài)。`unconnected_drivepull1/*在這兩個(gè)程序指令間的所有未連接的輸入端口為正偏電路狀態(tài)(連接到高電平)*/`nounconnected_drive`unconnected_drivepull0/*在這兩個(gè)程序指令間的所有未連接的輸入端口為反偏電路狀態(tài)(連接到低電平)*/`nounconnected_drive`celldefine和`endcelldefine這兩個(gè)程序指令用于將模塊標(biāo)記為單元模塊。它們表示包含模塊定義,如下例所示。`celldefinemoduleFD1S3AX(D,CK,Z);endmodule`endcelldefine某些PLI例程使用單元模塊。3.6值集合VerilogHDL有下列四種基本的值:0:邏輯0或“假”1:邏輯1或“真”x:未知z:高阻注意這四種值的解釋都內(nèi)置于語(yǔ)言中。如一個(gè)為z的值總是意味著高阻抗,一個(gè)為0的值通常是指邏輯0。在門的輸入或一個(gè)表達(dá)式中的為“z”的值通常解釋成“x”。此外,x值和z值都是不分大小寫的,也就是說(shuō),值0x1z與值0X1Z相同。VerilogHDL中的常量是由以上這四類基本值組成的。VerilogHDL中有三類常量:整型實(shí)數(shù)型字符串型下劃線符號(hào)(_)可以隨意用在整數(shù)或?qū)崝?shù)中,它們就數(shù)量本身沒有意義。它們能用來(lái)提高易讀性;唯一的限制是下劃線符號(hào)不能用作為首字符。整型數(shù)整型數(shù)可以按如下兩種方式書寫:簡(jiǎn)單的十進(jìn)制數(shù)格式基數(shù)格式簡(jiǎn)單的十進(jìn)制格式這種形式的整數(shù)定義為帶有一個(gè)可選的“+”(一元)或“-”(一元)操作符的數(shù)字序列。下面是這種簡(jiǎn)易十進(jìn)制形式整數(shù)的例子。32十進(jìn)制數(shù)32-15十進(jìn)制數(shù)-15這種形式的整數(shù)值代表一個(gè)有符號(hào)的數(shù)。負(fù)數(shù)可使用兩種補(bǔ)碼形式表示。因此32在5位的二進(jìn)制形式中為10000,在6位二進(jìn)制形式中為110001;-15在5位二進(jìn)制形式中為10001,在6位二進(jìn)制形式中為110001?;鶖?shù)表示法這種形式的整數(shù)格式為:[size]'basevaluesize定義以位計(jì)的常量的位長(zhǎng);base為o或O(表示八進(jìn)制,)b或B(表示二進(jìn)制),d或D(表示十進(jìn)制),h或H(表示十六進(jìn)制)之一;value是基于base的值的數(shù)字序列。值x和z以及十六進(jìn)制中的a到f不區(qū)分大小寫。下面是一些具體實(shí)例:5'O375位八進(jìn)制數(shù)4'D24位十進(jìn)制數(shù)4'B1x_014位二進(jìn)制數(shù)7'Hx7位x(擴(kuò)展的x),即xxxxxxx4'hZ4位z(擴(kuò)展的z),即zzzz4'd-4非法:數(shù)值不能為負(fù)8'h2A在位長(zhǎng)和字符之間,以及基數(shù)和數(shù)值之間允許出現(xiàn)空格3'b001非法:`和基數(shù)b之間不允許出現(xiàn)空格(2+3)'b10非法:位長(zhǎng)不能夠?yàn)楸磉_(dá)式注意,x(或z)在十六進(jìn)制值中代表4位x(或z),在八進(jìn)制中代表3位x(或z),在二進(jìn)制中代表1位x(或z)?;鶖?shù)格式計(jì)數(shù)形式的數(shù)通常為無(wú)符號(hào)數(shù)。這種形式的整型數(shù)的長(zhǎng)度定義是可選的。如果沒有定義一個(gè)整數(shù)型的長(zhǎng)度,數(shù)的長(zhǎng)度為相應(yīng)值中定義的位數(shù)。下面是兩個(gè)例子:'o7219位八進(jìn)制數(shù)'hAF8位十六進(jìn)制數(shù)如果定義的長(zhǎng)度比為常量指定的長(zhǎng)度長(zhǎng),通常在左邊填0補(bǔ)位。但是如果數(shù)最左邊一位為x或z,就相應(yīng)地用x或z在左邊補(bǔ)位。例如:10'b10左邊添0占位,000000001010'bx0x1左邊添x占位,xxxxxxx0x1如果長(zhǎng)度定義得更小,那么最左邊的位相應(yīng)地被截?cái)?。例如?'b1001_0011與3'b011相等5'H0FFF與5'H1F相等?字符在數(shù)中可以代替值z(mì)在值z(mì)被解釋為不分大小寫的情況下提高可讀性(參見第8章)。實(shí)數(shù)實(shí)數(shù)可以用下列兩種形式定義:十進(jìn)制計(jì)數(shù)法;例如3.6E23.6E2360.0(e與E相同)2.05.67811572.120.12.//非法:小數(shù)點(diǎn)兩側(cè)必須有1位數(shù)字科學(xué)計(jì)數(shù)法;這種形式的實(shí)數(shù)舉例如下:23_5.1e2其值為23510.0;忽略下劃線.3字符串5E-40.0005Verilog語(yǔ)言定義了實(shí)數(shù)如何隱式地轉(zhuǎn)換為整數(shù)。實(shí)數(shù)通過(guò)四舍五入被轉(zhuǎn)換為最相近的整數(shù)。42.446,42.45轉(zhuǎn)換為整數(shù)4292.5,92.699轉(zhuǎn)換為整數(shù)93-15.62轉(zhuǎn)換為整數(shù)-16-26.22轉(zhuǎn)換為整數(shù)-26字符串是雙引號(hào)內(nèi)的字符序列。字符串不能分成多行書寫。例如:"INTERNALERROR""REACHED->HERE"用8位ASCII值表示的字符可看作是無(wú)符號(hào)整數(shù)。因此字符串是8位ASCII值的序列。為存儲(chǔ)字符串“INTERNALERROR”,變量需要8*14位。reg[1:8*14]Message;Message="INTERNALERROR"反斜線(\)用于對(duì)確定的特殊字符轉(zhuǎn)義。\n換行符\t制表符\\字符\本身\"字符"\206八進(jìn)制數(shù)206對(duì)應(yīng)的字符3.7數(shù)據(jù)類型VerilogHDL有兩大類數(shù)據(jù)類型。線網(wǎng)類型。nettype表示Verilog結(jié)構(gòu)化元件間的物理連線。它的值由驅(qū)動(dòng)元件的值決定,例如連續(xù)賦值或門的輸出。如果沒有驅(qū)動(dòng)元件連接到線網(wǎng),線網(wǎng)的缺省值為z。寄存器類型。registertype表示一個(gè)抽象的數(shù)據(jù)存儲(chǔ)單元,它只能在always語(yǔ)句和initial語(yǔ)句中被賦值,并且它的值從一個(gè)賦值到另一個(gè)賦值被保存下來(lái)。寄存器類型的變量具有x的缺省值。3.7.1線網(wǎng)類型線網(wǎng)數(shù)據(jù)類型包含下述不同種類的線網(wǎng)子類型。*wire*tri*wor*trior*wand*triand*trireg*tri1*tri0*supply0*supply1簡(jiǎn)單的線網(wǎng)類型說(shuō)明語(yǔ)法為:net_kind[msb:lsb]net1,net2,...,netN;net_kind是上述線網(wǎng)類型的一種。msb和lsb是用于定義線網(wǎng)范圍的常量表達(dá)式;范圍定義是可選的;如果沒有定義范圍,缺省的線網(wǎng)類型為1位。下面是線網(wǎng)類型說(shuō)明實(shí)例。wireRdy,Start;//2個(gè)1位的連線。wand[2:0]Addr;//Addr是3位線與。當(dāng)一個(gè)線網(wǎng)有多個(gè)驅(qū)動(dòng)器時(shí),即對(duì)一個(gè)線網(wǎng)有多個(gè)賦值時(shí),不同的線網(wǎng)產(chǎn)生不同的行為。例如,worRde;assignRde=Blt&Wyl;assignRde=Kbl|Kip;本例中,Rde有兩個(gè)驅(qū)動(dòng)源,分別來(lái)自于兩個(gè)連續(xù)賦值語(yǔ)句。由于它是線或線網(wǎng),Rde的有效值由使用驅(qū)動(dòng)源的值(右邊表達(dá)式的值)的線或(wor)表(參見后面線或網(wǎng)的有關(guān)章節(jié))決定。wire和tri線網(wǎng)用于連接單元的連線是最常見的線網(wǎng)類型。連線與三態(tài)線(tri)網(wǎng)語(yǔ)法和語(yǔ)義一致;三態(tài)線可以用于描述多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)同一根線的線網(wǎng)類型;并且沒有其他特殊的意義。wireReset;wire[3:2]Cla,Pla,Sla;tri[MSB-1:LSB+1]Art;如果多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)一個(gè)連線(或三態(tài)線網(wǎng)),線網(wǎng)的有效值由下表決定。wire(或tri)01xz00xx01x1x1xxxxxz01xz下面是一個(gè)具體實(shí)例:assignCla=Pla&Sla;assignCla=Pla^Sla;在這個(gè)實(shí)例中,Cla有兩個(gè)驅(qū)動(dòng)源。兩個(gè)驅(qū)動(dòng)源的值(右側(cè)表達(dá)式的值)用于在上表中索引,以便決定Cla的有效值。由于Cla是一個(gè)向量,每位的計(jì)算是相關(guān)的。例如,如果第一個(gè)右側(cè)表達(dá)式的值為01x,并且第二個(gè)右測(cè)表達(dá)式的值為11z,那么Cla的有效值是x1x(第一位0和1在表中索引到x,第二位1和1在表中索引到1,第三位x001x0001x0和z在表中索引到x)。wor和trior線網(wǎng)線或指如果某個(gè)驅(qū)動(dòng)源為1,那么線網(wǎng)的值也為1。線或和三態(tài)線或(trior)在語(yǔ)法和功能上是一致的。wor[MSB:LSB]Art;trior[MAX-1:MIN-1]Rdx,Sdx,Bdx;如果多個(gè)驅(qū)動(dòng)源驅(qū)動(dòng)這類網(wǎng),網(wǎng)的有效值由下表決定。wor(或trior)01xz11111xx1xxz01xzwand和triand線網(wǎng)線與(wand)網(wǎng)指如果某個(gè)驅(qū)動(dòng)源為0,那么線網(wǎng)的值為0。線與和三態(tài)線與(triand)網(wǎng)在語(yǔ)法和功能上是一致的。wand[-7:0]Dbus;triandReset,Clk;如果這類線網(wǎng)存在多個(gè)驅(qū)動(dòng)源,線網(wǎng)的有效值由下表決定。wand(或triand)01xz00000101x1x0xxxz01xztrireg線網(wǎng)此線網(wǎng)存儲(chǔ)數(shù)值(類似于寄存器),并且用于電容節(jié)點(diǎn)的建模。當(dāng)三態(tài)寄存器(trireg)的所有驅(qū)動(dòng)源都處于高阻態(tài),也就是說(shuō),值為z時(shí),三態(tài)寄存器線網(wǎng)保存作用在線網(wǎng)上的最后一個(gè)值。此外,三態(tài)寄存器線網(wǎng)的缺省初始值為x。trireg[1:8]Dbus,Abus;tri0和tri1線網(wǎng)這類線網(wǎng)可用于線邏輯的建模,即線網(wǎng)有多于一個(gè)驅(qū)動(dòng)源。tri0(tri1)線網(wǎng)的特征是,若無(wú)驅(qū)動(dòng)源驅(qū)動(dòng),它的值為0(tri1的值為1)。tri0[-3:3]GndBus;tri1[0:-5]OtBus,ItBus;下表顯示在多個(gè)驅(qū)動(dòng)源情況下tri0或tri1網(wǎng)的有效值。tri0(tri1)01xz00xx01x1x1xxxxxz01x0(1)supply0和supply1線網(wǎng)supply0用于對(duì)“地”建模,即低電平0;supply1網(wǎng)用于對(duì)電源建模,即高電平1;例如:supply0Gnd,ClkGnd;supply1[2:0]Vcc;未說(shuō)明的線網(wǎng)在VerilogHDL中,有可能不必聲明某種線網(wǎng)類型。在這樣的情況下,缺省線網(wǎng)類型為1位線網(wǎng)。可以使用`default_nettype編譯器指令改變這一隱式線網(wǎng)說(shuō)明方式。使用方法如下:`default_nettypenet_kind例如,帶有下列編譯器指令:default_nettypewand任何未被說(shuō)明的網(wǎng)缺省為1位線與網(wǎng)。向量和標(biāo)量線網(wǎng)在定義向量線網(wǎng)時(shí)可選用關(guān)鍵詞scalared或vectored。如果一個(gè)線網(wǎng)定義時(shí)使用了關(guān)鍵詞vectored,那么就不允許位選擇和部分選擇該線網(wǎng)。換句話說(shuō),必須對(duì)線網(wǎng)整體賦值(位選擇和部分選擇在下一章中講解)。例如:wirevectored[3:1]Grb;//不允許位選擇Grb[2]和部分選擇Grb[3:2]worscalared[4:0]Best;//與wor[4:0]Best相同,允許位選擇Best[2]和部分選擇Best[3:1]。如果沒有定義關(guān)鍵詞,缺省值為標(biāo)量。寄存器類型有5種不同的寄存器類型。reg*integer*time*real*realtimereg寄存器類型寄存器數(shù)據(jù)類型reg是最常見的數(shù)據(jù)類型。reg類型使用保留字reg加以說(shuō)明,形式如下:reg[msb:lsb]reg1,reg2,...regN;msb和lsb定義了范圍,并且均為常數(shù)值表達(dá)式。范圍定義是可選的;如果沒有定義范圍,缺省值為1位寄存器。例如:reg[3:0]Sat;//Sat為4位寄存器。regCnt;//1位寄存器。reg[1:32]Kisp,Pisp,Lisp;寄存器可以取任意長(zhǎng)度。寄存器中的值通常被解釋為無(wú)符號(hào)數(shù),例如:reg[1:4]Comb;Comb=-2;//Comb的值為14(1110),1110是2的補(bǔ)碼。Comb=5;//Comb的值為15(0101)。存儲(chǔ)器存儲(chǔ)器是一個(gè)寄存器數(shù)組。存儲(chǔ)器使用如下方式說(shuō)明:reg[msb:1sb]memory1[upper1:lower1],memory2[upper2:lower2],...;例如:reg[0:3]MyMem[0:63]//MyMem為64個(gè)4位寄存器的數(shù)組。regBog[1:5]//Bog為5個(gè)1位寄存器的數(shù)組。MyMem和Bog都是存儲(chǔ)器。數(shù)組的維數(shù)不能大于2。注意存儲(chǔ)器屬于寄存器數(shù)組類型。線網(wǎng)數(shù)據(jù)類型沒有相應(yīng)的存儲(chǔ)器類型。單個(gè)寄存器說(shuō)明既能夠用于說(shuō)明寄存器類型,也可以用于說(shuō)明存儲(chǔ)器類型。parameterADDR_SIZE=16,WORD_SIZE=8;reg[1:WORD_SIZE]RamPar[ADDR_SIZE-1:0],DataReg;RamPar是存儲(chǔ)器,是16個(gè)8位寄存器數(shù)組,而DataReg是8位寄存器。在賦值語(yǔ)句中需要注意如下區(qū)別:存儲(chǔ)器賦值不能在一條賦值語(yǔ)句中完成,但是寄存器可以。因此在存儲(chǔ)器被賦值時(shí),需要定義一個(gè)索引。下例說(shuō)明它們之間的不同。reg[1:5]Dig;//Dig為5位寄存器。Dig=5'b11011;上述賦值都是正確的,但下述賦值不正確:regBOg[1:5];//Bog為5個(gè)1位寄存器的存儲(chǔ)器。Bog=5'b11011;有一種存儲(chǔ)器賦值的方法是分別對(duì)存儲(chǔ)器中的每個(gè)字賦值。例如:reg[0:3]Xrom[1:4]Xrom[1]=4'hA;Xrom[2]=4'h8;Xrom[3]=4'hF;Xrom[4]=4'h2;為存儲(chǔ)器賦值的另一種方法是使用系統(tǒng)任務(wù):$readmemb(加載二進(jìn)制值)$readmemb(加載十六進(jìn)制值)這些系統(tǒng)任務(wù)從指定的文本文件中讀取數(shù)據(jù)并加載到存儲(chǔ)器。文本文件必須包含相應(yīng)的二進(jìn)制或者十六進(jìn)制數(shù)。例如:reg[1:4]RomB[7:1];$readmemb("ram.patt",RomB);Romb是存儲(chǔ)器。文件“ram.patt”必須包含二進(jìn)制值。文件也可以包含空白空間和注釋。下面是文件中可能內(nèi)容的實(shí)例。1101111010000111000010010011系統(tǒng)任務(wù)$readmemb促使從索引7即Romb最左邊的字索引,開始讀取值。如果只加載存儲(chǔ)器的一部分,值域可以在$readmemb方法中顯式定義。例如:$readmemb("ram.patt",RomB,5,3);在這種情況下只有Romb[5],Romb[4]和Romb[3]這些字從文件頭開始被讀取。被讀取的值為1101、1100和1000。文件可以包含顯式的地址形式。@hex_addressvalue如下實(shí)例:@511001@211010在這種情況下,值被讀入存儲(chǔ)器指定的地址。當(dāng)只定義開始值時(shí),連續(xù)讀取直至到達(dá)存儲(chǔ)器右端索引邊界。例如:$readmemb("rom.patt",RomB,6);//從地址6開始,并且持續(xù)到1。$readmemb("rom.patt",RomB,6,4);//從地址6讀到地址4。Integer寄存器類型整數(shù)寄存器包含整數(shù)值。整數(shù)寄存器可以作為普通寄存器使用,典型應(yīng)用為高層次行為建模。使用整數(shù)型說(shuō)明形式如下:integerinteger1,integer2,...intergerN[msb:1sb];msb和lsb是定義整數(shù)數(shù)組界限的常量表達(dá)式,數(shù)組界限的定義是可選的。注意容許無(wú)位界限的情況。一個(gè)整數(shù)最少容納32位。但是具體實(shí)現(xiàn)可提供更多的位。下面是整數(shù)說(shuō)明的實(shí)例。integerA,B,C;//三個(gè)整數(shù)型寄存器。integerHist[3:6];//一組四個(gè)寄存器。一個(gè)整數(shù)型寄存器可存儲(chǔ)有符號(hào)數(shù),并且算術(shù)操作符提供2的補(bǔ)碼運(yùn)算結(jié)果。整數(shù)不能作為位向量訪問(wèn)。例如,對(duì)于上面的整數(shù)B的說(shuō)明,B[6]和B[20:10]是非法的。一種截取位值的方法是將整數(shù)賦值給一般的reg類型變量,然后從中選取相應(yīng)的位,如下所示:reg[31:0]Breg;integerBint;//Bint[6]和Bint[20:10]是不允許的。Breg=Bint;/*現(xiàn)在,Breg[6]和Breg[20:10]是允許的,并且從整數(shù)Bint獲取相應(yīng)的位值。*/上例說(shuō)明了如何通過(guò)簡(jiǎn)單的賦值將整數(shù)轉(zhuǎn)換為位向量。類型轉(zhuǎn)換自動(dòng)完成,不必使用特定的函數(shù)。從位向量到整數(shù)的轉(zhuǎn)換也可以通過(guò)賦值完成。例如:integerJ;reg[3:0]Bcq;J=6;//J的值為32'b0000...00110。Bcq=J;//Bcq的值為4'b
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025公交候車亭廣告資源經(jīng)營(yíng)權(quán)租賃承包合同
- 2025年工業(yè)生產(chǎn)用氣合同
- 2025年度個(gè)人二手車交易合同范本(含車輛交易背景調(diào)查與信用評(píng)估)2篇
- 2025年度個(gè)人網(wǎng)絡(luò)安全保險(xiǎn)合同范本4篇
- 2025年度個(gè)人住房質(zhì)押擔(dān)保借款合同標(biāo)準(zhǔn)范本4篇
- 2025版無(wú)人機(jī)植保作業(yè)保險(xiǎn)合同示范文本3篇
- 2025年度民宿改造裝修運(yùn)營(yíng)管理合同
- 多人委托個(gè)人委托協(xié)議
- 網(wǎng)紅推廣合作協(xié)議
- 2025版智慧社區(qū)房屋建設(shè)施工合同范本9篇
- VI設(shè)計(jì)輔助圖形設(shè)計(jì)
- 淺談小學(xué)勞動(dòng)教育的開展與探究 論文
- 2023年全國(guó)4月高等教育自學(xué)考試管理學(xué)原理00054試題及答案新編
- 稀土配合物和量子點(diǎn)共摻雜構(gòu)筑發(fā)光軟材料及其熒光性能研究
- 河北省大學(xué)生調(diào)研河北社會(huì)調(diào)查活動(dòng)項(xiàng)目申請(qǐng)書
- JJG 921-2021環(huán)境振動(dòng)分析儀
- 中藥炮制學(xué)-第五、六章
- 小兒高熱驚厥精品課件
- 兩段焙燒除砷技術(shù)簡(jiǎn)介 - 文字版(1)(2)課件
- 實(shí)習(xí)證明模板免費(fèi)下載【8篇】
- 2022年電拖實(shí)驗(yàn)報(bào)告伍宏淳
評(píng)論
0/150
提交評(píng)論