版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
西安郵電大學(xué)微電子系第四章行為建模隨著電路設(shè)計(jì)復(fù)雜度的不斷提升,我們需要從整體結(jié)構(gòu)和算法層次上對(duì)硬件電路進(jìn)行抽象和描述。這種描述是比數(shù)據(jù)流描述更高層級(jí)的描述,稱為行為級(jí)或算法級(jí)建模。行為級(jí)建模:4.1結(jié)構(gòu)化過程語(yǔ)句
initial和always是verilog中用于行為級(jí)建模的兩種基本語(yǔ)句,其他所有的行為語(yǔ)句只能出現(xiàn)在這兩種過程語(yǔ)句中。
每個(gè)initial和always語(yǔ)句代表一個(gè)獨(dú)立的(并發(fā))執(zhí)行過程。每個(gè)執(zhí)行過程從仿真時(shí)間0開始,并且這兩種語(yǔ)句不能嵌套使用。1、initial語(yǔ)句//initial語(yǔ)句的格式如下:initialbegin語(yǔ)句1;語(yǔ)句2;......語(yǔ)句n;end所有在initial語(yǔ)句內(nèi)的語(yǔ)句構(gòu)成了一個(gè)initial塊,initial塊從仿真0時(shí)刻開始執(zhí)行,在整個(gè)仿真過程中只執(zhí)行一次。如果模塊中包含多個(gè)initial塊,則這些initial塊各自獨(dú)立并發(fā)執(zhí)行。[例1]:initialbeginareg=0; //初始化寄存器aregmemory[index]=0;end在這個(gè)例子中用initial語(yǔ)句在仿真開始時(shí)對(duì)各變量進(jìn)行初始化。[例2]:initialbegininputs='b000000; //初始時(shí)刻為0#10inputs='b011001; #10inputs='b011011; #10inputs='b011000; #10inputs='b001000; end[例3]:
modulestimulus;
regx,y,a,b,m;initialm=1’b0;initialbegin#5a=1’b1;
#25b=1’b0;endinitialbegin#10x=1’b0;#25y=1’b1;endendmoduleinitial塊常用于測(cè)試文件和虛擬模塊的編寫,用來(lái)產(chǎn)生仿真測(cè)試信號(hào)和設(shè)置信號(hào)記錄等仿真環(huán)境。
2、always語(yǔ)句:其聲明格式如下:always<時(shí)序控制><語(yǔ)句>always語(yǔ)句包括的所有行為語(yǔ)句構(gòu)成了一個(gè)always塊。該塊從仿真0時(shí)刻開始順序執(zhí)行其中的語(yǔ)句。在仿真過程中不斷重復(fù)執(zhí)行的。
always語(yǔ)句由于其不斷重復(fù)執(zhí)行的特性,只有和一定的時(shí)序控制結(jié)合在一起才有用。如果一個(gè)always語(yǔ)句沒有時(shí)序控制,則這個(gè)always語(yǔ)句將會(huì)成為一個(gè)仿真死鎖。[例]:alwaysareg=~areg;
這個(gè)always語(yǔ)句將會(huì)生成一個(gè)0延遲的無(wú)限循環(huán)跳變過程,這時(shí)會(huì)發(fā)生仿真死鎖。
如果加上時(shí)序控制,則這個(gè)always語(yǔ)句將變?yōu)橐粭l非常有用的描述語(yǔ)句。見下例:
[例]:always#half_periodareg=~areg;這個(gè)例子生成了一個(gè)周期為:period(=2*half_period)的無(wú)限延續(xù)的信號(hào)波形,常用這種方法來(lái)描述時(shí)鐘信號(hào),作為激勵(lì)信號(hào)來(lái)測(cè)試所設(shè)計(jì)的電路。
Verilog提供三種時(shí)序控制方法:基于延遲的時(shí)序控制、基于事件的時(shí)序控制和電平敏感的時(shí)序控制。[例]:reg[7:0]counter;regtick;always@(posedgeareg)begintick<=~tick;counter<=counter+1;end這個(gè)例子中,每當(dāng)areg信號(hào)的上升沿出現(xiàn)時(shí)把tick信號(hào)反相,并且把counter增加1。這種時(shí)間控制是always語(yǔ)句最常用的。always的時(shí)序控制可以是沿觸發(fā)也可以是電平觸發(fā)的,可以單個(gè)信號(hào)也可以多個(gè)信號(hào),中間需要用關(guān)鍵字or連接,如:
always@(posedgeclockorposedgereset)//由兩個(gè)沿觸發(fā)的always塊
begin
……endalways@(aorborc)//由多個(gè)電平觸發(fā)的always塊
begin
……end沿觸發(fā)的always塊常常描述時(shí)序邏輯,如果符合可綜合風(fēng)格要求可用綜合工具自動(dòng)轉(zhuǎn)換為表示時(shí)序邏輯的寄存器組和門級(jí)邏輯,而電平觸發(fā)的always塊常常用來(lái)描述組合邏輯和鎖存器,如果符合可綜合風(fēng)格要求可轉(zhuǎn)換為表示組合邏輯的門級(jí)邏輯或鎖存器。一個(gè)模塊中可以有多個(gè)always塊,它們都是并行運(yùn)行的。
4.2賦值語(yǔ)句和塊語(yǔ)句1、過程賦值語(yǔ)句:過程賦值語(yǔ)句可以給寄存器、整數(shù)、時(shí)間變量賦值。連續(xù)賦值語(yǔ)句總是處于活動(dòng)狀態(tài),而過程賦值語(yǔ)句只有在執(zhí)行到的時(shí)候才會(huì)起作用。在VerilogHDL語(yǔ)言中,信號(hào)有兩種賦值方式:(1).非阻塞(Non_Blocking)賦值方式(如b<=a;)
1)它不會(huì)阻塞位于同一個(gè)順序塊中其后語(yǔ)句的執(zhí)行。同一順序塊中的語(yǔ)句并發(fā)執(zhí)行。2)
b的值并不是立刻就改變的,塊結(jié)束后才完成賦值操作。(2).阻塞(Blocking)賦值方式(如b=a;)1)順序塊中的阻塞賦值語(yǔ)句按順序執(zhí)行,它不會(huì)阻塞其后并行塊中語(yǔ)句的執(zhí)行。語(yǔ)句執(zhí)行完后,塊才結(jié)束。
2)b的值在賦值語(yǔ)句執(zhí)行完后立刻就改變。
非阻塞賦值方式和阻塞賦值方式的區(qū)別常給設(shè)計(jì)人員帶來(lái)問題。問題主要是給“always”塊內(nèi)的reg型信號(hào)的賦值方式不易把握。一般情況下,如果用一個(gè)always塊來(lái)描述時(shí)序電路,這個(gè)的“always”模塊內(nèi)的reg型信號(hào)都是采用下面的非阻塞賦值方式:b<=a;[例1]:always@(posedgeclk)beginb<=a;c<=b;end
[例1]中的"always"塊中用了非阻塞賦值方式,定義了兩個(gè)reg型信號(hào)b和c,clk信號(hào)的上升沿到來(lái)時(shí),b就等于a,c就等于b,這里應(yīng)該用到了兩個(gè)觸發(fā)器。請(qǐng)注意:賦值是在"always"塊結(jié)束后執(zhí)行的,c應(yīng)為原來(lái)b的值。這個(gè)"always"塊實(shí)際描述的電路功能如下圖所示:
[例2]:always@(posedgeclk)beginb=a;c=b;end[例2]中的"always"塊用了阻塞賦值方式。clk信號(hào)的上升沿到來(lái)時(shí),將發(fā)生如下的變化:b馬上取a的值,c馬上取b的值(即等于a),生成的電路圖如下所示只用了一個(gè)觸發(fā)器來(lái)寄存器a的值,又輸出給b和c。這大概不是設(shè)計(jì)者的初衷,如果采用[例1]所示的非阻塞賦值方式就可以避免這種錯(cuò)誤。
DCLKQabcclk2、塊語(yǔ)句:
塊語(yǔ)句通常用來(lái)將兩條或多條語(yǔ)句組合在一起,使其在格式上看更象一條語(yǔ)句。塊語(yǔ)句有兩種,一種是begin_end語(yǔ)句,通常用來(lái)標(biāo)識(shí)順序執(zhí)行的語(yǔ)句,用它來(lái)標(biāo)識(shí)的塊稱為順序塊。一種是fork_join語(yǔ)句,通常用來(lái)標(biāo)識(shí)并行執(zhí)行的語(yǔ)句,用它來(lái)標(biāo)識(shí)的塊稱為并行塊。下面進(jìn)行詳細(xì)的介紹。順序塊順序塊有以下特點(diǎn):1)塊內(nèi)的語(yǔ)句是按順序執(zhí)行的,即只有上面一條語(yǔ)句執(zhí)行完后下面的語(yǔ)句才能執(zhí)行。2)每條語(yǔ)句的延遲時(shí)間是相對(duì)于前一條語(yǔ)句的仿真時(shí)間而言的。3)直到最后一條語(yǔ)句執(zhí)行完,程序流程控制才跳出該語(yǔ)句塊。順序塊的格式如下:begin語(yǔ)句1;語(yǔ)句2;......語(yǔ)句n;end或begin:塊名塊內(nèi)聲明語(yǔ)句 語(yǔ)句1;語(yǔ)句2;......語(yǔ)句n;end
其中:塊名即該塊的名字,一個(gè)標(biāo)識(shí)名。塊內(nèi)聲明語(yǔ)句可以是參數(shù)聲明語(yǔ)句、reg型變量聲明語(yǔ)句、integer型變量聲明語(yǔ)句、real型變量聲明語(yǔ)句。
下面舉例說明:[例1]:beginareg=breg;creg=areg;//creg的值為breg的值。end
從該例可以看出,第一條賦值語(yǔ)句先執(zhí)行,areg的值更新為breg的值,然后程序流程控制轉(zhuǎn)到第二條賦值語(yǔ)句,creg的值更新為areg的值。因?yàn)檫@兩條賦值語(yǔ)句之間沒有任何延遲時(shí)間,creg的值實(shí)為breg的值。當(dāng)然可以在順序塊里延遲控制時(shí)間來(lái)分開兩個(gè)賦值語(yǔ)句的執(zhí)行時(shí)間,見[例2]:
[例2]:beginareg=breg;#10creg=areg;//在兩條賦值語(yǔ)句間延遲10個(gè)時(shí)間單位。end
[例3]:parameterd=50;//聲明d是一個(gè)參數(shù)reg[7:0]r;//聲明r是一個(gè)8位的寄存器變量begin//由一系列延遲產(chǎn)生的波形#dr='h35;#dr='hE2;#dr='h00;#dr='hF7;end
并行塊并行塊有以下四個(gè)特點(diǎn):塊內(nèi)語(yǔ)句是同時(shí)執(zhí)行的,即程序流程控制一進(jìn)入到該并行塊,塊內(nèi)語(yǔ)句則開始同時(shí)并行地執(zhí)行。塊內(nèi)每條語(yǔ)句的延遲時(shí)間是相對(duì)于程序流程控制進(jìn)入到塊內(nèi)時(shí)的仿真時(shí)間的。延遲時(shí)間是用來(lái)給賦值語(yǔ)句提供執(zhí)行時(shí)序的。當(dāng)按時(shí)間時(shí)序排序在最后的語(yǔ)句執(zhí)行完后,程序流程控制跳出該程序塊。
并行塊的格式如下:fork語(yǔ)句1;語(yǔ)句2;.......語(yǔ)句n;joinfork:塊名塊內(nèi)聲明語(yǔ)句 語(yǔ)句1;語(yǔ)句2;......語(yǔ)句n;join其中:
塊名即標(biāo)識(shí)該塊的一個(gè)名字,相當(dāng)于一個(gè)標(biāo)識(shí)符。塊內(nèi)說明語(yǔ)句可以是參數(shù)說明語(yǔ)句、reg型變量聲明語(yǔ)句、integer型變量聲明語(yǔ)句、real型變量聲明語(yǔ)句、time型變量聲明語(yǔ)句、事件(event)說明語(yǔ)句。下面舉例說明:
[例4]:fork#50r='h35;#100r='hE2;#150r='h00;#200r='hF7;join
在這個(gè)例子中用并行塊來(lái)替代了前面例子中的順序塊來(lái)產(chǎn)生波形,用這兩種方法生成的波形是一樣的。起始時(shí)間和結(jié)束時(shí)間在并行塊和順序塊中都有一個(gè)起始時(shí)間和結(jié)束時(shí)間的概念。對(duì)于順序塊,起始時(shí)間就是第一條語(yǔ)句開始被執(zhí)行的時(shí)間,結(jié)束時(shí)間就是最后一條語(yǔ)句執(zhí)行完的時(shí)間。而對(duì)于并行塊來(lái)說,起始時(shí)間對(duì)于塊內(nèi)所有的語(yǔ)句是相同的,即程序流程控制進(jìn)入該塊的時(shí)間,其結(jié)束時(shí)間是按時(shí)間排序在最后的語(yǔ)句執(zhí)行完的時(shí)間。
在fork_join塊內(nèi),各條語(yǔ)句不必按順序給出,因此在并行塊里,各條語(yǔ)句在前還是在后是無(wú)關(guān)緊要的。[例5]:fork#200r='hF7;#150r='h00;#100r='hE2;#50r='h35;join
在這個(gè)例子中,各條語(yǔ)句并不是按被執(zhí)行的先后順序給出的,但同樣可以生成前面例子中的波形。
4.3條件語(yǔ)句1.if_else語(yǔ)句if語(yǔ)句是用來(lái)判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。VerilogHDL語(yǔ)言提供了三種形式的if語(yǔ)句。(1).if(表達(dá)式)語(yǔ)句例如:if(a>b)out1<=int1;
(2).if(表達(dá)式)語(yǔ)句1else 語(yǔ)句2例如: if(a>b)out1<=int1;elseout1<=int2;(3).if(表達(dá)式1)語(yǔ)句1;elseif(表達(dá)式2)語(yǔ)句2;elseif(表達(dá)式3)語(yǔ)句3;........elseif(表達(dá)式m)語(yǔ)句m;else語(yǔ)句n;
例如:if(a>b)out1<=int1;elseif(a==b)out1<=int2;elseout1<=int3;五點(diǎn)說明:(1).
三種形式的if語(yǔ)句中在if后面都有“表達(dá)式”,一般為邏輯表達(dá)式或關(guān)系表達(dá)式。系統(tǒng)對(duì)表達(dá)式的值進(jìn)行判斷,若為0,x,z,按“假”處理,若為1,按“真”處理,執(zhí)行指定的語(yǔ)句。
(2).第二、第三種形式的if語(yǔ)句中,在每個(gè)else前面有一分號(hào),整個(gè)語(yǔ)句結(jié)束處有一分號(hào)。例如:
這是由于分號(hào)是VerilogHDL語(yǔ)句中不可缺少的部分,這個(gè)分號(hào)是if語(yǔ)句中的內(nèi)嵌套語(yǔ)句所要求的。如果無(wú)此分號(hào),則出現(xiàn)語(yǔ)法錯(cuò)誤。但應(yīng)注意,不要誤認(rèn)為上面是兩個(gè)語(yǔ)句(if語(yǔ)句和else語(yǔ)句)。它們都屬于同一個(gè)if語(yǔ)句。else子句不能作為語(yǔ)句單獨(dú)使用,它必須是if語(yǔ)句的一部分,與if配對(duì)使用。(3).在if和else后面可以包含一個(gè)內(nèi)嵌的操作語(yǔ)句,也可以有多個(gè)操作語(yǔ)句,此時(shí)用begin和end這兩個(gè)關(guān)鍵詞將幾個(gè)語(yǔ)句包含起來(lái)成為一個(gè)復(fù)合塊語(yǔ)句。如:if(a>b)beginout1<=int1;out2<=int2;endelsebeginout1<=int2;out2<=int1;end注意在end后不需要再加分號(hào)。因?yàn)閎egin_end內(nèi)是一個(gè)完整的復(fù)合語(yǔ)句,不需再附加分號(hào)。(4).允許一定形式的表達(dá)式簡(jiǎn)寫方式。如下面的例子:if(expression)等同if(expression==1)if(!expression)
等同if(expression!=1)(5).if語(yǔ)句的嵌套在if語(yǔ)句中又包含一個(gè)或多個(gè)if語(yǔ)句稱為if語(yǔ)句的嵌套。一般形式如下:if(expression1)if(expression2)語(yǔ)句1 (內(nèi)嵌if)else語(yǔ)句2elseif(expression3)語(yǔ)句3 (內(nèi)嵌if)else語(yǔ)句4應(yīng)當(dāng)注意if與else的配對(duì)關(guān)系,else總是與它上面的最近的if配對(duì)。如果if與else的數(shù)目不一樣,為了確保實(shí)現(xiàn)程序設(shè)計(jì)者的企圖和增強(qiáng)程序可讀性,可以用begin_end塊語(yǔ)句來(lái)確定配對(duì)關(guān)系。
例如:if( )begin if( )語(yǔ)句1 (內(nèi)嵌if)endelse語(yǔ)句2這時(shí)begin_end塊語(yǔ)句限定了內(nèi)嵌if語(yǔ)句的范圍,因此else與第一個(gè)if配對(duì)。if(index>0)for(scani=0;scani<index;scani=scani+1)if(memory[scani]>0)beginmemory[scani]=0;endelse /*WRONG*/$display("error-indexiszero");盡管程序設(shè)計(jì)者把else寫在與第一個(gè)if(外層if)同一列上,希望與第一個(gè)if對(duì)應(yīng),但實(shí)際上else是與第二個(gè)if對(duì)應(yīng),因?yàn)樗鼈兿嗑嘧罱U_的寫法應(yīng)當(dāng)是這樣的:if(index>0)beginfor(scani=0;scani<index;scani=scani+1)if(memory[scani]>0)beginmemory[scani]=0;endend
else/*WRONG*/ $display("error-indexiszero");2.case語(yǔ)句
case語(yǔ)句是一種多分支選擇語(yǔ)句,if語(yǔ)句只有兩個(gè)分支可供選擇,Verilog語(yǔ)言提供的case語(yǔ)句直接處理多分支選擇。case語(yǔ)句通常用于微處理器的指令譯碼,它的一般形式如下:case(表達(dá)式) <case分支項(xiàng)> endcasecasez(表達(dá)式) <case分支項(xiàng)> endcasecasex(表達(dá)式) <case分支項(xiàng)> endcasecase分支項(xiàng)的一般格式如下:分支表達(dá)式: 語(yǔ)句缺省項(xiàng)(default項(xiàng)): 語(yǔ)句reg[15:0]rega;reg[9:0]result;case(rega)16'd0:result=10'b0111111111;16'd1:result=10'b1011111111;16'd2:result=10'b1101111111;16'd3:result=10'b1110111111;16'd4:result=10'b1111011111;16'd5:result=10'b1111101111;16'd6:result=10'b1111110111;16'd7:result=10'b1111111011;16'd8:result=10'b1111111101;16'd9:result=10'b1111111110;default:result='bx;endcase
每一個(gè)case分項(xiàng)的分支表達(dá)式的值必須互不相同,否則就會(huì)出現(xiàn)矛盾現(xiàn)象(對(duì)表達(dá)式的同一個(gè)值,有多種執(zhí)行方案)。執(zhí)行完case分項(xiàng)后的語(yǔ)句,則跳出該case語(yǔ)句結(jié)構(gòu),終止case語(yǔ)句的執(zhí)行。在用case語(yǔ)句表達(dá)式進(jìn)行比較的過程中,只有當(dāng)信號(hào)的對(duì)應(yīng)位的值能明確進(jìn)行比較時(shí),比較才能成功。因此要注意詳細(xì)說明case分項(xiàng)的分支表達(dá)式的值。case語(yǔ)句的所有表達(dá)式的值的位寬必須相等,只有這樣控制表達(dá)式和分支表達(dá)式才能進(jìn)行對(duì)應(yīng)位的比較。一個(gè)經(jīng)常犯的錯(cuò)誤是用'bx,'bz來(lái)替代n'bx,n'bz,這樣寫是不對(duì)的,因?yàn)樾盘?hào)x,z的缺省寬度是機(jī)器的字節(jié)寬度,通常是32位(此處n是case控制表達(dá)式的位寬)。
case語(yǔ)句與if_else_if語(yǔ)句的區(qū)別主要有兩點(diǎn):與case語(yǔ)句中的控制表達(dá)式和多分支表達(dá)式這種比較結(jié)構(gòu)相比,if_else_if結(jié)構(gòu)中的條件表達(dá)式更為直觀一些。對(duì)于那些分支表達(dá)式中存在不定值x和高阻值z(mì)位時(shí),case語(yǔ)句提供了處理這種情況的手段。下面的兩個(gè)例子介紹了處理x,z值位的case語(yǔ)句。[例1]:case(select[1:2])2'b00:result=0;2'b01:result=flaga;2'b0x,2'b0z:result=flaga?'bx:0;2'b10:result=flagb;2'bx0,2'bz0:result=flagb?'bx:0;default:result='bx;endcase[例2]:case(sig)1'bz:$display("signalisfloating");1'bx:$display("signalisunknown");default:$display("signalis%b",sig);endcaseVerilogHDL針對(duì)電路的特性提供了case語(yǔ)句的其它兩種形式用來(lái)處理case語(yǔ)句比較過程中的不必考慮的情況(don‘tcarecondition)。其中casez語(yǔ)句用來(lái)處理不考慮高阻值z(mì)的比較過程,casex語(yǔ)句則將高阻值z(mì)和不定值都視為不必關(guān)心的情況。所謂不必關(guān)心的情況,即在表達(dá)式進(jìn)行比較時(shí),不將條件表達(dá)式或分支表達(dá)式中的該位的狀態(tài)考慮在內(nèi)。這樣在case語(yǔ)句表達(dá)式進(jìn)行比較時(shí),就可以靈活地設(shè)置以對(duì)信號(hào)的某些位進(jìn)行比較。
[例3]:reg[7:0]ir;casez(ir)8'b1???????:instruction1(ir);8'b01??????:instruction2(ir);8'b00010???:instruction3(ir);8'b000001??:instruction4(ir);endcase[例4]:reg[7:0]r,mask;mask=8'bx0x0x0x0;casex(r^mask)8'b001100xx:stat1;8'b1100xx00:stat2;8'b00xx0011:stat3;8'bxx001100:stat4;endcase3.由于使用條件語(yǔ)句不當(dāng)在設(shè)計(jì)中生成了原本沒想到有的鎖存器VerilogHDL設(shè)計(jì)中容易犯的一個(gè)通病是由于不正確使用語(yǔ)言,生成了并不想要的鎖存器。下面我們給出了一個(gè)在“always"塊中不正確使用if語(yǔ)句,造成這種錯(cuò)誤的例子。
檢查一下左邊的"always"塊,if語(yǔ)句保證了只有當(dāng)al=1時(shí),q才取d的值。這段程序沒有寫出al=0時(shí)的結(jié)果,那么當(dāng)al=0時(shí)會(huì)怎么樣呢?在"always"塊內(nèi),如果在給定的條件下變量沒有賦值,這個(gè)變量將保持原值,也就是說會(huì)生成一個(gè)鎖存器!如果設(shè)計(jì)人員希望當(dāng)al=0時(shí)q的值為0,else項(xiàng)就必不可少了,請(qǐng)注意看右邊的"always"塊,整個(gè)Verilog程序模塊綜合出來(lái)后,"always"塊對(duì)應(yīng)的部分不會(huì)生成鎖存器。
VerilogHDL程序另一種偶然生成鎖存器是在使用case語(yǔ)句時(shí)缺少default項(xiàng)的情況下發(fā)生的。
case語(yǔ)句的功能是:在某個(gè)信號(hào)(本例中的sel)取不同的值時(shí),給另一個(gè)信號(hào)(本例中的q)賦不同的值。注意看下圖左邊的例子,如果sel=0,q取a值,而sel=11,q取b的值。這個(gè)例子中不清楚的是:如果sel取00和11以外的值時(shí)q將被賦予什么值?在下面左邊的這個(gè)例子中,程序是用VerilogHDL寫的,即默認(rèn)為q保持原值,這就會(huì)自動(dòng)生成鎖存器。
右邊的例子很明確,程序中的case語(yǔ)句有default項(xiàng),指明了如果sel不取00或11時(shí),編譯器或仿真器應(yīng)賦給q的值。程序所示情況下,q賦為0,因此不需要鎖存器。
以上就是怎樣來(lái)避免偶然生成鎖存器的錯(cuò)誤。如果用到if語(yǔ)句,最好寫上else項(xiàng)。如果用case語(yǔ)句,最好寫上default項(xiàng)。遵循上面兩條原則,就可以避免發(fā)生這種錯(cuò)誤,使設(shè)計(jì)者更加明確設(shè)計(jì)目標(biāo),同時(shí)也增強(qiáng)了Verilog程序的可讀性。4.4循環(huán)語(yǔ)句
在VerilogHDL中存在著四種類型的循環(huán)語(yǔ)句,用來(lái)控制執(zhí)行語(yǔ)句的執(zhí)行次數(shù)。1)
forever 連續(xù)的執(zhí)行語(yǔ)句。2)
repeat 連續(xù)執(zhí)行一條語(yǔ)句n次。3)
while 執(zhí)行一條語(yǔ)句直到某個(gè)條件不滿足。如果一開始條件即不滿足(為假),則語(yǔ)句一次也不能被執(zhí)行。4)
for通過三個(gè)步驟來(lái)決定語(yǔ)句的循環(huán)執(zhí)行。注意:循環(huán)語(yǔ)句只能在always或initial塊中使用。
1.forever語(yǔ)句forever語(yǔ)句的格式如下:forever 語(yǔ)句;或forever begin 多條語(yǔ)句end
forever循環(huán)語(yǔ)句不包含任何條件表達(dá)式,只執(zhí)行無(wú)限循環(huán),直到遇到系統(tǒng)任務(wù)$finish為止。常用于產(chǎn)生周期性的波形,用來(lái)作為仿真測(cè)試信號(hào)。它與always語(yǔ)句不同處在于不能獨(dú)立寫在程序中,而必須寫在initial塊中。
例:
regclock;
initialbeginclock=1’b0;
forever#10clock=~clock;
end2.repeat語(yǔ)句repeat語(yǔ)句的格式如下:
repeat(表達(dá)式)語(yǔ)句;或repeat(表達(dá)式)begin多條語(yǔ)句end
在repeat語(yǔ)句中,其表達(dá)式通常為常量表達(dá)式。
例:
integercount;
initialbegincount=0;
repeat(128)begin$display(“count=%d”,count);
count=count+1;
endend3.while語(yǔ)句while語(yǔ)句的格式如下:
while(表達(dá)式)語(yǔ)句或用如下格式:while(表達(dá)式)begin多條語(yǔ)句 end
例1:
integercount;initialbegincount=0;while(count<128)count=count+1;end例2:用while循環(huán)語(yǔ)句對(duì)rega這個(gè)八位二進(jìn)制數(shù)中值為1的位進(jìn)行計(jì)數(shù)。begin: count1sreg[7:0]tempreg;count=0;tempreg=
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鋼筋工程鋼筋班組勞務(wù)分包
- 國(guó)內(nèi)個(gè)人房屋買賣合同范本模板
- 簽證申請(qǐng)英文保證信模板
- 個(gè)人有擔(dān)保貸款抵押合同樣本
- 住宅改商業(yè)的保證
- 購(gòu)銷合同修改策略
- 志愿者權(quán)利與義務(wù)
- 土豆購(gòu)銷合同范本
- 中文版和英文版采購(gòu)合同全文翻譯
- 土木修建勞務(wù)分包協(xié)議
- 四川省綿陽(yáng)市2024年七年級(jí)上學(xué)期數(shù)學(xué)期末考試試卷【附答案】
- 【公開課】Unit+7+Section+B+project課件-人教版英語(yǔ)七年級(jí)上冊(cè)
- 配位化學(xué)-本科生版知到智慧樹章節(jié)測(cè)試課后答案2024年秋蘭州大學(xué)
- 《學(xué)科建設(shè)》課件
- 精神科患者首次風(fēng)險(xiǎn)評(píng)估單
- 2024年度房產(chǎn)交易合同解除及退款條款的詳細(xì)規(guī)定3篇
- 2024年中國(guó)高職院校升本分析報(bào)告-軟科職教
- 2024年下半年安徽文都控股集團(tuán)限公司公開招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 《光伏電站運(yùn)行與維護(hù)》試題及答案一
- 國(guó)開2024年秋《生產(chǎn)與運(yùn)作管理》形成性考核1-4答案
- GB/Z 44306-2024顆粒質(zhì)量一致性評(píng)價(jià)指南
評(píng)論
0/150
提交評(píng)論