VerilogHDL基本語法綜述_第1頁
VerilogHDL基本語法綜述_第2頁
VerilogHDL基本語法綜述_第3頁
VerilogHDL基本語法綜述_第4頁
VerilogHDL基本語法綜述_第5頁
已閱讀5頁,還剩128頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

VerilogHDL基本語法

語匯代碼的編寫標(biāo)準(zhǔn)常量、變量及數(shù)據(jù)類型關(guān)鍵字和標(biāo)示符

運(yùn)算符

語句綜合代碼的編寫標(biāo)準(zhǔn)

規(guī)定了文本布局、命名和注釋的約定,以提高源代碼的可讀性和可維護(hù)性。每個(gè)VerilogHDL源文件中只準(zhǔn)編寫一個(gè)頂層模塊,也不能把一個(gè)頂層模塊分成幾部分寫在幾個(gè)源文件中。源文件名字應(yīng)與文件內(nèi)容有關(guān),最好與頂層模塊同名!源文件名字的第一個(gè)字符必須是字母或下劃線,不能是數(shù)字或$符號!每行只寫一個(gè)聲明語句或說明。源代碼用層層縮進(jìn)的格式來寫。語匯代碼的編寫標(biāo)準(zhǔn)2定義變量名的大小寫應(yīng)自始至終保持一致(如變量名第一個(gè)字母均大寫)。變量名應(yīng)該有意義,而且含有一定的有關(guān)信息。局部變量名(如循環(huán)變量)應(yīng)簡單扼要。通過注釋對源代碼做必要的說明,尤其對接口(如模塊參數(shù)、端口、任務(wù)、函數(shù)變量)做必要的注釋很重要。語匯代碼的編寫標(biāo)準(zhǔn)3常量盡可能多地使用參數(shù)定義和宏定義,而不要在語句中直接使用字母、數(shù)字和字符串。

參數(shù)定義(用一個(gè)標(biāo)識符來代表一個(gè)常量)的格式:

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

宏定義(用一個(gè)簡單的宏名來代替一個(gè)復(fù)雜的表達(dá)式)的格式:’define標(biāo)志符(即宏名)字符串(即宏內(nèi)容)語匯代碼的編寫標(biāo)準(zhǔn)4常量整型數(shù):5表達(dá)方式說明舉例+/-<位寬>’<進(jìn)制><數(shù)字>完整的表達(dá)方式8’b11000101或8’hc5<進(jìn)制><數(shù)字>缺省位寬,則位寬由機(jī)器系統(tǒng)決定,至少32位hc5<數(shù)字>缺省進(jìn)制為十進(jìn)制,位寬默認(rèn)為32位197注:這里位寬指對應(yīng)二進(jìn)制數(shù)的寬度。常量x表示不定值,z表示高阻值;“?”是z的另一種表示符號,建議在case語句中使用?表示高阻態(tài)z為提高可讀性,在較長的數(shù)字之間可用下劃線_隔開!但不可以用在<進(jìn)制>和<數(shù)字>之間。當(dāng)常量未指明位寬時(shí),默認(rèn)為32位。617 //位寬,基數(shù)符號不寫會采用default值(32bit十進(jìn)制)8’d32 //8-bit十進(jìn)制值為32

8’h1A8’o378’b0001_110032’bx //”x”表unknown4’b0??? //”?”表示高阻常量7常量實(shí)數(shù)十進(jìn)制計(jì)數(shù)法,科學(xué)計(jì)數(shù)法

7.21.8e-4 //1.8*10-49.5E6字符串與字符變量字符串為兩個(gè)雙引號“

”之間的字符,不許跨行“Thisisastring!”;//共17個(gè)字符8常量參數(shù)(符號常量)

參數(shù)是一個(gè)常量,經(jīng)常用于定義時(shí)延和變量的寬度。

parameterbyte_size=8;//定義一個(gè)常數(shù)參數(shù) parameter,byte_msb=byte_size-1;//用數(shù)表達(dá)式賦值 parameteraverage_delay=(r+f)/2;//用常數(shù)表達(dá)式賦值9變量變量即在程序運(yùn)行過程中其值可以改變的量

VerilogHDL中共有19種數(shù)據(jù)類型;其中3個(gè)最基本的數(shù)據(jù)類型為:網(wǎng)絡(luò)型(netstype)寄存器型(registertype)數(shù)組型(memorytype)10變量

線網(wǎng)類型:netstype表示Verilog結(jié)構(gòu)化元件間的物理連線。它的值由驅(qū)動元件的值決定;如果沒有驅(qū)動元件連接到線網(wǎng),線網(wǎng)的缺省值為z。

寄存器類型:registertype表示一個(gè)抽象的數(shù)據(jù)存儲單元,它只能在always語句和initial語句中被賦值,并且它的值從一個(gè)賦值到另一個(gè)賦值被保存下來。寄存器類型的變量具有x的缺省值。11wire型變量它是最常用的nets型變量,常用來表示以assign語句賦值的組合邏輯信號。模塊中的輸入/輸出信號類型缺省為wire型。可用做任何方程式的輸入,或“assign”語句和實(shí)例元件的輸出。變量12wire

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;wire[n-1:0]

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;或wire[n:1]

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;每條總線位寬為n共有m條總線wire型向量(總線)格式變量13變量14register類型:

在程序塊中作變量用,對信號賦值需要用該數(shù)據(jù)類型,賦值時(shí)用關(guān)鍵字initial或always開始。常用register變量reg:是最常見的數(shù)據(jù)類型,常代表觸發(fā)器.integer:

32位帶符號整數(shù)型變量,可以作為普通寄存器使用,典型應(yīng)用為高層次行為建模。time類型:無符號時(shí)間變量。real和realtime類型:實(shí)數(shù)寄存器(或?qū)崝?shù)時(shí)間寄存器)變量register型變量與nets型變量的根本區(qū)別是:register型變量需要被明確地賦值,并且在被重新賦值前一直保持原值。register型變量必須通過過程賦值語句賦值!不能通過assign語句賦值!在過程塊內(nèi)被賦值的每個(gè)信號必須定義成register型!15reg型變量定義——在過程塊中被賦值的信號,往往代表觸發(fā)器,但不一定就是觸發(fā)器(也可以是組合邏輯信號)!reg

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名n;格式變量16reg[n-1:0]

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;或reg[n:1]

數(shù)據(jù)名1,數(shù)據(jù)名2,……,數(shù)據(jù)名m;每個(gè)向量位寬為n共有m個(gè)reg型向量[例]reg[4:1]regc,regd;//regc,regd為4位寬的reg型向量reg型向量(總線)變量17

用reg型變量生成組合邏輯舉例:

modulerw1(a,b,out1,out2);

inputa,b;

outputout1,out2;

regout1;

wireout2;

assignout2=a;

always@(b)

out1<=~b;

endmoduleaout2BUFFbINVout1過程賦值語句連續(xù)賦值語句電平觸發(fā)Verilog中reg與wire的區(qū)別reg型變量既可生成觸發(fā)器,也可生成組合邏輯;wire型變量只能生成組合邏輯。變量18用reg型變量生成觸發(fā)器舉例:

modulerw2(clk,d,out1,out2);

inputclk,d;

outputout1,out2;

regout1;

wireout2;

assignout2=d&~out1;

always@(posedgeclk)

begin

out1<=d;

end

endmodule

過程賦值語句連續(xù)賦值語句dout2AND2i1clkout1DQDFF上沿觸發(fā)變量19變量Memory類型

VerilogHDL通過對reg型變量建立數(shù)組來對存儲器建模,可以描述RAM型存儲器,ROM存儲器和reg文件。數(shù)組中的每一個(gè)單元通過一個(gè)數(shù)組索引進(jìn)行尋址。在Verilog語言中沒有多維數(shù)組存在。memory型數(shù)據(jù)是通過擴(kuò)展reg型數(shù)據(jù)的地址范圍來生成的。20變量格式:reg[n-1:0]存儲器名[m-1:0];reg[n-1:0]定義了存儲器中每一個(gè)存儲單元的大小,即該存儲單元是一個(gè)n位的寄存器。存儲器名后的[m-1:0]或[m:1]則定義了該存儲器中有多少個(gè)這樣的寄存器。最后用分號結(jié)束定義語句。21變量例:reg[7:0]mema[255:0];這個(gè)例子定義了一個(gè)名為mema的存儲器,該存儲器有256個(gè)8位的存儲器。該存儲器的地址范圍是0到255。注意:對存儲器進(jìn)行地址索引的表達(dá)式必須是常數(shù)表達(dá)式。22變量Verilog的變量的四種邏輯狀態(tài):

0:邏輯零、邏輯非、低電平

1:邏輯1、邏輯真、高電平

x或X:不定態(tài)

z或Z:高阻態(tài)23關(guān)鍵字關(guān)鍵字——事先定義好的確認(rèn)符,用來組織語言結(jié)構(gòu);或者用于定義VerilogHDL提供的門元件(如and,not,or,buf)。用小寫字母定義!

——如always,assign,begin,case,casex,else,end,for,function,if,input,output,repeat,table,time,while,wire24用戶程序中的變量、節(jié)點(diǎn)等名稱不能與關(guān)鍵字同名!關(guān)鍵詞25edgeelseendendcaseendfunctionendprimitiveendmoduleendspecifyendtableendtaskeventforforceforeverforkfunctionhighz0highz1ififnoneinitialinoutinputintegerjoinlargemacromodulemediummodulenandnegedgenornotnotif0notif1nmosoroutputparameterpmosposedgeprimitivepulldownpulluppull0pull1andalwaysassignbeginbufbufif0bufif1casecasexcasezcmosdeassigndefaultdefparamdisable關(guān)鍵詞26tri0tri1vectoredwaitwandweak0weak1whilewireworxnorxorrcmosrealrealtimeregreleaserepeatrnmosrpmosrtranrtranif0rtranif1scalaredsmallspecifyspecparamstrengthstrong0strong1supply0supply1tabletasktrantranif0tranif1timetritriandtriortrireg特殊字符$:以$開頭的標(biāo)識符代表系統(tǒng)命令$time:返回目前的仿真時(shí)間$display:顯示出信號的值$stop:停止仿真#時(shí)延控制 not#3not1(sel_,sel);//instancedelay #5a=0;b=0;cin=1; //proceduralstatementdelay27標(biāo)示符28

任何用VerilogHDL語言描述的“東西”都通過其名字來識別,這個(gè)名字被稱為標(biāo)識符。

如源文件名、模塊名、端口名、變量名、常量名、實(shí)例名等。

標(biāo)識符可由字母、數(shù)字、下劃線和$符號構(gòu)成;但第一個(gè)字符必須是字母或下劃線,不能是數(shù)字或$符號!

在VerilogHDL中變量名是區(qū)分大小寫的!標(biāo)識符不能與關(guān)鍵字同名!標(biāo)示符

標(biāo)識符必須是由a-z,A-Z,0-9,_,$這些字符組成,最長只能到1024個(gè)字符

開頭必須由a-z,A-Z或下劃線_開頭

可以在標(biāo)識符所取的非法名稱前加上反斜杠“\”,并在名稱結(jié)尾加上空白鍵,這樣就可以用任何可印出的ASCII字符來當(dāng)作標(biāo)識符的名稱了;而反斜杠和空白鍵不會被視為標(biāo)識符的一部分29標(biāo)示符30合法的名字:A_99_ZReset_54MHz_Clock$Module

不合法的名字:123a$datamodule7seg.v運(yùn)算符31進(jìn)行整數(shù)除法運(yùn)算時(shí),結(jié)果值略去小數(shù)部分,只取整數(shù)部分!

%稱為求模(或求余)運(yùn)算符,要求%兩側(cè)均為整型數(shù)據(jù);求模運(yùn)算結(jié)果值的符號位取第一個(gè)操作數(shù)的符號位!

[例]-11%3結(jié)果為-2進(jìn)行算術(shù)運(yùn)算時(shí),若某操作數(shù)為不定值x,則整個(gè)結(jié)果也為x。 運(yùn)算符32運(yùn)算符

位運(yùn)算符:按位進(jìn)行運(yùn)算,結(jié)果的位數(shù)不變

兩個(gè)不同長度的操作數(shù)進(jìn)行位運(yùn)算時(shí),將自動按右端對齊,位數(shù)少的操作數(shù)會在高位用0補(bǔ)齊

[例]若A=5’b11001,B=3’b101,則A&B=(5’b11001)&(5’b00101) =5’b0000133運(yùn)算符

關(guān)系運(yùn)算結(jié)果為1位的邏輯值1或0或x。關(guān)系運(yùn)算時(shí),若關(guān)系為真,則返回值為1;若聲明的關(guān)系為假,則返回值為0;若某操作數(shù)為不定值x,則返回值為x。

等式運(yùn)算符運(yùn)算結(jié)果為1位的邏輯值1或0或x。等于運(yùn)算符(==)和全等運(yùn)算符(===)的區(qū)別:使用等于運(yùn)算符時(shí),兩個(gè)操作數(shù)必須逐位相等,結(jié)果才為1;若某些位為x或z,則結(jié)果為x。使用全等運(yùn)算符時(shí),若兩個(gè)操作數(shù)的相應(yīng)位完全一致(如同是1,或同是0,或同是x,或同是z),則結(jié)果為1;否則為0。34==01xz01xz10xx01xxxxxxxxxx===01xz01xz1000010000100001“==”的真值表“===”的真值表等于運(yùn)算的結(jié)果可能為1或0或x全等于運(yùn)算的結(jié)果只有1或0運(yùn)算符35左移會擴(kuò)充位數(shù)!將操作數(shù)右移或左移n位,相當(dāng)于將操作數(shù)除以或乘以2n。右移位數(shù)不變,但右移的數(shù)據(jù)會丟失!運(yùn)算符

移位運(yùn)算符:將操作數(shù)右移或左移n位,同時(shí)用n個(gè)0填補(bǔ)移出的空位。

[例]4’b1001>>3=4’b0001; 4’b1001>>4=4’b0000 4’b1001<<1=5’b10010;

4’b1001<<2=6’b100100;

1<<6=32’b100000036運(yùn)算符條件運(yùn)算符<條件>?<條件為真表達(dá)式>:<條件為假表達(dá)式> EX:tri_data=en?data_out:32’bz;//三態(tài)37類別運(yùn)算符優(yōu)先級邏輯、位運(yùn)算符!~高低算術(shù)運(yùn)算符*/%+-移位運(yùn)算符<<>>關(guān)系運(yùn)算符<<=>>=等式運(yùn)算符==!====!==縮減、位運(yùn)算符&~&^^~|~|邏輯運(yùn)算符&&||條件運(yùn)算符?:運(yùn)算符的優(yōu)先級為提高程序的可讀性,建議使用括號來控制運(yùn)算的優(yōu)先級![例](a>b)&&(b>c)

(a==b)||(x==y)

(!a)||(a>b)運(yùn)算符38語句39賦值語句連續(xù)賦值語句過程賦值語句塊語句begin_end語句fork_join語句條件語句if_else語句case語句循環(huán)語句forever語句while語句repeat語句for語句結(jié)構(gòu)說明語句initial語句always語句task語句function語句編譯預(yù)處理語句‘define語句‘timescale語句‘include語句語句40賦值語句分為兩類:連續(xù)賦值語句——assign語句,用于對wire型變量賦值,是描述組合邏輯最常用的方法之一

[例]assignc=a&b;//a、b、c均為wire型變量過程賦值語句——用于對reg型變量賦值,有兩種方式:

非阻塞(non-blocking)賦值方式:

賦值符號為<=,如b<=a;阻塞(blocking)賦值方式:

賦值符號為=,如b=a;

非阻塞賦值方式

always@(posedgeclk)

begin

b<=a;

c<=b;

endclkDFFcDQDQabDFF非阻塞賦值在塊結(jié)束時(shí)才完成賦值操作!注:c的值比b的值落后一個(gè)時(shí)鐘周期!語句41阻塞賦值方式

always@(posedgeclk)

begin

b=a;

c=b;

end阻塞賦值在該語句結(jié)束時(shí)就完成賦值操作!clkDFFcDQab注:在一個(gè)塊語句中,如果有多條阻塞賦值語句,在前面的賦值語句沒有完成之前,后面的語句就不能被執(zhí)行,就像被阻塞了一樣,因此稱為阻塞賦值方式。這里c的值與b的值一樣

!語句42非阻塞(non-blocking)賦值方式(b<=a):b的值被賦成新值a的操作,并不是立刻完成的,而是在塊結(jié)束時(shí)才完成;塊內(nèi)的多條賦值語句在塊結(jié)束時(shí)同時(shí)賦值;硬件有對應(yīng)的電路。阻塞(blocking)賦值方式(b=a):b的值立刻被賦成新值a;完成該賦值語句后才能執(zhí)行下一句的操作;硬件沒有對應(yīng)的電路,因而綜合結(jié)果未知。建議在初學(xué)時(shí)只使用一種方式,不要混用!建議在可綜合風(fēng)格的模塊中使用非阻塞賦值!語句43

塊語句用來將兩條或多條語句組合在一起,使其在格式上更像一條語句,以增加程序的可讀性。

塊語句有兩種:begin_end語句——標(biāo)識順序執(zhí)行的語句fork_join語句——標(biāo)識并行執(zhí)行的語句語句44順序塊塊內(nèi)的語句是順序執(zhí)行的;每條語句的延遲時(shí)間是相對于前一條語句的仿真時(shí)間而言的;直到最后一條語句執(zhí)行完,程序流程控制才跳出該順序塊。語句45begin

語句1;語句2;

語句n;endbegin:塊名塊內(nèi)聲明語句;語句1;語句2;

語句n;end注:塊內(nèi)聲明語句可以是參數(shù)聲明、reg型變量聲明、integer型變量聲明、real型變量聲明語句。或順序塊的格式語句46[例]begin

b=a;

c=b;//c的值為a的值

end[例]begin

b=a;

#10

c=b;//在兩條賦值語句間延遲10個(gè)時(shí)間單位

end注:這里標(biāo)識符“#”表示延遲;在模塊調(diào)用中“#”表示參數(shù)的傳遞語句47

[例]用順序塊和延遲控制組合產(chǎn)生一個(gè)時(shí)序波形。

parameterd=50;

reg[7:0]r;

begin //由一系列延遲產(chǎn)生的波形

#dr=’

h35;

#dr=’

hE2;

#dr=’

h00;

#dr=’

hF7;

#d–>end_wave;

//觸發(fā)事件end_wave

end注:每條語句的延遲時(shí)間d是相對于前一條語句的仿真時(shí)間而言的!語句48用fork_join標(biāo)識的塊語句并行塊塊內(nèi)的語句是同時(shí)執(zhí)行的;塊內(nèi)每條語句的延遲時(shí)間是相對于程序流程控制進(jìn)入到塊內(nèi)時(shí)的仿真時(shí)間而言的;延遲時(shí)間用于給賦值語句提供時(shí)序;當(dāng)按時(shí)間排序在最后的語句執(zhí)行完或一個(gè)disable語句執(zhí)行時(shí),程序流程控制跳出該并行塊。49fork

語句1;語句2;

語句n;joinfork:塊名塊內(nèi)聲明語句;語句1;語句2;

語句n;join或注:塊內(nèi)聲明語句可以是參數(shù)聲明、reg型變量聲明、integer型變量聲明、real型變量聲明語句、time型變量聲明語句和事件(event)說明語句。并行塊的格式語句50[例4]用并行塊和延遲控制組合產(chǎn)生一個(gè)時(shí)序波形。

reg[7:0]r;

fork

//由一系列延遲產(chǎn)生的波形

#50r=’

h35;

#100r=’

hE2;

#150r=’

h00;

#200r=’

hF7;

#250–>end_wave;

//觸發(fā)事件end_wave

join波形同例3注:在fork_join塊內(nèi),各條語句不必按順序給出!但為增加可讀性,最好按被執(zhí)行的順序書寫!語句51語句if-else條件語句case語句for循環(huán)語句52if(條件表達(dá)式) 塊語句1 elseif(條件表達(dá)式2)塊語句2 …… elseif(條件表達(dá)式n)塊語句nelse

塊語句n+1case(敏感表達(dá)式)

值1:塊語句1

值2:塊語句2 ……

值n:塊語句n default:塊語句n+1endcasefor(表達(dá)式1;表達(dá)式2;表達(dá)式3)塊語句若if與else的數(shù)目不一樣,注意用“begin_end”語句來確定if與else的配對關(guān)系!if(表達(dá)式1)

if(表達(dá)式2)語句1;

else

語句2;else

if(表達(dá)式3)語句3;

else

語句4;if(表達(dá)式1)

begin

if(表達(dá)式2)語句1;

endelse

語句2;當(dāng)if與else的數(shù)目不一樣時(shí),最好用“begin_end”語句將單獨(dú)的if語句括起來:if語句的嵌套:語句53語句case語句與if-else語句區(qū)別if-else語句適于對不同的條件,執(zhí)行不同的語句;對于每個(gè)判定只有兩個(gè)分支。case語句適于對同一個(gè)控制信號取不同的值時(shí),輸出取不同的值!它是多分支語句。當(dāng)控制信號只有一個(gè)時(shí),最好采用case語句,比較簡潔!54是case語句的兩種變體語句casecasezcasex的區(qū)別在case語句中,分支表達(dá)式每一位的值都是確定的(或者為0,或者為1);在casez語句中,若分支表達(dá)式某些位的值為高阻值z,則不考慮對這些位的比較;在casex語句中,若分支表達(dá)式某些位的值為z或不定值x,則不考慮對這些位的比較。在分支表達(dá)式中,可用“?”來標(biāo)識x或z55modulemux_z(out,a,b,c,d,select);outputout;inputa,b,c,d;input[3:0]select;regout;//必須聲明

always@(select[3:0]oraorborcord)begin

casez(select)4’b???1:out=a;

4’b??1?:out=b;

4’b?1??:out=c;

4’b1???:out=d;

endcaseendendmodule[例]用casez描述的數(shù)據(jù)選擇器這里“?”表示高阻態(tài)語句56使用條件語句注意事項(xiàng)

應(yīng)注意列出所有條件分支,否則當(dāng)條件不滿足時(shí),編譯器會生成一個(gè)鎖存器保持原值!

這一點(diǎn)可用于設(shè)計(jì)時(shí)序電路,如計(jì)數(shù)器:條件滿足時(shí)加1,否則保持原值不變。

而在組合電路設(shè)計(jì)中,應(yīng)避免生成隱含鎖存器!有效的方法是在if語句最后寫上else項(xiàng);在case語句最后寫上default項(xiàng)。語句57如何正確使用if語句?生成了不想要的鎖存器:不會生成鎖存器:always@(alord)beginif(al)q<=d;

enddDFFD

Qalq[例]設(shè)計(jì)一個(gè)數(shù)據(jù)選擇器always@(alord)beginif(al)q<=d;

elseq<=0;

end0dalqmultiplexer當(dāng)al為0時(shí),q保持原值!當(dāng)al為0時(shí),q等于0!語句58always@(sel[1:0]oraorb)case(sel[1:0])2’b00:q<=a;

2’b11:q<=b;

endcase生成了不想要的鎖存器:[例]設(shè)計(jì)一個(gè)數(shù)據(jù)選擇器always@(sel[1:0]oraorb)case(sel[1:0])2’b00:q<=a;

2’b11:q<=b;

default:q<=’b0;

endcase不會生成鎖存器:如何正確使用case語句?當(dāng)sel為00或11以外的值時(shí),q保持原值!避免生成鎖存器的原則:如果用到if語句,最好寫上else項(xiàng);如果用到case語句,最好寫上default項(xiàng)。語句59循環(huán)語句for語句——通過3個(gè)步驟來決定語句的循環(huán)執(zhí)行:(1)給控制循環(huán)次數(shù)的變量賦初值。(2)判定循環(huán)執(zhí)行條件,若為假則跳出循環(huán);若為真,則執(zhí)行指定的語句后,轉(zhuǎn)到第(3)步。(3)修改循環(huán)變量的值,返回第(2)步。repeat語句——連續(xù)執(zhí)行一條語句n次while語句——執(zhí)行一條語句,直到循環(huán)執(zhí)行條件不滿足;若一開始條件即不滿足,則該語句一次也不能被執(zhí)行!forever語句——無限連續(xù)地執(zhí)行語句,可用disable語句中斷!語句60for語句for

(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句for(循環(huán)變量賦初值;循環(huán)執(zhí)行條件;循環(huán)變量增值)執(zhí)行語句8條語句相當(dāng)于采用while語句建立的循環(huán)結(jié)構(gòu):begin

循環(huán)變量賦初值;

while(循環(huán)執(zhí)行條件)begin<執(zhí)行語句>

循環(huán)變量增值;

endendfor語句比while語句簡潔!語句61repeat語句

連續(xù)執(zhí)行一條或多條語句n次。repeat

(循環(huán)次數(shù)表達(dá)式)語句repeat

(循環(huán)次數(shù)表達(dá)式)

begin……

end執(zhí)行語句為多條語句或格語句62[例]兩個(gè)8位二進(jìn)制數(shù)乘法注:不如采用for語句簡單!語句631.while語句

有條件地執(zhí)行一條或多條語句。首先判斷循環(huán)執(zhí)行條件表達(dá)式是否為真。若為真,則執(zhí)行后面的語句或語句塊;然后再回頭判斷循環(huán)執(zhí)行條件表達(dá)式是否為真,若為真,再執(zhí)行一次后面的語句;如此不斷,直到條件表達(dá)式不為真。while

(循環(huán)執(zhí)行條件表達(dá)式)語句while

(循環(huán)執(zhí)行條件表達(dá)式)

begin

……

end或語句while64modulecount1s_while(count,rega,clk); output[3:0]count; input[7:0]rega;inputclk;reg[3:0]count;always@(posedgeclk) begin:count1reg[7:0]tempreg;//用作循環(huán)執(zhí)行條件表達(dá)式

count=0;//count初值為0tempreg=rega;//tempreg初值為rega

while(tempreg)

//若tempreg非0,則執(zhí)行以下語句

beginif(tempreg[0])count=count+1;

//只要tempreg最低位為1,則count加1

tempreg=tempreg>>1;

//右移1位

endendendmodule[例]對一個(gè)8位二進(jìn)制數(shù)中值為1的位進(jìn)行計(jì)數(shù)。改變循環(huán)執(zhí)行條件表達(dá)式的值如何用for語句改寫此程序呢?語句65無條件連續(xù)執(zhí)行forever后面的語句或語句塊。forever

語句forever

begin……

end或常用在測試模塊中產(chǎn)生周期性的波形,作為仿真激勵(lì)信號。常用disable語句跳出循環(huán)!注:不同于always語句,不能獨(dú)立寫在程序中,一般用在initial語句塊中!initialbegin:Clocking clk=0;#10forever#10clk=!clk;endinitialbegin:Stimulus ……

disableClocking;//停止時(shí)鐘

end語句

forever語句66initial說明語句

——只執(zhí)行一次always說明語句——不斷重復(fù)執(zhí)行,直到仿真

結(jié)束task說明語句——可在程序模塊中的一處或

多處調(diào)用function說明語句——可在程序模塊中的一處

或多處調(diào)用語句結(jié)構(gòu)說明語句67always塊語句包含一個(gè)或一個(gè)以上的聲明語句(如:過程賦值語句、任務(wù)調(diào)用、條件語句和循環(huán)語句等),在仿真運(yùn)行的全過程中,在定時(shí)控制下被反復(fù)執(zhí)行。語句結(jié)構(gòu)說明語句在always塊中被賦值的只能是register型變量(如reg,integer,real,time)。每個(gè)always塊在仿真一開始便開始執(zhí)行,當(dāng)執(zhí)行完塊中最后一個(gè)語句,繼續(xù)從always塊的開頭執(zhí)行。68always

<時(shí)序控制><語句>注1:如果always塊中包含一個(gè)以上的語句,則這些語句必須放在begin_end或fork_join塊中!always@(posedgeclkornegedgeclear)

begin

if(!clear)qout=0;//異步清零

elseqout=1;

end

語句6970[例]生成一個(gè)0延遲的無限循環(huán)跳變過程——形成仿真死鎖

alwaysareg=~areg;[例]在測試文件中,用于生成一個(gè)無限延續(xù)的信號波形——時(shí)鐘信號注2:always語句必須與一定的時(shí)序控制結(jié)合在一起才有用!如果沒有時(shí)序控制,則易形成仿真死鎖!‘definehalf_period50modulehalf_clk_top;regreset,clk;//輸入信號

wireclk_out;//輸出信號

always#half_periodclk=~clk;……endmodule 語句70always@(<敏感信號表達(dá)式>)

begin//過程賦值語句

//if語句

//case語句

//while,repeat,for循環(huán)

//task,function調(diào)用

end一般為輸入敏感信號表達(dá)式又稱事件表達(dá)式或敏感表,當(dāng)其值改變時(shí),則執(zhí)行一遍塊內(nèi)語句;在敏感信號表達(dá)式中應(yīng)列出影響塊內(nèi)取值的所有信號!

敏感信號可以為單個(gè)信號,也可為多個(gè)信號,中間需用關(guān)鍵字or連接!敏感信號不要為x或z,否則會阻擋進(jìn)程!always塊語句一個(gè)變量不能在多個(gè)always塊中被賦值!語句71always的時(shí)間控制可以為沿觸發(fā),也可為電平觸發(fā)。關(guān)鍵字posedge表示上升沿;negedge表示下降沿。always@(posedgeclockorposedgereset)begin……endalways@(aorborc)begin……end由兩個(gè)沿觸發(fā)的always塊由多個(gè)電平觸發(fā)的always塊語句7273always塊語句是用于綜合過程的最有用的語句之一,但又常常是不可綜合的。為得到最好的綜合結(jié)果,always塊程序應(yīng)嚴(yán)格按以下模板來編寫:模板1always@(Inputs)//所有輸入信號必須列出,用or隔開

begin

……//組合邏輯關(guān)系

end

模板2always@(Inputs)//所有輸入信號必須列出,用or隔開

if(Enable)

begin

……//鎖存動作

end

語句73模板3always@(posedgeClock)//Clockonly

begin

……//同步動作

end

模板4always@(posedgeClockornegedgeReset)//ClockandResetonly

begin

if(!Reset)//測試異步復(fù)位電平是否有效

……//異步動作

else……//同步動作

end//可產(chǎn)生觸發(fā)器和組合邏輯語句74當(dāng)always塊有多個(gè)敏感信號時(shí),一定要采用if-elseif語句,而不能采用并列的if語句!否則易造成一個(gè)寄存器有多個(gè)時(shí)鐘驅(qū)動,將出現(xiàn)編譯錯(cuò)誤。always@posedgemin_clkornegedgereset)

beginif(reset)min<=0;

elseif(min=8’h59)//當(dāng)reset無效且min=8’h59時(shí)

beginmin<=0;h_clk<=1;end

end

通常采用異步清零!只有在時(shí)鐘周期很小或清零信號為電平信號時(shí)采用同步清零。千萬別寫成if哦!語句75initial

begin

語句1;語句2;

……

語句n;

end格式

[例]利用initial語句生成激勵(lì)波形。

initialbegininputs=’b000000;#10inputs=’b011001;#10inputs=’b011011;#10inputs=’b011000;#10inputs=’b001000;end在仿真的初始狀態(tài)對各變量進(jìn)行初始化;在測試文件中生成激勵(lì)波形作為電路的仿真信號。語句initial語句76……parametersize=16;reg[3:0]addr;regreg1;reg[7:0]memory[0:15];initialbeginreg1=0;for(addr=0;addr<size;addr=addr+1);memory[addr]=0;end……[例]對各變量進(jìn)行初始化。語句77除module以外,Verilog還提供了任務(wù)(task)和函數(shù)(function)可重復(fù)調(diào)用定義和調(diào)用都包含在module內(nèi)部語句78 task和function語句分別用來由用戶定義任務(wù)和函數(shù)。

任務(wù)和函數(shù)往往是大的程序模塊中在不同地點(diǎn)多次用到的相同的程序段。

利用任務(wù)和函數(shù)可將一個(gè)很大的程序模塊分解為許多較小的任務(wù)和函數(shù),便于理解和調(diào)試。

輸入、輸出和總線信號的值可以傳入、傳出任務(wù)和函數(shù)。語句task和function語句79task任務(wù)名; //無需定義端口名列表

端口與類型說明; //調(diào)用時(shí)按順序和類型列出 局部變量說明; 塊語句endtask當(dāng)希望能夠?qū)σ恍┬盘栠M(jìn)行一些運(yùn)算并輸出多個(gè)結(jié)果(即有多個(gè)輸出變量)時(shí),宜采用任務(wù)結(jié)構(gòu)。常常利用任務(wù)來幫助實(shí)現(xiàn)結(jié)構(gòu)化的模塊設(shè)計(jì),將批量的操作以任務(wù)的形式獨(dú)立出來,使設(shè)計(jì)簡單明了。

語句<任務(wù)名>(端口1,端口2,……);80…..always@(posedgesys_clk)beginif(read_request==1)beginread_mem(IR,PC); //Eventandfunctioncalls endendtaskread_mem;output[15:0]data_in;input[15:0]addr;always@(posedgeread_grant)begin ADDRESS=addr; #15data_in=data;endendtask…….語句注1:任務(wù)的定義與調(diào)用必須在一個(gè)module模塊內(nèi)!注2:任務(wù)被調(diào)用時(shí),需列出端口名列表,

且必須與任務(wù)定義中的I/O變量一一對應(yīng)!注3:一個(gè)任務(wù)可以調(diào)用其他任務(wù)和函數(shù)。81[例]通過任務(wù)調(diào)用完成4個(gè)4位二進(jìn)制輸入數(shù)據(jù)的冒泡排序。

任務(wù)的定義任務(wù)的調(diào)用82function函數(shù)的目的是通過返回一個(gè)用于某表達(dá)式的值,來響應(yīng)輸入信號。適于對不同變量采取同一運(yùn)算的操作。函數(shù)在模塊內(nèi)部定義,通常在本模塊中調(diào)用,也能根據(jù)按模塊層次分級命名的函數(shù)名從其他模塊調(diào)用。而任務(wù)只能在同一模塊內(nèi)定義與調(diào)用!語句83語句Function

function<位寬>函數(shù)名;

輸入端口與類型說明;

局部變量說明;

塊語句

endfiction注意:1.函數(shù)不能調(diào)用任務(wù),任務(wù)可調(diào)用任何其他函數(shù)和任務(wù)

2.函數(shù)只有輸入變量且至少一個(gè)

3.函數(shù)定義的塊語句不許出現(xiàn)定時(shí)控制

4.函數(shù)通過函數(shù)名返回一個(gè)值缺省則返回1位reg型數(shù)據(jù)<函數(shù)名>(<表達(dá)式><表達(dá)式>)與函數(shù)定義中的輸入變量對應(yīng)!84always@(posedgesys_clk)begin…..IR=swap_bits(IR);…..endfunction[15:0]swap_bits;input[15:0]in_vec;reg[15:0]temp_reg;integeri;beginfor(I=15;I>=0;I=I-1)temp_reg[15-i]=in_vec[i];swap_bits=temp_reg;endendfunctioin語句85語句

注1:函數(shù)的調(diào)用是通過將函數(shù)作為調(diào)用函數(shù)的表達(dá)式中的操作數(shù)來實(shí)現(xiàn)的!

注2:函數(shù)在綜合時(shí)被理解成具有獨(dú)立運(yùn)算功能的電路,每調(diào)用一次函數(shù),相當(dāng)于改變此電路的輸入,以得到相應(yīng)的計(jì)算結(jié)果。86函數(shù)的使用規(guī)則函數(shù)的定義不能包含任何時(shí)間控制語句——用延遲#、事件控制@或等待wait標(biāo)識的語句。函數(shù)不能啟動(即調(diào)用)任務(wù)!定義函數(shù)時(shí)至少要有一個(gè)輸入?yún)⒘?!且不能有任何輸出或輸?輸出雙向變量。在函數(shù)的定義中必須有一條賦值語句,給函數(shù)中的一個(gè)內(nèi)部寄存器賦以函數(shù)的結(jié)果值,該內(nèi)部寄存器與函數(shù)同名。語句87[例]利用函數(shù)對一個(gè)8位二進(jìn)制數(shù)中為0的位進(jìn)行計(jì)數(shù)。只有輸入變量內(nèi)部寄存器對應(yīng)函數(shù)的輸入變量語句88任務(wù)(task)函數(shù)(function)目的或用途可計(jì)算多個(gè)結(jié)果值通過返回一個(gè)值,來響應(yīng)輸入信號輸入與輸出可為各種類型(包括inout型)至少有一個(gè)輸入變量,但不能有任何output或inout型變量被調(diào)用只可在過程賦值語句中調(diào)用,不能在連續(xù)賦值語句中調(diào)用可作為表達(dá)式中的一個(gè)操作數(shù)來調(diào)用,在過程賦值和連續(xù)賦值語句中均可調(diào)用調(diào)用其他任務(wù)和函數(shù)任務(wù)可調(diào)用其他任務(wù)和函數(shù)函數(shù)可調(diào)用其他函數(shù),但不可調(diào)用其他任務(wù)返回值不向表達(dá)式返回值向調(diào)用它的表達(dá)式返回一個(gè)值任務(wù)與函數(shù)的區(qū)別語句89語句

“編譯預(yù)處理”是VerilogHDL編譯系統(tǒng)的一個(gè)組成部分。編譯預(yù)處理語句以西文符號“‵”開頭——注意,不是單引號“’”!

在編譯時(shí),編譯系統(tǒng)先對編譯預(yù)處理語句進(jìn)行預(yù)處理,然后將處理結(jié)果和源程序一起進(jìn)行編譯。90‵define語句

宏定義語句——用一個(gè)指定的標(biāo)志符(即宏名)來代表一個(gè)字符串(即宏內(nèi)容)。宏定義的作用:以一個(gè)簡單的名字代替一個(gè)長的字符串或復(fù)雜表達(dá)式;以一個(gè)有含義的名字代替沒有含義的數(shù)字和符號。‵define

標(biāo)志符(即宏名)字符串(即宏內(nèi)容)[例]‵defineINina+inb+inc+ind宏展開——在編譯預(yù)處理時(shí)將宏名替換為字符串的過程。語句91關(guān)于宏定義的說明宏名可以用大寫字母,也可用小寫字母表示;但建議用大寫字母,以與變量名相區(qū)別。‵define語句可以寫在模塊定義的外面或里面。宏名的有效范圍為定義命令之后到源文件結(jié)束。在引用已定義的宏名時(shí),必須在其前面加上符號“‵”!使用宏名代替一個(gè)字符串,可簡化書寫,便于記憶,易于修改。語句92關(guān)于宏定義的說明預(yù)處理時(shí)只是將程序中的宏名替換為字符串,不管含義是否正確。只有在編譯宏展開后的源程序時(shí)才報(bào)錯(cuò)。宏名和宏內(nèi)容必須在同一行中進(jìn)行聲明!宏定義不是VerilogHDL語句,不必在行末加分號!如果加了分號,會連分號一起置換!語句93[例]moduletest;rega,b,c,d,e,out;‵defineexpressiona+b+c+d;assignout=‵expression+e;……經(jīng)過宏展開后,assign語句為:

assignout=a+b+c+d;+e;//出現(xiàn)語法錯(cuò)誤!錯(cuò)誤!語句94[例]moduletest;rega,b,c;wireout;‵defineaaa+b

‵defineccc+‵aa//引用已定義的宏名‵aa來定義宏ccassignout=‵cc;……經(jīng)過宏展開后,assign語句為:

assignout=c+a+b;語句在進(jìn)行宏定義時(shí),可引用已定義的宏名,實(shí)現(xiàn)層層置換。95文件包含語句——一個(gè)源文件可將另一個(gè)源文件的全部內(nèi)容包含進(jìn)來。‵include

“文件名”預(yù)處理后‵include

“file2.v”Afile1.vBfile2.vABfile1.v將file2.v中全部內(nèi)容復(fù)制插入到‵include“file2.v”命令出現(xiàn)的地方格式語句‵include語句96使用‵include語句的好處

避免程序設(shè)計(jì)人員的重復(fù)勞動!不必將源代碼復(fù)制到自己的另一源文件中,使源文件顯得簡潔。(1)可以將一些常用的宏定義命令或任務(wù)(task)組成一個(gè)文件,然后用‵include語句將該文件包含到自己的另一源文件中,相當(dāng)于將工業(yè)上的標(biāo)準(zhǔn)元件拿來使用。(2)當(dāng)某幾個(gè)源文件經(jīng)常需要被其他源文件調(diào)用時(shí),則在其他源文件中用‵include語句將所需源文件包含進(jìn)來。

語句97[例]用‵include語句設(shè)計(jì)16位加法器adder模塊位拼接改變被引用模塊adder中的參數(shù)size為my_size98一個(gè)‵include語句只能指定一個(gè)被包含的文件;若要包含n個(gè)文件,需用n個(gè)‵include語句。‵include語句可出現(xiàn)在源程序的任何地方。被包含的文件若與包含文件不在同一子目錄下,必須指明其路徑!‵include“aaa.v”

“bbb.v”

//非法!‵include“parts/count.v”

//合法!‵include“aaa.v”

‵include“bbb.v”

//合法!語句99可將多個(gè)‵include語句寫在一行;在該行中,只可出現(xiàn)空格和注釋行。文件包含允許嵌套。‵include“aaa.v”

‵include“bbb.v”

//合法!‵include

“file2.v”………………file1.v‵include

“file3.v”………………file2.v(不包含‵include命令)………………file3.v語句100時(shí)間尺度語句——用于定義跟在該命令后模塊的時(shí)間單位和時(shí)間精度。‵timescale<時(shí)間單位>/<時(shí)間精度>時(shí)間單位——用于定義模塊中仿真時(shí)間和延遲時(shí)間的基準(zhǔn)單位;時(shí)間精度——用來聲明該模塊的仿真時(shí)間和延遲時(shí)間的精確程度。在同一程序設(shè)計(jì)里,可以包含采用不同時(shí)間單位的模塊。此時(shí)用最小的時(shí)間精度值決定仿真的時(shí)間單位。格式語句‵timescale語句101‵timescale1ps/1ns//非法!‵timescale1ns/1ps//合法!時(shí)間精度至少要和時(shí)間單位一樣精確,時(shí)間精度值不能大于時(shí)間單位值!在‵timescale語句中,用來說明時(shí)間單位和時(shí)間精度參量值的數(shù)字必須是整數(shù)。其有效數(shù)字為1、10、100;單位為秒(s)、毫秒(ms)、微秒(us)、納秒(ns)、皮秒(ps)、毫皮秒(fs)。語句102[例]‵timescale語句應(yīng)用舉例。‵timescale10ns/1ns//時(shí)間單位為10ns,時(shí)間精度為1ns……regsel;

initialbegin#10sel=0;//在10ns10時(shí)刻,sel變量被賦值為0#10sel=1;//在10ns20時(shí)刻,sel變量被賦值為1end……語句103語句的順序執(zhí)行:(1)在

“always”模塊內(nèi),邏輯按書寫的順序執(zhí)行。(2)順序語句——“always”模塊內(nèi)的語句。(3)在“always”模塊內(nèi),若隨意顛倒賦值語句的書寫順序,可能導(dǎo)致不同的結(jié)果?。ㄒ奫例3.11.1]、[例3.11.2])。(4)注意阻塞賦值語句當(dāng)本語句結(jié)束時(shí)即完成賦值操作!語句104105[例]順序執(zhí)行模塊1。moduleserial1(q,a,clk);outputq,a;inputclk;regq,a;always@(posedgeclk)begin

q=~q;//阻塞賦值語句

a=~q;endendmodule[例]順序執(zhí)行模塊2。moduleserial2(q,a,clk);outputq,a;inputclk;regq,a;always@(posedgeclk)begin

a=~q;

q=~q;endendmodule對前一時(shí)刻的q值取反對當(dāng)前時(shí)刻的q值取反對前一時(shí)刻的q值取反對前一時(shí)刻的q值取反a和q的波形反相!a和q的波形完全相同!語句105語句的并行執(zhí)行:(1)“always”模塊、“assign”語句、實(shí)例元件都是同時(shí)(即并行)執(zhí)行的?。?)它們在程序中的先后順序?qū)Y(jié)果并沒有影響。(3)將兩條賦值語句分別放在兩個(gè)“always”模塊中,盡管兩個(gè)“always”模塊順序相反,但仿真波形完全相同。語句106[例]并行執(zhí)行模塊1。moduleparall1(q,a,clk);outputq,a;inputclk;regq,a;always@(posedgeclk)begin

q=~q;

endalways@(posedgeclk)begin

a=~q;

endendmodule[例]并行執(zhí)行模塊2。moduleparall2(q,a,clk);outputq,a;inputclk;regq,a;always@(posedgeclk)begin

a=~q;endalways@(posedgeclk)begin

q=~q;

endendmodule語句107(1)把設(shè)計(jì)分割成較小的功能塊,每塊用行為風(fēng)格設(shè)計(jì)。除設(shè)計(jì)中對速度響應(yīng)要求比較臨界的部分外,都應(yīng)避免門級描述。(2)建立一個(gè)好的時(shí)鐘策略(如單時(shí)鐘、多相位時(shí)鐘,經(jīng)過門產(chǎn)生的時(shí)鐘、多時(shí)鐘域等)。保證源代碼中時(shí)鐘和復(fù)位信號是干凈的(即不是由組合邏輯或沒有考慮到的門產(chǎn)生的)。綜合代碼的編寫標(biāo)準(zhǔn)綜合:將用HDL語言或圖形方式描述的電路設(shè)計(jì)轉(zhuǎn)換為實(shí)際門級電路(如觸發(fā)器、邏輯門等),得到一個(gè)網(wǎng)表文件,用于進(jìn)行適配(在實(shí)際器件中進(jìn)行布局和布線)。108(3)建立一個(gè)好的測試策略,使所有觸發(fā)器都是可復(fù)位的,使測試能通過外部管腳進(jìn)行,又沒有冗余的功能。(4)所有源代碼都必須遵守并符合在always塊語句的4種可綜合標(biāo)準(zhǔn)模板之一。(5)描述組合和鎖存邏輯的always塊,必須在always塊開頭的控制事件列表中列出所有的輸入信號。綜合代碼的編寫標(biāo)準(zhǔn)109(6)描述組合邏輯的always塊,一定不能有不完全賦值,即所有輸出變量必須被各輸入值的組合值賦值,不能有例外。(7)描述組合和鎖存邏輯的always塊一定不能包含反饋,即在always塊中已被定義為輸出的寄存器變量絕對不能再在該always塊中讀進(jìn)來作為輸入信號。綜合代碼的編寫標(biāo)準(zhǔn)110(8)時(shí)鐘沿觸發(fā)的always塊必須是單時(shí)鐘的,且任何異步控制輸入(通常是復(fù)位或置位信號)必須在控制事件列表中列出。例:always@(posedgeclkornegedgesetornegedgereset)(9)避免生成不想要的鎖存器。在無時(shí)鐘的always塊中,若有的輸出變量被賦了某個(gè)信號變量值,而該信號變量并未在該always塊的電平敏感控制事件中列出,則會在綜合中生成不想要的鎖存器。綜合代碼的編寫標(biāo)準(zhǔn)111(10)避免生成不想要的觸發(fā)器。在時(shí)鐘沿觸發(fā)的always塊中,如果用非阻塞賦值語句對reg型變量賦值;或者當(dāng)reg型變量經(jīng)過多次循環(huán)其值仍保持不變,則會在綜合中生成觸發(fā)器。用reg型變量生成觸發(fā)器舉例:

modulerw2(clk,d,out1);

inputclk,d;

outputout1;

regout1;

always@(posedgeclk)//沿觸發(fā)

out1<=d;

endmodule

非阻塞賦值語句dclkout1DQDFF綜合代碼的編寫標(biāo)準(zhǔn)112若不想生成觸發(fā)器,而是希望用reg型變量生成組合邏輯,則應(yīng)使用電平觸發(fā):

modulerw2(clk,d,out1);

inputclk,d;

outputout1;

regout1;

always@(d)//電平觸發(fā)

out1<=d;endmodule

dout1BUFF綜合代碼的編寫標(biāo)準(zhǔn)113(11)所有內(nèi)部狀態(tài)寄存器必須是可復(fù)位的,這是為了使RTL級和門級描述能夠被復(fù)位成同一個(gè)已知的狀態(tài),以便進(jìn)行門級邏輯驗(yàn)證。(12)對存在無效狀態(tài)的有限狀態(tài)機(jī)和其他時(shí)序電路(如4位十進(jìn)制計(jì)數(shù)器有6個(gè)無效狀態(tài)),必須明確描述所有的2的N次冪種狀態(tài)下的行為(包括無效狀態(tài)),才能綜合出安全可靠的狀態(tài)機(jī)。綜合代碼的編寫標(biāo)準(zhǔn)114(13)一般地,在賦值語句中不能使用延遲,否則是不可綜合的。(14)不要使用integer型和time型寄存器,否則將分別綜合成32位和64位的總線。(15)仔細(xì)檢查代碼中使用動態(tài)指針(如用指針或地址變量檢索的位選擇或存儲單元)、循環(huán)聲明或算術(shù)運(yùn)算部分,因?yàn)檫@類代碼在綜合后會生成大量的門,且難以優(yōu)化。綜合代碼的編寫標(biāo)準(zhǔn)115Verilog不同抽象級別

一個(gè)復(fù)雜電路的完整VerilogHDL模型由若干個(gè)VerilogHDL模塊構(gòu)成,每個(gè)模塊由若干的子模塊構(gòu)成——可分別用不同抽象級別的VerilogHDL描述。116Verilog不同抽象級別在同一個(gè)VerilogHDL模塊中可有多種級別的描述。系統(tǒng)級(systemlevel):用高級語言結(jié)構(gòu)(如case語句)實(shí)現(xiàn)的設(shè)計(jì)模塊外部性能的模型;算法級(algorithmiclevel):用高級語言結(jié)構(gòu)實(shí)現(xiàn)的設(shè)計(jì)算法模型(寫出邏輯表達(dá)式);RTL級(registertransferlevel):描述數(shù)據(jù)在寄存器之間流動和如何處理這些數(shù)據(jù)的模型;門級(gatelevel):描述邏輯門(如與門、非門、或門、與非門、三態(tài)門等)以及邏輯門之間連接的模型;開關(guān)級(switchlevel):描述器件中三極管和儲存節(jié)點(diǎn)及其之間連接的模型。117Verilog不同抽象級別電路描述行為級描述:側(cè)重對模塊行為功能的抽象描述結(jié)構(gòu)級描述:側(cè)重對模塊內(nèi)部結(jié)構(gòu)實(shí)現(xiàn)的具體描述行為級模塊描述由多個(gè)并行運(yùn)行的過程塊組成過程塊由過程語句(initial與always)和塊語句(串行塊begin-end與并行塊fork-join)組成塊語句由過程賦值語句和高級程序語句構(gòu)成過程賦值語句:阻塞與非阻塞式賦值高級程序語句:if-else、case、while、wait……包括系統(tǒng)級,算法級,RTL級1181.邏輯功能描述——算法級注:首先必須根據(jù)邏輯功能寫出邏輯表達(dá)式![例]用邏輯表達(dá)式實(shí)現(xiàn)4選1數(shù)據(jù)選擇器modulemux4_1(out,in1,in2,in3,in4,cntrl1,cntrl2);outputout;inputin

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論