Verilog操作符教學(xué)講解課件_第1頁(yè)
Verilog操作符教學(xué)講解課件_第2頁(yè)
Verilog操作符教學(xué)講解課件_第3頁(yè)
Verilog操作符教學(xué)講解課件_第4頁(yè)
Verilog操作符教學(xué)講解課件_第5頁(yè)
已閱讀5頁(yè),還剩112頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第10章

Verilog操作符學(xué)習(xí)內(nèi)容:熟悉Verilog語(yǔ)言的操作符操作符類(lèi)型下表以?xún)?yōu)先級(jí)順序列出了Verilog操作符。注意“與”操作符的優(yōu)先級(jí)總是比相同類(lèi)型的“或”操作符高。本章將對(duì)每個(gè)操作符用一個(gè)例子作出解釋。操作符類(lèi)型符號(hào)連接及復(fù)制操作符一元操作符算術(shù)操作符邏輯移位操作符 關(guān)系操作符相等操作符按位操作符邏輯操作符條件操作符{}{{}}!~&|^*/%+-<<>>><>=<======!=!==&^~^|&&||?:最高最低優(yōu)先級(jí)Verilog中的大小(size)與符號(hào)Verilog根據(jù)表達(dá)式中變量的長(zhǎng)度對(duì)表達(dá)式的值自動(dòng)地進(jìn)行調(diào)整。Verilog自動(dòng)截?cái)嗷驍U(kuò)展賦值語(yǔ)句中右邊的值以適應(yīng)左邊變量的長(zhǎng)度。當(dāng)一個(gè)負(fù)數(shù)賦值給無(wú)符號(hào)變量如reg時(shí),Verilog自動(dòng)完成二進(jìn)制補(bǔ)碼計(jì)算modulesign_size;

reg[3:0]a,b;

reg[15:0]c;initialbegina=-1;//a是無(wú)符號(hào)數(shù),因此其值為1111b=8;c=8;//b=c=1000#10b=b+a;//結(jié)果10111截?cái)?b=0111#10c=c+a;//c=10111endendmodule算術(shù)操作符modulearithops();parameterfive=5;integerans,int;

reg[3:0]rega,regb;

reg[3:0]num;initialbegin

rega=3;

regb=4'b1010;

int=-3;//int=1111……1111_1101endinitialfork#10ans=five*int;//ans=-15#20ans=(int+5)/2;//ans=1#30ans=five/int;//ans=-1#40num=rega+regb;//num=1101#50num=rega+1;//num=0100#60num=int;//num=1101#70num=regb%rega;//num=1#80$finish;joinendmodule+ 加- 減* 乘/ 除% 模將負(fù)數(shù)賦值給reg或其它無(wú)符號(hào)變量使用2的補(bǔ)碼算術(shù)。如果操作數(shù)的某一位是x或z,則結(jié)果為x

在整數(shù)除法中,余數(shù)舍棄模運(yùn)算中使用第一個(gè)操作數(shù)的符號(hào)注意integer和reg類(lèi)型在算術(shù)運(yùn)算時(shí)的差別。integer是有符號(hào)數(shù),而reg是無(wú)符號(hào)數(shù)。按位操作符modulebitwise();

reg[3:0]rega,regb,regc;

reg[3:0]num;initialbegin

rega=4'b1001;

regb=4'b1010;

regc=4'b11x0;endinitialfork#10num=rega&0;//num=0000#20num=rega®b;//num=1000#30num=rega|regb;//num=1011#40num=regb®c;//num=10x0

#50num=regb|regc;//num=1110#60$finish;joinendmodule~ not& and| or^ xor~^ xnor^~ xnor按位操作符對(duì)矢量中相對(duì)應(yīng)位運(yùn)算。

regb=4'b1010

regc=4'b1x10num=regb®c=1010;

位值為x時(shí)不一定產(chǎn)生x結(jié)果。如#50時(shí)的or計(jì)算。當(dāng)兩個(gè)操作數(shù)位數(shù)不同時(shí),位數(shù)少的操作數(shù)零擴(kuò)展到相同位數(shù)。a=4'b1011;b=8'b01010011;c=a|b;//a零擴(kuò)展為8'b00001011邏輯操作符modulelogical();parameterfive=5;

reg

ans;

reg[3:0]rega,regb,regc;initialbegin

rega=4‘b0011; //邏輯值為“1”

regb=4‘b10xz;//邏輯值為“1”

regc=4‘b0z0x;//邏輯值為“x”endinitialfork#10ans=rega&&0;//ans=0#20ans=rega||0;//ans=1#30ans=rega&&five;//ans=1#40ans=regb&®a;//ans=1#50ans=regc||0;//ans=x#60$finish;joinendmodule! not&& and|| or邏輯操作符的結(jié)果為一位1,0或x。邏輯操作符只對(duì)邏輯值運(yùn)算。如操作數(shù)為全0,則其邏輯值為false如操作數(shù)有一位為1,則其邏輯值為true若操作數(shù)只包含0、x、z,則邏輯值為x邏輯反操作符將操作數(shù)的邏輯值取反。例如,若操作數(shù)為全0,則其邏輯值為0,邏輯反操作值為1。邏輯反與位反的對(duì)比modulenegation();

reg[3:0]rega,regb;

reg[3:0]bit;

reglog;initialbegin

rega=4'b1011;

regb=4'b0000;endinitialfork#10bit=~rega;//num=0100#20bit=~regb;//num=1111#30log=!rega;//num=0#40log=!regb;//num=1#50$finish;joinendmodule!logicalnot邏輯反~bit-wisenot位反邏輯反的結(jié)果為一位1,0或x。位反的結(jié)果與操作數(shù)的位數(shù)相同邏輯反操作符將操作數(shù)的邏輯值取反。例如,若操作數(shù)為全0,則其邏輯值為0,邏輯反操作值為1。一元?dú)w約操作符modulereduction();

reg

val;

reg[3:0]rega,regb;initialbegin

rega=4'b0100;

regb=4'b1111;endinitialfork#10val=®a;//val=0#20val=|

rega;//val=1#30val=&

regb;//val=1#40val=|

regb;//val=1#50val=^rega;//val=1#60val=^regb;//val=0#70val=~|

rega;//(nor)val=0#80val=~&

rega;//(nand)val=1#90val=^rega&&®b;//val=1$finish;joinendmodule& and| or^ xor~^ xnor^~ xnor歸約操作符的操作數(shù)只有一個(gè)。對(duì)操作數(shù)的所有位進(jìn)行位操作。結(jié)果只有一位,可以是0,1,X。移位操作符moduleshift();

reg[9:0]num,num1;

reg[7:0]rega,regb;initialrega=8'b00001100;initialfork

#10num<=rega<<5;//num=01_1000_0000#10regb<=rega<<5;//regb=1000_0000#20num<=rega>>3;//num=00_0000_0001#20regb<=rega>>3;//regb=0000_0001#30num<=10'b11_1111_0000;#40rega<=num<<2;//rega=1100_0000#40num1<=num<<2;//num1=11_1100_0000

#50rega<=num>>2;//rega=1111_1100#50num1<=num>>2;//num1=00_1111_1100#60$finish;joinendmodule>> 邏輯右移<< 邏輯左移移位操作符對(duì)其左邊的操作數(shù)進(jìn)行向左或向右的位移位操作。第二個(gè)操作數(shù)(移位位數(shù))是無(wú)符號(hào)數(shù)若第二個(gè)操作數(shù)是x或z則結(jié)果為x在賦值語(yǔ)句中,如果右邊(RHS)的結(jié)果:位寬大于左邊,則把最高位截去位寬小于左邊,則零擴(kuò)展<<將左邊的操作數(shù)左移右邊操作數(shù)指定的位數(shù)>>將左邊的操作數(shù)右移右邊操作數(shù)指定的位數(shù)左移先補(bǔ)后移右移先移后補(bǔ)建議:表達(dá)式左右位數(shù)一致關(guān)系操作符modulerelationals();

reg[3:0]rega,regb,regc;

reg

val;initialbegin

rega=4'b0011;

regb=4'b1010;

regc=4'b0x10;endinitialfork

#10val=regc>rega;//val=x#20val=regb<rega;//val=0#30val=regb>=rega;//val=1

#40val=regb>regc;//val=1#50$finish;joinendmodule>

大于<

小于>=

大于等于<=

小于等于其結(jié)果是1’b1、1’b0或1’bx。無(wú)論x為何值,regb>regcrega和regc的關(guān)系取決于x相等操作符賦值操作符,將等式右邊表達(dá)式的值拷貝到左邊。注意邏輯等與case等的差別=邏輯等====01xz010xx101xxxxxxxzxxxx

case等=====01xz0100010100x0010z00012‘b1x==2’b0x

值為0,因?yàn)椴幌嗟?‘b1x==2’b1x

值為x,因?yàn)榭赡懿幌嗟?,也可能相?‘b1x===2’b0x

值為0,因?yàn)椴幌嗤?‘b1x==2’b1x

值為1,因?yàn)橄嗤琣=2'b1x;b=2'b1x;if(a==b)$display("aisequaltob");else$display("aisnotequaltob");a=2'b1x;b=2'b1x;if(a===b)$display("aisidenticaltob");else$display("aisnotidenticaltob");Case等只能用于行為描述,不能用于RTL描述。相等操作符邏輯等邏輯不等==!=moduleequalities1();

reg[3:0]rega,regb,regc;

reg

val;initialbegin

rega=4'b0011;

regb=4'b1010;

regc=4'b1x10;endinitialfork#10val=rega==regb;//val=0#20val=rega!=regc;//val=1#30val=regb!=regc;//val=x#40val=regc==regc;//val=x#50$finish;joinendmodule其結(jié)果是1’b1、1’b0或1’bx。如果左邊及右邊為確定值并且相等,則結(jié)果為1。如果左邊及右邊為確定值并且不相等,則結(jié)果為0。如果左邊及右邊有值不能確定的位,但值確定的位相等,則結(jié)果為x。!=的結(jié)果與==相反值確定是指所有的位為0或1。不確定值是有值為x或z的位。相等操作符相同(case等)

不相同(case不等)===!==moduleequalities2();

reg[3:0]rega,regb,regc;

reg

val;initialbegin

rega=4'b0011;

regb=4'b1010;

regc=4'b1x10;endinitialfork#10val=rega===regb;//val=0#20val=rega!==regc;//val=1#30val=regb===regc;//val=0#40val=regc===regc;//val=1#50$finish;joinendmodule其結(jié)果是1’b1、1’b0或1’bx。如果左邊及右邊的值相同(包括x、z),則結(jié)果為1。如果左邊及右邊的值不相同,則結(jié)果為0。!==的結(jié)果與===相反綜合工具不支持條件操作符條件?:modulelikebufif(in,en,out);inputin;inputen;outputout;assignout=(en==1)?in:'bz;endmodulemodulelike4to1(a,b,c,d,sel,out);inputa,b,c,d;input[1:0]sel;outputout;assignout=sel==2'b00?a:

sel==2'b01?b:

sel==2'b10?c:d;endmodule如果條件值為x或z,則結(jié)果可能為x或z條件操作符條件操作符的語(yǔ)法為:<LHS>=<condition>?<true_expression>:<false_expression>registger=condition?true_value:false_value;其意思是:ifconditionisTRUE,thenLHS=true_expression,elseLHS=false_expression每個(gè)條件操作符必須有三個(gè)參數(shù),缺少任何一個(gè)都會(huì)產(chǎn)生錯(cuò)誤。最后一個(gè)操作數(shù)作為缺省值。上式中,若condition為真則register等于true_value;若condition為假則register等于false_value。一個(gè)很有意思的地方是,如果條件值不確定,且true_value和false_value不相等,則輸出不確定值。例如:assignout=(sel==0)?a:b;若sel為0則out=a;若sel為1則out=b。如果sel為x或z,若a=b=0,則out=0;若a≠b,則out值不確定。級(jí)聯(lián)操作符級(jí)聯(lián){}可以從不同的矢量中選擇位并用它們組成一個(gè)新的矢量。用于位的重組和矢量構(gòu)造moduleconcatenation;

reg[7:0]rega,regb,regc,regd;

reg[7:0]new;initialbegin

rega=8'b0000_0011;

regb=8'b0000_0100;

regc=8'b0001_1000;

regd=8'b1110_0000;endinitialfork#10new={regc[4:3],regd[7:5],

regb[2],rega[1:0]};//new=8'b11111111#20$finish;joinendmodule在級(jí)聯(lián)和復(fù)制時(shí),必須指定位數(shù),否則將產(chǎn)生錯(cuò)誤。下面是類(lèi)似錯(cuò)誤的例子:

a[7:0]={4{′b10}};b[7:0]={2{5}};c[3:0]={3′b011,′b0};級(jí)聯(lián)時(shí)不限定操作數(shù)的數(shù)目。在操作符符號(hào){}中,用逗號(hào)將操作數(shù)分開(kāi)。例如:

{A,B,C,D}復(fù)制復(fù)制{{}}復(fù)制一個(gè)變量或在{}中的值modulereplicate();

reg[3:0]rega;

reg[1:0]regb,regc;

reg[7:0]bus;initialbegin

rega=4’b1001;

regb=2'b11;

regc=2'b00;endinitialfork

#10bus<={4{regb}};//bus=11111111//regbisreplicated4times.#20bus<={{2{regb}},{2{regc}}};//bus=11110000.regcandregbareeach//replicated,andtheresultingvectors//areconcatenatedtogether#30bus<={{4{rega[1]}},rega};//bus=00001001.regaissign-extended#40$finish;joinendmodule前兩個(gè){符號(hào)之間的正整數(shù)指定復(fù)制次數(shù)。復(fù)習(xí)解答1、~進(jìn)行1的補(bǔ)碼操作,將矢量中的每一位取反!將一個(gè)操作數(shù)歸約為一位true或false結(jié)果2、&將操作數(shù)從低到高的對(duì)應(yīng)位的進(jìn)行與操作

&&將每個(gè)操作數(shù)歸約為一位true或false,然后對(duì)歸約結(jié)果進(jìn)行與操作3、要復(fù)制的操作數(shù)必須指定位數(shù),例如

{3{‘b1}}是非法的,因此’b1沒(méi)有指定位數(shù)。而{3{1‘b1}是合法的1、~和!有什么不同?2、&&和&有什么不同?3、用復(fù)制操作符復(fù)制一個(gè)數(shù)據(jù)時(shí),對(duì)數(shù)據(jù)有什么要求?問(wèn)題:第11章行為建模學(xué)習(xí)內(nèi)容:行為建模的基本概念Verilog中高級(jí)編程語(yǔ)言結(jié)構(gòu)如何使用連續(xù)賦值RTL描述方式是行為描述方式的子集。在本章中的綜合部分將詳細(xì)介紹哪些行為級(jí)結(jié)構(gòu)同樣可以用于RTL描述。注:行為描述行為級(jí)描述是對(duì)系統(tǒng)的高抽象級(jí)描述。在這個(gè)抽象級(jí),注重的是整個(gè)系統(tǒng)的功能而不是實(shí)現(xiàn)。Verilog有高級(jí)編程語(yǔ)言結(jié)構(gòu)用于行為描述,包括:

wait,while,ifthen,case和foreverVerilog的行為建模是用一系列以高級(jí)編程語(yǔ)言編寫(xiě)的并行的、動(dòng)態(tài)的過(guò)程塊來(lái)描述系統(tǒng)的工作。在每一個(gè)時(shí)鐘上升沿,若Clr不是低電平,置Q為D值,置Qb為D值的反DFF無(wú)論何時(shí)Clr變低置Q為0,置Qb為1過(guò)程(procedural)塊過(guò)程塊是行為模型的基礎(chǔ)。過(guò)程塊有兩種:initial塊,只能執(zhí)行一次always塊,循環(huán)執(zhí)行過(guò)程塊中有下列部件過(guò)程賦值語(yǔ)句:在描述過(guò)程塊中的數(shù)據(jù)流高級(jí)結(jié)構(gòu)(循環(huán),條件語(yǔ)句):描述塊的功能時(shí)序控制:控制塊的執(zhí)行及塊中的語(yǔ)句。過(guò)程賦值(proceduralassignment)在過(guò)程塊中的賦值稱(chēng)為過(guò)程賦值。在過(guò)程賦值語(yǔ)句中表達(dá)式左邊的信號(hào)必須是寄存器類(lèi)型(如reg類(lèi)型)在過(guò)程賦值語(yǔ)句等式右邊可以是任何有效的表達(dá)式,數(shù)據(jù)類(lèi)型也沒(méi)有限制。如果一個(gè)信號(hào)沒(méi)有聲明則缺省為wire類(lèi)型。使用過(guò)程賦值語(yǔ)句給wire賦值會(huì)產(chǎn)生錯(cuò)誤。moduleadder(out,a,b,cin);inputa,b,cin;output[1:0]out;wirea,b,cin;

reg

half_sum;

reg[1:0]out;always@(aorborcin)begin

half_sum=a^b^cin;//OK

half_carry=a&b|a&!b&cin|!a&b&cin;//ERROR!out={half_carry,half_sum};endendmodulehalf_carry沒(méi)有聲明過(guò)程時(shí)序控制在過(guò)程塊中可以說(shuō)明過(guò)程時(shí)序。過(guò)程時(shí)序控制有三類(lèi):簡(jiǎn)單延時(shí)(#delay):延遲指定時(shí)間步后執(zhí)行邊沿敏感的時(shí)序控制:@(<signal>)在信號(hào)發(fā)生翻轉(zhuǎn)后執(zhí)行??梢哉f(shuō)明信號(hào)有效沿是上升沿(posedge)還是下降沿(negedge)??梢杂藐P(guān)鍵字or指定多個(gè)參數(shù)。電平敏感的時(shí)序控制:wait(<expr>)直至expr值為真時(shí)(非零)才執(zhí)行。若expr已經(jīng)為真則立即執(zhí)行。modulewait_test;reg

clk,waito,edgeo;initialbegininitialbeginclk=0;edgeo=0;waito=0;endalways#10clk=~clk;always@(clk)#2edgeo=~edgeo;alwayswait(clk)#2waito=~waito;endmodule簡(jiǎn)單延時(shí)在testbench中使用簡(jiǎn)單延時(shí)(#延時(shí))施加激勵(lì),或在行為模型中模擬實(shí)際延時(shí)。modulemuxtwo(out,a,b,sl);inputa,b,sl;outputout;

regout;always@(sloraorb)if(!sl)#10out=a;//從a到out延時(shí)10個(gè)時(shí)間單位

else#12out=b;//從b到out延時(shí)12個(gè)時(shí)間單位endmodule在簡(jiǎn)單延時(shí)中可以使用模塊參數(shù)parameter:moduleclock_gen(clk);outputclk;

reg

clk;parametercycle=20;initialclk=0;always#(cycle/2)clk=~clk;endmodule邊沿敏感時(shí)序時(shí)序控制@可以用在RTL級(jí)或行為級(jí)組合邏輯或時(shí)序邏輯描述中??梢杂藐P(guān)鍵字posedge和negedge限定信號(hào)敏感邊沿。敏感表中可以有多個(gè)信號(hào),用關(guān)鍵字or連接。modulereg_adder(out,a,b,clk);inputclk;input[2:0]a,b;output[3:0]out;

reg[3:0]out;

reg[3:0]sum;always@(aorb)//若a或b發(fā)生任何變化,執(zhí)行

#5sum=a+b;always@(negedge

clk)//在clk下降沿執(zhí)行

out=sum;endmodule注:事件控制符or和位或操作符|及邏輯或操作符||沒(méi)有任何關(guān)系。wait語(yǔ)句wait用于行為級(jí)代碼中電平敏感的時(shí)序控制。下面的輸出鎖存的加法器的行為描述中,使用了用關(guān)鍵字or的邊沿敏感時(shí)序以及用wait語(yǔ)句描述的電平敏感時(shí)序。modulelatch_adder(out,a,b,enable);inputenable;input[2:0]a,b;output[3:0]out;

reg[3:0]out;always@(aorb)begin

wait(!enable)//當(dāng)enable為低電平時(shí)執(zhí)行加法

out=a+b;endendmodule注:綜合工具還不支持wait語(yǔ)句。命名事件(namedevent)在行為代碼中定義一個(gè)命名事件可以觸發(fā)一個(gè)活動(dòng)。命名事件不可綜合。moduleadd_mult(out,a,b);input[2:0]a,b;output[3:0]out;

reg[3:0]out;//***defineevents***eventadd,mult;always@(aorb)if(a>b)

->

add;//***triggerevent***else

->

mult;//***triggerevent***//***respondtoaneventtrigger***always@(add)out=a+b;//***respondtoaneventtrigger***always@(mult)out=a*b;endmodule在例子中,事件add和mult不是端口,但定義為事件,它們沒(méi)有對(duì)應(yīng)的硬件實(shí)現(xiàn)。是一種數(shù)據(jù)類(lèi)型,能在過(guò)程塊中觸發(fā)一個(gè)使能。在引用前必須聲明沒(méi)有持續(xù)時(shí)間,也不具有任何值只能在過(guò)程塊中觸發(fā)一個(gè)事件。

->操作符用來(lái)觸發(fā)命名事件。a大于b,事件add被觸發(fā),控制傳遞到等待add的always塊。如果a小于或等于b,事件mult被觸發(fā),控制被傳送到等待mult的always塊。行為描述舉例在上面的例子中發(fā)生下面順序的事件:等待set=1,忽略時(shí)刻10的clk的posedge。等待下一個(gè)clk的posedge,它將在時(shí)刻30發(fā)生。等待3個(gè)時(shí)間單位,在時(shí)刻33(30+3)置q=1。等待10個(gè)時(shí)間單位,在時(shí)刻43(33+10)置q=0。

等待在時(shí)刻48發(fā)生的set=0。

等待在時(shí)刻70發(fā)生且與clk的上升沿同時(shí)發(fā)生的set=1。等待下一個(gè)上升沿。時(shí)刻70的邊沿被忽略,因?yàn)榈竭_(dá)該語(yǔ)句時(shí)時(shí)間已經(jīng)過(guò)去了,如例子所示,clk=1。重要內(nèi)容:在實(shí)際硬件設(shè)計(jì)中,事件6應(yīng)該被視為一個(gè)競(jìng)爭(zhēng)(racecondition)。在仿真過(guò)程中,值的確定倚賴(lài)于順序,所以是不可預(yù)測(cè)的。這是不推薦的建模類(lèi)型。alwayswait(set)begin@(posedge

clk)#3q=1;#10q=0;wait(!set);end競(jìng)爭(zhēng)RTL描述舉例moduledff(q,qb,d,clk);outputq,qb;inputd,clk;

regq,qb;always@(posedge

clk)beginq=d;

qb=~d;endendmodule下面的RTL例子中只使用單個(gè)邊沿敏感時(shí)序控制。塊語(yǔ)句塊語(yǔ)句用來(lái)將多個(gè)語(yǔ)句組織在一起,使得他們?cè)谡Z(yǔ)法上如同一個(gè)語(yǔ)句。塊語(yǔ)句分為兩類(lèi):順序塊:語(yǔ)句置于關(guān)鍵字begin和end之間,塊中的語(yǔ)句以順序方式執(zhí)行。并行塊:關(guān)鍵字fork和join之間的是并行塊語(yǔ)句,塊中的語(yǔ)句并行執(zhí)行。Fork和join語(yǔ)句常用于testbench描述。這是因?yàn)榭梢砸黄鸾o出矢量及其絕對(duì)時(shí)間,而不必描述所有先前事件的時(shí)間。塊語(yǔ)句(續(xù))在順序塊中,語(yǔ)句一條接一條地計(jì)算執(zhí)行。在并行塊中,所有語(yǔ)句在各自的延遲之后立即計(jì)算執(zhí)行。begin#5a=3;#5a=5;#5a=4;endfork#5a=3;#15a=4;#10a=5;join上面的兩個(gè)例子在功能上是等價(jià)的。Fork-join例子里的賦值故意打亂順序是為了強(qiáng)調(diào)順序是沒(méi)有關(guān)系的。注意fork-join塊是典型的不可綜合語(yǔ)句,并且在一些仿真器時(shí)效率較差。延遲賦值語(yǔ)句begintemp=b;@(posedge

clk)a=temp;enda=@(posedge

clk)b;語(yǔ)法:LHS=<timing_control>RHS;

時(shí)序控制延遲的是賦值而不是右邊表達(dá)式的計(jì)算。在延遲賦值語(yǔ)句中RHS表達(dá)式的值都有一個(gè)隱含的臨時(shí)存儲(chǔ)??梢杂脕?lái)簡(jiǎn)單精確地模擬寄存器交換和移位。等價(jià)語(yǔ)句LHS:Left-hand-sideRHS:Right-hand-side延遲賦值語(yǔ)句begina=#5b;b=#5a;#10$diplay(a,b);endforka=#5b;b=#5a;#10$diplay(a,b);join在左邊的例子中,b的值被立即采樣(時(shí)刻0),這個(gè)值在時(shí)刻5賦給a。a的值在時(shí)刻5被采樣,這個(gè)值在時(shí)刻10賦給b。注意,另一個(gè)過(guò)程塊可能在時(shí)刻0到時(shí)刻5之間影響b的值,或在時(shí)刻5到時(shí)刻10之間影響a的值。在右邊的例子中,b和a的值被立即采樣(時(shí)刻0),保存的值在時(shí)刻5被賦值給他們各自的目標(biāo)。這是一個(gè)安全傳輸。注意,另一個(gè)過(guò)程塊可以在時(shí)刻0到時(shí)刻5之間影響a和b的值。并行語(yǔ)句在同一時(shí)間步發(fā)生,但由仿真器在另外一個(gè)時(shí)間執(zhí)行。在下面的每個(gè)例子中,a和b的值什么時(shí)候被采樣?在下面的每個(gè)例子中,什么時(shí)候給a和b賦值?b值拷貝到a然后回傳a和b值安全交換非阻塞過(guò)程賦值moduleswap_vals;

rega,b,clk;initialbegina=0;b=1;clk=0;endalways#5clk=~clk;always@(posedge

clk)begina<=b;//非阻塞過(guò)程賦值

b<=a;//交換a和b值

endendmodule阻塞過(guò)程賦值執(zhí)行完成后再執(zhí)行在順序塊內(nèi)下一條語(yǔ)句。非阻塞賦值不阻塞過(guò)程流,仿真器讀入一條賦值語(yǔ)句并對(duì)它進(jìn)行調(diào)度之后,就可以處理下一條賦值語(yǔ)句。若過(guò)程塊中的所有賦值都是非阻塞的,賦值按兩步進(jìn)行:仿真器計(jì)算所有RHS表達(dá)式的值,保存結(jié)果,并進(jìn)行調(diào)度在時(shí)序控制指定時(shí)間的賦值。在經(jīng)過(guò)相應(yīng)的延遲后,仿真器通過(guò)將保存的值賦給LHS表達(dá)式完成賦值。阻塞過(guò)程賦值非阻塞過(guò)程賦值過(guò)程賦值有兩類(lèi)非阻塞過(guò)程賦值(續(xù))modulenon_block1;

rega,b,c,d,e,f;initialbegin//blockingassignmentsa=#101;//time10b=#20;//time12c=#41;//time16endinitialbegin//non-blockingassignmentsd<=#101;//time10

e<=#20;//time2f<=#41;//time4endinitialbegin$monitor($time,,"a=%bb=%bc=%bd=%be=%bf=%b",a,b,c,d,e,f);#100$finish;endendmodule輸出結(jié)果:

0a=xb=xc=xd=xe=xf=x2a=xb=xc=xd=xe=0f=x4a=xb=xc=xd=xe=0f=110a=1b=xc=xd=1e=0f=112a=1b=0c=xd=1e=0f=116a=1b=0c=1d=1e=0f=1阻塞與非阻塞賦值語(yǔ)句行為差別舉例1非阻塞過(guò)程賦值(續(xù))阻塞與非阻塞賦值語(yǔ)句行為差別舉例2modulepipeMult(product,mPlier,mCand,go,clock);inputgo,clock;input[7:0]mPlier,mCand;output[15:0]product;reg[15:0]product;always@(posedgego)

product=repeat(4)@(posedgeclock)mPlier*mCand;endmodulemodulepipeMult(product,mPlier,mCand,go,clock);inputgo,clock;input[7:0]mPlier,mCand;output[15:0]product;reg[15:0]product;always@(posedgego)

product<=repeat(4)@(posedgeclock)mPlier*mCand;endmodule非阻塞過(guò)程賦值(續(xù))阻塞與非阻塞賦值語(yǔ)句行為差別舉例2波形非阻塞阻塞非阻塞過(guò)程賦值(續(xù))阻塞與非阻塞賦值語(yǔ)句行為差別舉例3modulefsm(cS1,cS0,in,clock);inputin,clock;outputcS1,cS0;regcS1,cS0;always@(posedgeclock)begincS1=in&cS0;//同步復(fù)位

cS0=in|cS1;//cS0=inendendmodulemodulefsm(cS1,cS0,in,clock);inputin,clock;outputcS1,cS0;regcS1,cS0;always@(posedgeclock)begincS1<=in&cS0;//同步復(fù)位

cS0<=in|cS1;//同步置位endendmoduleDFF同步復(fù)位DFF同步置位DFF非阻塞過(guò)程賦值(續(xù))舉例4:非阻塞賦值語(yǔ)句中延時(shí)在左邊和右邊的差別moduleexchange;reg[3:0]a,b;initialbegina=1;b=4;#2a=3;b=2;#20$finish;endinitial$monitor($time,"\t%h\t%h",a,b);initialbegin#5a<=b;#5b<=a;endendmodulemoduleexchange;reg[3:0]a,b;initialbegina=1;b=4;#2a=3;b=2;#20$finish;endinitial$monitor($time,"\t%h\t%h",a,b);initialbegina<=#5b;b<=#5a;endendmoduletimeab014232541timeab014232522條件語(yǔ)句(if分支語(yǔ)句)可以多層嵌套。在嵌套if序列中,else和前面最近的if相關(guān)。為提高可讀性及確保正確關(guān)聯(lián),使用begin…end塊語(yǔ)句指定其作用域。always#20

if(index>0)//開(kāi)始外層if

if(rega>regb)//開(kāi)始內(nèi)層第一層ifresult=rega;

elseresult=0;//結(jié)束內(nèi)層第一層if

else

if(index==0)begin$display("Note:Indexiszero");result=regb;end

else$display("Note:Indexisnegative");if

和if-else

語(yǔ)句:描述方式:if(表達(dá)式)

begin……endelsebegin……end條件語(yǔ)句(case分支語(yǔ)句)modulecompute(result,rega,regb,opcode);input[7:0]rega,regb;input[2:0]opcode;output[7:0]result;reg[7:0]result;always@(regaorregboropcode)case(opcode)3'b000:result=rega+regb;3'b001:result=rega-regb;3'b010,//specifymultiplecaseswiththesameresult3'b100:result=rega/regb;default:beginresult='bx;$display("nomatch");end

endcaseendmodulecase語(yǔ)句:在Verilog中重復(fù)說(shuō)明case項(xiàng)是合法的,因?yàn)閂erilog的case語(yǔ)句只執(zhí)行第一個(gè)符合項(xiàng)。條件語(yǔ)句-case語(yǔ)句case語(yǔ)句是測(cè)試表達(dá)式與另外一系列表達(dá)式分支是否匹配的一個(gè)多路條件語(yǔ)句。Case語(yǔ)句進(jìn)行逐位比較以求完全匹配(包括x和z)。Default語(yǔ)句可選,在沒(méi)有任何條件成立時(shí)執(zhí)行。此時(shí)如果未說(shuō)明default,Verilog不執(zhí)行任何動(dòng)作。多個(gè)default語(yǔ)句是非法的。重要內(nèi)容:使用default語(yǔ)句是一個(gè)很好的編程習(xí)慣,特別是用于檢測(cè)x和z。Casez和casex為case語(yǔ)句的變體,允許比較無(wú)關(guān)(don‘t-care)值。case表達(dá)式或case項(xiàng)中的任何位為無(wú)關(guān)值時(shí),在比較過(guò)程中該位不予考慮。在casez語(yǔ)句中,?和z被當(dāng)作無(wú)關(guān)值。在casex語(yǔ)句中,?,z和x被當(dāng)作無(wú)關(guān)值。case<表達(dá)式><表達(dá)式>,<表達(dá)式>:賦值語(yǔ)句或空語(yǔ)句;

<表達(dá)式>,<表達(dá)式>:賦值語(yǔ)句或空語(yǔ)句;

default:賦值語(yǔ)句或空語(yǔ)句;case語(yǔ)法:循環(huán)(looping)語(yǔ)句有四種循環(huán)語(yǔ)句:repeat:將一塊語(yǔ)句循環(huán)執(zhí)行確定次數(shù)。

repeat(次數(shù)表達(dá)式)<語(yǔ)句>while:在條件表達(dá)式為真時(shí)一直循環(huán)執(zhí)行

while(條件表達(dá)式)<語(yǔ)句>forever:重復(fù)執(zhí)行直到仿真結(jié)束

forever<語(yǔ)句>for:在執(zhí)行過(guò)程中對(duì)變量進(jìn)行計(jì)算和判斷,在條件滿(mǎn)足時(shí)執(zhí)行

for(賦初值;條件表達(dá)式;計(jì)算)<語(yǔ)句>綜合工具還不支持循環(huán)(looping)語(yǔ)句-repeatrepeat:將一塊語(yǔ)句循環(huán)執(zhí)行確定次數(shù)。

repeat(次數(shù)表達(dá)式)語(yǔ)句//Parameterizableshiftandaddmultipliermodulemultiplier(result,op_a,op_b);parametersize=8;input[size:1]op_a,op_b;output[2*size:1]result;

reg[2*size:1]shift_opa,result;

reg[size:1]shift_opb;always@(op_aorop_b)beginresult=0;

shift_opa=op_a;//零擴(kuò)展至16位

shift_opb=op_b;repeat(size)begin#10if(shift_opb[1])result=result+shift_opa;

shift_opa=shift_opa<<1;//Shiftleft

shift_opb=shift_opb>>1;//Shiftrightendendendmodule為什么要說(shuō)明一個(gè)shift_opb變量?...reg[7:0]tempreg;reg[3:0]count;...count=0;while(tempreg)//統(tǒng)計(jì)tempreg中1的個(gè)數(shù)

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

tempreg=tempreg>>1;//Shiftrightendend...循環(huán)(looping)語(yǔ)句while:只要表達(dá)式為真(不為0),則重復(fù)執(zhí)行一條語(yǔ)句(或語(yǔ)句塊)...reg

clk;initialbegin

clk=0;foreverbegin#10clk=1;#10clk=0;endend...循環(huán)(looping)語(yǔ)句forever:一直執(zhí)行到仿真結(jié)束

forever應(yīng)該是過(guò)程塊中最后一條語(yǔ)句。其后的語(yǔ)句將永遠(yuǎn)不會(huì)執(zhí)行。

forever語(yǔ)句不可綜合,通常用于testbench描述。這種行為描述方式可以非常靈活的描述時(shí)鐘,可以控制時(shí)鐘的開(kāi)始時(shí)間及周期占空比。仿真效率也高。//X檢測(cè)for(index=0;index<size;index=index+1)if(val[index]===1'bx)$display("foundanX");//存儲(chǔ)器初始化;“!=0”仿真效率高for(i=size;i!=0;i=i-1)memory[i-1]=0;//階乘序列factorial=1;for(j=num;j!=0;j=j-1)factorial=factorial*j;循環(huán)(looping)語(yǔ)句for:只要條件為真就一直執(zhí)行條件表達(dá)式若是簡(jiǎn)單的與0比較通常處理得更快一些。但綜合工具可能不支持與0的比較。行為級(jí)零延時(shí)循環(huán)當(dāng)事件隊(duì)列中所有事件結(jié)束后仿真器向前推進(jìn)。但在零延時(shí)循環(huán)中,事件在同一時(shí)間片不斷加入,使仿真器停滯后那個(gè)時(shí)片。在下面的例子中,對(duì)事件進(jìn)行了仿真但仿真時(shí)間不會(huì)推進(jìn)。當(dāng)always塊和forever塊中沒(méi)有時(shí)序控制時(shí)就會(huì)發(fā)生這種事情。modulecomparator(out,in1,in2);output[1:0]out;input[7:0]in1,in2;reg[1:0]out;alwaysif(in1==in2)out=2'b00;elseif(in1>in2)out=2'b01;elseout=2'b10;initial#10$finish;endmodule持續(xù)賦值(continuousassignment)可以用持續(xù)賦值語(yǔ)句描述組合邏輯,代替用門(mén)及其連接描述方式。持續(xù)賦值在過(guò)程塊外部使用。持續(xù)賦值用于net驅(qū)動(dòng)。持續(xù)賦值只能在等式左邊有一個(gè)簡(jiǎn)單延時(shí)說(shuō)明。只限于在表達(dá)式左邊用#delay形式持續(xù)賦值可以是顯式或隱含的。語(yǔ)法:<assign>[#delay][strength]<net_name>=<expressions>;wireout;assignout=a&b;//顯式wireinv=~in;//隱含持續(xù)賦值(continuousassignment)(續(xù))moduleassigns(o1,o2,eq,AND,OR,even,odd,one,SUM,COUT,a,b,in,sel,A,B,CIN);output[7:0]o1,o2;output[31:0]SUM;outputeq,AND,OR,even,odd,one,COUT;inputa,b,CIN;input[1:0]sel;input[7:0]in;input[31:0]A,B;wire[7:0]#3o2;//沒(méi)有說(shuō)明,但設(shè)置了延時(shí)

triAND=a&b,OR=a|b;//兩個(gè)隱含賦值

wire#10eq=(a==b);//隱含賦值,并說(shuō)明了延時(shí)

wire[7:0](strong1,weak0)#(3,5,2)o1=in;//強(qiáng)度及延時(shí)

assigno2[7:4]=in[3:0],o2[3:0]=in[7:4];//部分選擇

tri#5even=^in,odd=~^in;//延時(shí),兩個(gè)賦值

wireone=1’b1;//常數(shù)賦值

assign{COUT,SUM}=A+B+CIN;//給級(jí)聯(lián)賦值endmodule持續(xù)賦值的例子持續(xù)賦值(continuousassignment)(續(xù))隱含或顯式賦值給任何net類(lèi)型賦值給矢量net的位或部分賦值設(shè)置延時(shí)設(shè)置強(qiáng)度用級(jí)聯(lián)同時(shí)給幾個(gè)net類(lèi)變量賦值使用條件操作符使用用戶(hù)定義的函數(shù)的返回值可以是任意表達(dá)式,包括常數(shù)表達(dá)式in的值賦給o1,但其每位賦值的強(qiáng)度及延遲可能不同。如果o1是一個(gè)標(biāo)量(scalar)信號(hào),則其延遲和前面的條件緩沖器上的門(mén)延遲相同。對(duì)向量線(xiàn)網(wǎng)(net)的賦值上的延遲情況不同。0賦值使用下降延遲,Z賦值使用關(guān)斷延遲,所有其他賦值使用上升延遲。上面的例子顯示出持續(xù)賦值的靈活性和簡(jiǎn)單性。持續(xù)賦值可以:持續(xù)賦值(continuousassignment)(續(xù))從上面的例子可以看出,持續(xù)賦值的功能很強(qiáng)??梢允褂脳l件操作符,也可以對(duì)一個(gè)net多重賦值(驅(qū)動(dòng))。在任何時(shí)間里只有一個(gè)賦值驅(qū)動(dòng)MUX2到一個(gè)非三態(tài)值。如果所有驅(qū)動(dòng)都為三態(tài),則mux2缺省為一個(gè)上拉強(qiáng)度的1值。使用條件操作符的例子:modulecond_assigns(MUX1,MUX2,a,b,c,d);outputMUX1,MUX2;inputa,b,c,d;assignMUX1=sel==2'b00?a:

sel==2'b01?b:

sel==2'b10?c:d;

tri1MUX2=sel==0?a:’bz,MUX2=sel==1?b:’bz,MUX2=sel==2?c:’bz,MUX2=sel==3?d:’bz;endmodule復(fù)習(xí)問(wèn)題:在哪里放置always塊?forever循環(huán)呢?持續(xù)賦值通常給哪種類(lèi)型的邏輯建模?在begin…end之間使用非阻塞賦值和fork…join塊有哪些區(qū)別?Verilog中posedge是什么意思?Verilog中存在哪些條件結(jié)構(gòu)?解答:always是塊語(yǔ)句,在module內(nèi)使用。

forever循環(huán)是在過(guò)程塊、task或function內(nèi)使用。持續(xù)賦值只能給組合邏輯建模,因?yàn)樗麄冎话?jiǎn)單延遲。過(guò)程塊可以包含@和wait時(shí)序控制。fork…join塊可以使用等式左邊延遲可以包含并行語(yǔ)句(循環(huán),條件語(yǔ)句,任務(wù),系統(tǒng)任務(wù),事件觸發(fā)器),不僅僅是并行賦值。是典型的不可綜合語(yǔ)句

posedge是任何可能從低到高的跳變(0->1,0->z,0->x,z->x,x->z,z->1,x->1)。Case、if-else語(yǔ)句以及?:條件操作符。第12章

TUI調(diào)試進(jìn)入交互式仿真模式控制并觀察仿真瀏覽設(shè)計(jì)層次檢查(checkpointing)和退出仿真對(duì)設(shè)計(jì)進(jìn)行臨時(shí)修補(bǔ)動(dòng)態(tài)的單步及跟蹤仿真使用命令歷史列表學(xué)習(xí)內(nèi)容:在本章中將學(xué)習(xí)用Verilog-XLTUI(TextualUserInterface)和NCVerilogTUI調(diào)試術(shù)語(yǔ)及定義SHM

仿真歷史管理器(SimulationHistoryManager)。一個(gè)管理由SimWave顯示的仿真對(duì)象值數(shù)據(jù)跳變的工具CLI

Verilog-XL命令行界面(commandlineinterface),通過(guò)它你可以控制仿真并對(duì)Verilog過(guò)程語(yǔ)句執(zhí)行調(diào)試操作Tcl

工具命令語(yǔ)言(ToolCommandLanguage)。用于對(duì)交互式程序提出命令的腳本語(yǔ)言VCD (ValueChangeDump)。存儲(chǔ)對(duì)象值跳變數(shù)據(jù)的文件格式縱覽什么是CLI(CommandLineInterface)?一個(gè)允許輸入VerilogHDL過(guò)程命令的Verilog-XL仿真器的TUICLI命令是一個(gè)Verilog過(guò)程語(yǔ)句或語(yǔ)句塊。Verilog過(guò)程語(yǔ)句包括過(guò)程賦值,循環(huán),條件語(yǔ)句和任務(wù)以及功能調(diào)用??梢栽谝恍欣镙斎攵鄠€(gè)Verilog語(yǔ)句,語(yǔ)句之間由一個(gè)分號(hào)他開(kāi),如同在源代碼中那樣。Verilog-XL有源代碼調(diào)試命令,這些命令不在IEEE規(guī)范中,可以在Verilog描述中使用,但這不很必要。什么是Tcl(ToolCommandLanguage)一個(gè)對(duì)許多軟件工具包括NCVerilog的文本用戶(hù)界面。NCVerilog仿真器的面向?qū)ο蟮腡UI。一個(gè)Tcl命令包括一個(gè)或多個(gè)字(命令名,后面是命令的argument)。字之間由空格或tab分隔??梢栽谝粋€(gè)命令行中輸入多個(gè)命令,中間用分號(hào)分開(kāi)??梢詮木W(wǎng)上、技術(shù)參考書(shū)或圖書(shū)館得到標(biāo)準(zhǔn)Tcl命令的信息。NCVerilog有專(zhuān)用標(biāo)準(zhǔn)Tcl命令集擴(kuò)展用于設(shè)計(jì)調(diào)試(在ncsim命令窗口輸入)。本章將對(duì)大部分NCVerilog專(zhuān)用擴(kuò)展作簡(jiǎn)單描述。聯(lián)機(jī)文檔中有更詳細(xì)解釋。CLI和Tcl命令可以在命令行交互式輸入,也可以由源腳本或keyfile輸入。注意:?jiǎn)螕艄ぞ甙粹o或選擇菜單時(shí),SimVisionGUI自動(dòng)發(fā)出CLI和Tcl命令作出響應(yīng)。在本章中將通過(guò)實(shí)際調(diào)試CLI和Tcl的實(shí)例來(lái)學(xué)習(xí)二者的界面。進(jìn)入交互模式有三種方法中斷仿真,進(jìn)入交互模式:使用-s命令行選項(xiàng)在仿真前(時(shí)間0)停止仿真,立即進(jìn)入交互模式在仿真過(guò)程中輸入一個(gè)^C異步中斷到達(dá)一個(gè)斷點(diǎn)或在源代碼里的$stop系統(tǒng)任務(wù)。當(dāng)中斷Verilog-XL時(shí),仿真器進(jìn)入交互式模式并給出提示符:

C1>當(dāng)中斷NCVerilog時(shí),進(jìn)入交互式模式并給出提示符:

ncsim>此時(shí),仿真器暫時(shí)掛起??梢栽诿钚刑崾痉庉斎虢换ナ矫?,然后繼續(xù)仿真。進(jìn)入交互模式仿真器允許在離散的時(shí)間點(diǎn)中斷仿真并與設(shè)計(jì)進(jìn)行交流。有三種方法進(jìn)入交互模式:使用-s

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論