版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
7.1任務(wù)和函數(shù)
在行為級設(shè)計中,經(jīng)常需要在程序的多個不同地方實現(xiàn)同樣的功能。這表明有必要把這些公共的部分提取出來,將其組成子程序,然后在需要的地方調(diào)用這些子程序,以避免重復(fù)編碼。絕大多數(shù)程序設(shè)計語言都提供了過程或子程序來達(dá)到這個目的。同樣,verilog語言提供的任務(wù)和函數(shù)可以將較大的行為級設(shè)計劃分為較小的代碼段,允許verilog設(shè)計者將在多個地方位用的相同代碼提取出來,編寫成任務(wù)和函數(shù)。
任務(wù)(task)通常用于調(diào)試,或?qū)τ布M(jìn)行行為描述可以包含時序控制(#延遲,@,wait)可以有input,output,和inout參數(shù)可以調(diào)用其他任務(wù)或函數(shù)函數(shù)(function)通常用于計算,或描述組合邏輯不能包含任何延遲;函數(shù)仿真時間為0只含有input參數(shù)并由函數(shù)名返回一個結(jié)果可以調(diào)用其他函數(shù),但不能調(diào)用任務(wù)1.任務(wù)與函數(shù)的區(qū)別和聯(lián)系區(qū)別任務(wù)和函數(shù)必須在module內(nèi)調(diào)用在任務(wù)和函數(shù)中不能聲明wire所有輸入/輸出都是局部寄存器任務(wù)/函數(shù)執(zhí)行完成后才返回結(jié)果。
例如,若任務(wù)/函數(shù)中有forever語句,則永遠(yuǎn)不會返回結(jié)果共同點2.任務(wù)使用task和endtask來聲明含有延遲、時序或事件控制結(jié)構(gòu)沒有輸出或輸出變量數(shù)目大于1沒有輸入變量moduletop;regclk,a,b;DUTu1(out,a,b,clk);always#5clk=!clk;
taskneg_clocks;
input[31:0]number_of_edges;
repeat(number_of_edges)@(negedgeclk);
endtaskinitialbeginclk=0;a=1;b=1;
neg_clocks(3);//任務(wù)調(diào)用
a=0;
neg_clocks(5);b=0;endendmodule滿足以上三點的,一般用任務(wù)而不用函數(shù)
任務(wù)中含有時序控制和一個輸入,并引用了一個module變量,但沒有輸出、輸入輸出和內(nèi)部變量,也不顯示任何結(jié)果。時序控制中使用的信號(例如clk)一定不能作為任務(wù)的輸入,因為輸入值只向該任務(wù)傳送一次。任務(wù)可以有input,output
和inout參數(shù)。傳送到任務(wù)的參數(shù)和與任務(wù)I/O說明順序相同。盡管傳送到任務(wù)的參數(shù)名稱與任務(wù)內(nèi)部I/O說明的名字可以相同,但在實際中這通常不是一個好的方法。參數(shù)名的唯一性可以使任務(wù)具有好的模塊性??梢栽谌蝿?wù)內(nèi)使用時序控制。在Verilog中任務(wù)定義一個新范圍(scope)要禁止任務(wù),使用關(guān)鍵字disable
。主要特點:
從代碼中多處調(diào)用任務(wù)時要小心。因為任務(wù)的局部變量的只有一個拷貝,并行調(diào)用任務(wù)可能導(dǎo)致錯誤的結(jié)果。在任務(wù)中使用時序控制時這種情況時常發(fā)生。
在任務(wù)或函數(shù)中引用調(diào)用模塊的變量時要小心。如果想使任務(wù)或函數(shù)能從另一個模塊調(diào)用,則所有在任務(wù)或函數(shù)內(nèi)部用到的變量都必須列在端口列表中。
下面的任務(wù)中有輸入,輸出,時序控制和一個內(nèi)部變量,并且引用了一個module變量。但沒有雙向端口,也沒有顯示。任務(wù)調(diào)用時的參數(shù)按任務(wù)定義的順序列出。modulemult(clk,a,b,out,en_mult);
inputclk,en_mult;
input[3:0]a,b;
output[7:0]out;
reg[7:0]out;
always@(posedgeclk)multme(a,b,out);//任務(wù)調(diào)用
task
multme;//任務(wù)定義
input
[3:0]xme,tome;
output
[7:0]result;
wait
(en_mult)
result=xme*tome;
endtaskendmodule自動任務(wù)任務(wù)在本質(zhì)上是靜態(tài)的,任務(wù)中的所有聲明項的地址空間是靜態(tài)分配的。因此,如果這個任務(wù)在模塊中的兩個地方被同時調(diào)用,則這兩個任務(wù)調(diào)用將對同一塊地址空間進(jìn)行操作。操作的結(jié)果很有可能是錯誤的。為了避免這個問題,verilog通過在task關(guān)鍵字前面添加關(guān)鍵字automatic,使任務(wù)成為可重入的,這樣聲明的任務(wù)也稱為自動任務(wù),每次調(diào)用時,在動態(tài)任務(wù)中聲明的所有模塊項的存儲空間都是動態(tài)分配的,每個調(diào)用都對各自獨立的地址空間進(jìn)行操作。這樣.每個任務(wù)調(diào)用只對自己所擁有的獨立變量副本進(jìn)行操作.因此可以得到正確的執(zhí)行結(jié)果。所以,如果某一任務(wù)有可能在程序代碼的兩處被同時調(diào)用,我們建議讀者最好使用自動任務(wù)。moduletop;reg[15:0]cd_xor,ef_xor;
reg[15:0]c,d,e,f;task
automaticbitwise_xor;//任務(wù)定義
output
[15:0]ab_xor;input
[15:0]a,b;begin
#delayab_and=a&b;
ab_or=a|b;ab_xor=a^b;
endendtaskalways@(posedgeclk)bitwise_xor(ef_xor,e,f);always@(posedgeclk2)bitwise_xor(cd_xor,c,d);endmodule自動任務(wù)3.函數(shù)(function)以關(guān)鍵詞function和endfunction聲明函數(shù)內(nèi)不含延遲、時序或事件控制結(jié)構(gòu)moduleorand(a,b,c,d,e,out);
input[7:0]a,b,c,d,e;
output[7:0]out;
reg
[7:0]out;
always@(aorborcordore)out=f_or_and(a,b,c,d,e);//函數(shù)調(diào)用
function[7:0]f_or_and;
input[7:0]a,b,c,d,e;
if(e==1)f_or_and=(a|b)&(c|d);
elsef_or_and=0;
endfunctionendmodule只有一個返回值至少有一個輸入變量沒有輸出變量不含有非阻塞賦值語句主要特性:函數(shù)定義中不能包含任何時序控制語句。函數(shù)至少有一個輸入,不能包含任何輸出或雙向端口。函數(shù)只返回一個數(shù)據(jù),其缺省為reg類型。傳送到函數(shù)的參數(shù)順序和函數(shù)輸入?yún)?shù)的說明順序相同。函數(shù)在模塊(module)內(nèi)部定義。函數(shù)不能調(diào)用任務(wù),但任務(wù)可以調(diào)用函數(shù)。函數(shù)在Verilog中定義了一個新的范圍(scope)。雖然函數(shù)只返回單個值,但返回的值可以直接給信號連接賦值。這在需要有多個輸出時非常有效。
{o1,o2,o3,o4}=f_or_and(a,b,c,d,e);
要返回一個向量值(多于一位),在函數(shù)定義時在函數(shù)名前說明范圍。函數(shù)中需要多條語句時用begin和end。不管在函數(shù)內(nèi)對函數(shù)名進(jìn)行多少次賦值,值只返回一次。下例中,函數(shù)還在內(nèi)部聲明了一個整數(shù)。modulefoo;input[7:0]loo;
output[7:0]goo;//可以持續(xù)賦值中調(diào)用函數(shù)
wire[7:0]goo=zero_count(loo);
function
[3:0]
zero_count;
input[7:0]in_bus;
integerI;
begin
zero_count=0;
for(I=0;I<8;I=I+1)
if(!in_bus[I])
zero_count
=zero_count+1;
end
endfunctionendmodule函數(shù)返回值可以聲明為其它register類型:integer,real,或time。在任何表達(dá)式中都可調(diào)用函數(shù)modulechecksub(neg,a,b);outputneg;regneg;inputa,b;
function
integer
subtr;
input[7:0]in_a,in_b;
subtr=in_a-in_b;//結(jié)果可能為負(fù)
endfunction
always@(aorb)
if(subtr(a,b)<0)neg=1;
elseneg=0;endmodule函數(shù)中可以對返回值的個別位進(jìn)行賦值。函數(shù)值的位數(shù)、函數(shù)端口甚至函數(shù)功能都可以參數(shù)化。...parameterMAX_BITS=8;reg[MAX_BITS:1]D;function
[MAX_BITS:1]
reverse_bits;
input[MAX_BITS-1:0]data;
integerK;for(K=0;K<MAX_BITS;K=K+1)
reverse_bits[MAX_BITS-(K+1)]=data[K];endfunctionalways@(posedgeclk)D=reverse_bits(D);...a.遞歸函數(shù)verilog中的函數(shù)是不能進(jìn)行遞歸調(diào)用的;若在函數(shù)聲明時使用了關(guān)鍵字automatic,那么該函數(shù)將成為自動的或可遞歸的.moduletop;function
automatic
integerfactorial;
input[31:0]oper;
integerI;beginif(oper>=2)factorial=factorial[oper-1]*oper;elsefactorial=1;endendfunction
integerresult;initialbegin
result=factorial(4);endendmoduleb.常量函數(shù)
常量函數(shù)實際上是一個帶有某些限制的常規(guī)verilog函數(shù)。這種函數(shù)能夠用來引用復(fù)雜的值,因此可用來代替常量。moduleram(….);parameterram_depth=256;input[clogb2(ram_depth)-1:0]addr_bus;function
integerclogb2(inputintegerdepth);
beginfor(clogb2=0;depth>0;clogb2=clogb2+1)depth=depth>>1;endendfunctionendmodule
c.帶符號函數(shù)返回值可以作為帶符號數(shù)進(jìn)行運算moduletop;
function
signed
[63:0]compute_signed
(input[63:0]vector);
……..…….
endfunction
if(compute_signed(vector)<-3)begin…..endendmodule7.2電路級建模Verilog沒有描述模擬電路的功能,可以描述mos晶體管,但晶體管僅被當(dāng)作開關(guān)來描述,即只有導(dǎo)通和截止?fàn)顟B(tài)。1.MOS開關(guān)以關(guān)鍵詞nmos用于NMOS晶體管建模以關(guān)鍵詞pmos用于PMOS晶體管建模
因為開關(guān)是用verilog原語定義的,類似于邏輯門,實例名稱是可選頂,所以調(diào)用實例引用開關(guān)時可以不給出實例名稱。//實例名引用nmosn1(out,data,control);pmos
p1(out,data,control);//無實例名引用nmos
(out,data,control);pmos
(out,data,control);
信號out的值由信號data和control值確定。out的邏輯值如表所示。信號data和cotrol的不同組合導(dǎo)致這兩個開關(guān)輸出1,0或者z或x.邏輯值(如果不能確定輸出為1或.就有可能輸出z值或x值)。符號L代表0或z,H代表1或z;2.CMOS開關(guān)以關(guān)鍵詞cmos用于CMOS晶體管建模//實例名引用cmosc1(out,data,ncontrol,pcontrol);cmos
(out,data,ncontrol,pcontrol);
信號ncontrol和pcontrol通常是互補(bǔ)的。當(dāng)信號ncontrol為1且pcontrol信號為0時,開關(guān)導(dǎo)通。如果信號ncontrol為0且pcontrol為1,則開關(guān)的輸出為高阻值。CMOSE本質(zhì)上是兩個開關(guān)(NMOS和PMOS)的組合體。//無實例名引用nmos
(out,data,ncontrol);pmos
(out,data,pcontrol);3.雙向開關(guān)NMOS,PMOS和CMOS門都是從漏極向源極導(dǎo)通,是單向的。在數(shù)字電路中,雙向?qū)ǖ钠骷苤匾?。對雙向?qū)ǖ钠骷裕鋬蛇叺男盘柖伎梢允球?qū)動信號。通過設(shè)計雙向開關(guān)就可以實現(xiàn)雙向?qū)ǖ钠骷?。有三個關(guān)鍵字用來定義雙向開關(guān):tran,tranif0和tranif1。
tran開關(guān)作為兩個信號inout1和inout2之間的緩存,inout1或inout2都可以是驅(qū)動信號。僅當(dāng)control信號是邏輯0時,開關(guān)tranif0連接inout1和inout2兩個信號。如果control信號為1,則沒有驅(qū)動源的信號取高阻態(tài)值z,有驅(qū)動源的信號仍然從驅(qū)動源取值。//實例名引用tran
t1(inout1,inout2);tranif0(inout1,inout2,control);tranif1(inout1,inout2,control);4.電源和地以關(guān)鍵詞supply1用于表示源極類型,相當(dāng)于電路中的VDD,代表邏輯1以關(guān)鍵詞supply0用于表示地極類型,相當(dāng)于電路中的VSS或GND,代表邏輯0supply1vdd;supply0gnd;assigna=vdd;assignb=gnd;5.阻抗開關(guān)比一般的開關(guān)具有更高的源極到漏極阻抗在一般開關(guān)的關(guān)鍵詞前面加r聲明阻抗開關(guān)在傳輸信號時減小了信號的強(qiáng)度關(guān)鍵詞rnmos
rpmos
rcmosrtranrtranif1rtranif06.設(shè)計實例a.cmos或非門modulemy_nor(out,a,b);outputout;inputa,b;wirec;supply1pwr;supply0gnd;pmos(c,pwr,b);pmos(out,c,a);nmos(out,gnd,a);nmos(out,gnd,b);endmodule
b.cmos反相器modulemy_not(out,in);outputout;inputin;supply1pwr;supply0gnd;pmos(out,pwr,in);nmos(out,gnd,in);endmodule7.3UDP用戶自定義原語學(xué)習(xí)如何使用用戶定義基本單元進(jìn)行邏輯設(shè)計組合邏輯UDP設(shè)計時序邏輯UDP設(shè)計1.術(shù)語及定義UDP:userdefinedprimitive,用戶自定義原語,其行為和Verilog內(nèi)部的原語相似。其功能用真值表定義。UDP有兩類:表示組合邏輯的UDP,輸出僅取決于輸入信號的組合邏輯。表示時序邏輯的UDP。下一個輸出值不但取決于當(dāng)前的輸入值,還取決于當(dāng)前的內(nèi)部狀態(tài)。在Verilog結(jié)構(gòu)描述中,可以使用:二十多個內(nèi)部門級基本單元用戶自定義基本單元UDP在ASIC庫單元開發(fā)、中小型芯片設(shè)計中很有用可以使用UDP擴(kuò)充已定義的基本單元集UDP是自包容的,也就是不需要實例化其它模塊UDP可以表示時序元件和組合元件UDP的行為由真值表表示UDP實例化與基本單元實例化相同可以使用UDP擴(kuò)充已定義的基本單元集UDP是一種非常緊湊的邏輯表示方法。UDP可以減少消極(pessimism)因素,因為一個input上的x不會像基本單元那樣自動傳送到output。一個UDP可以替代多個基本單元構(gòu)成的邏輯,因此可以大幅減少仿真時間和存儲需求。相同邏輯的行為級模型甚至可以更快,這取決于仿真器。UDP的特點UDP只能有一個輸出如果在功能上要求有多個輸出,則需要在UDP輸出端連接其它的基本單元,或者同時使用幾個UDP。
UDP可以有1到10個輸入若輸入端口超過5,存儲需求會大幅增加。下表列出輸入端口數(shù)與存儲需求的關(guān)系。所有端口必須為標(biāo)量且不允許雙向端口不支持邏輯值Z輸出端口必須列為端口列表的第一個時序UDP輸出端可以用initial語句初始化為一個確定值。UDP不可綜合#輸入存儲器(KB)#輸入存儲器(KB)1-51856659187717106232.語法定義primitive
<udp名稱>(<輸出端口名>,<輸入端口名>);//端口說明語句output<輸出端口名>;input<輸入端口名>;reg
<輸出端口名>;(可選,只有在表示時序邏輯的udp才需要)//udp初始化(只有時序邏輯才需要)Initial<輸出端口名>=<值>//udp狀態(tài)表table<狀態(tài)表>endtableendprimitive這兩行用于減少消極因素。表示若a,b有相同邏輯值,即使sel=x,o也輸出與a,b相同的值。Verilog內(nèi)部基本單元不能描述這種行為。UDP將X作為真實世界的未知值(0或1),而不是Verilog值,描述也更為精確。這兩行表示不管a為何值,若s為o,o輸出b值3.組合邏輯UDPUDP在模塊(module)外部定義。沒有在真值表中說明的輸入組合,輸出X。真值表中輸入信號按端口列表順序給出。primitive
multiplexer(o,a,b,s);outputo;inputs,a,b;
table//abs:o0?1:0;1?1:1;?00:0;?10:1;00x:0;11x:1;
endtableendprimitiveUDP名稱輸出端口真值表中?表示的邏輯值為:0、1或x這兩行表示不管b為何值,若s為1,o輸出a值舉例:2-1數(shù)據(jù)選擇器組合邏輯舉例2:全加器//FULLADDERCARRY-OUTTERMprimitiveU_ADDR2_C(CO,A,B,CI);
outputCO;
inputA,B,Ci;
table
//ABCI:CO11?:1; 1?1:1; ?11:1; 00?:0; 0?0:0; ?00:0;
endtableendprimitive全加器可以由兩個組合邏輯UDP實現(xiàn)//FULLADDERSUMTERMprimitive
U_ADDR2_S(S,A,B,CI);
outputS;
inputA,B,CI;
table//ABCI:S 000:0; 001:1; 010:1; 011:0; 100:1; 101:0; 110:0; 111:1;
endtableendprimitive4.時序邏輯電路鎖存器的行為如下:當(dāng)時鐘輸入為0時,data輸入的值傳送到輸出。當(dāng)時鐘輸入為1時,輸出不變。這種加電初始化在實際元件中很少見,但在UDP功能測試時很有用。primitive
latch(q,clock,data);
outputq;
reg
q;
inputclock,data;
initialq=1'b1;
table//clockdatacurrentnext//statestate01:?:1;00:?:0;1?:?:-;
endtableendprimitive輸出必須聲明為reg以保存前一狀態(tài)時序UDP初始化語句,將輸出初始化為1輸入及當(dāng)前狀態(tài)中的?表示無關(guān)值用另一個場表示下一狀態(tài)‘-’狀態(tài)值表示輸出沒有變化舉例1:鎖存器latch舉例2:D觸發(fā)器在任何一個真值表入口語句中只能說明一個輸入跳變。如果說明了任何輸入跳變,則必須說明所有輸入上的所有跳變。primitive
d_edge_ff(q,clk,data);outputq;
inputclk,data;regq;table//clkdatstatenext (01)0:?:0; (01)1:?:1; (0x)1:1:1; (0x)0:0:0; (x1)0:0:0; (x1)1:1:1;//忽略時鐘下降沿
(?0)?:?:-; (1x)?:?:-;//時鐘穩(wěn)定時忽略data變化
?(??):?:-;
endtableendprimitive表里有邊沿項表示輸入跳變。在一條入口語句中只能說明一個輸入跳變,因為Verilog仿真是基于事件,一次只允許一個事件發(fā)生。在每個時間步中,電平入口優(yōu)先于邊沿入口,因為電平最后處理。因此,下面的出口:
(?0)?:?:-;
可由下式取代:0?:?:-;
兩個都給出時,只有后者起作用
5.提高可讀性的簡寫形式Verilog中有一些符號可用于UDP真值表中以提高可讀性符號表示解釋-沒有變化時序元件輸出的下一個值與當(dāng)前值相同?0、1或x任何值b0或1任何確定值r(01)0->1跳變f(10)1->0跳變p(01)、(0x)或(x1)任何上升沿(posedge)n(10)、(1x)或(x0)任何下降沿(negedge)*(??)任何跳變提高可讀性的簡寫形式table//clkdatstatenext
r0:?:
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度戶外場地租用協(xié)議模板
- 文獻(xiàn)檢索考試題目之一
- 2024年物流配送服務(wù)協(xié)議匯編
- 2024年項目融資協(xié)議范本
- 2024屆安徽池州市東至二中高中畢業(yè)班階段性測試(二)數(shù)學(xué)試題
- 2024年度房地產(chǎn)經(jīng)紀(jì)服務(wù)協(xié)議模板
- 2024專業(yè)儲藏室轉(zhuǎn)讓協(xié)議格式
- 2024專業(yè)房產(chǎn)買賣協(xié)議法律認(rèn)證文件
- 2024年會計人員勞務(wù)協(xié)議樣本
- 城市便捷汽車租賃協(xié)議模板2024
- 農(nóng)業(yè)灌溉裝置市場環(huán)境與對策分析
- 統(tǒng)編版道德與法治初二上學(xué)期期中試卷及答案指導(dǎo)(2024年)
- 部編版小學(xué)五年級上冊道法課程綱要(知識清單)
- 職業(yè)技能等級認(rèn)定質(zhì)量控制及規(guī)章制度
- 山東省臨沂市(2024年-2025年小學(xué)四年級語文)人教版期中考試(上學(xué)期)試卷及答案
- 英大傳媒投資集團(tuán)限公司2024年應(yīng)屆畢業(yè)生招聘(第一批)高頻500題難、易錯點模擬試題附帶答案詳解
- 2024人教版道法七年級上冊第二單元:成長的時空大單元整體教學(xué)設(shè)計
- 肺脹(慢性阻塞性肺病)中醫(yī)優(yōu)勢病種診療方案
- 鐵路交通安全主題班會課件
- 數(shù)學(xué)蘇教版四年級(上冊)1、解決問題的策略 蘇教版(共13張)
- 2023-2024學(xué)年北京市某中學(xué)七年級上學(xué)期期中考試地理試卷(含詳解)
評論
0/150
提交評論