版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第十章高級Verilog設(shè)計不支持的Verilog結(jié)構(gòu)綜合工具通常不支持下列Verilog結(jié)構(gòu):initial循環(huán):
repeatforever
while(2001標(biāo)準(zhǔn)后支持但有限制)非結(jié)構(gòu)化的for語句數(shù)據(jù)類型:
eventrealtimeUDPfork…join塊
wait過程持續(xù)賦值:
deassignforcerelease操作符:
===!==持續(xù)賦值moduleorand(inputwirea,b,c,d,e,outputwireout);assignout=e&(a|b)&(c|d);endmodule
持續(xù)賦值驅(qū)動值到net上。因為驅(qū)動是持續(xù)的,所以輸出將隨任意輸入的改變而隨時更新,因此將產(chǎn)生組合邏輯。連續(xù)賦值語句assign#10D’=(A&B)|C;過程塊敏感列表任意邊沿在所有輸入信號的任意邊沿進(jìn)入的過程塊稱為組合塊。
always@(aorb)//與門
y=a&b;單個邊沿在一個控制信號的單個邊沿上進(jìn)入的過程塊產(chǎn)生同步邏輯。這種過程塊稱為同步塊。
always@(posedgeclk)//Dflip-flopq<=d;同步塊也可以對異步復(fù)位信號的變化產(chǎn)生敏感
always@(posedgeclkornegedgerst_)if(!rst_)q<=0;elseq<=d;敏感列表敏感表不完全:modulesens(q,a,b,sl);inputa,b,sl;outputq;regq;always@(sl)beginif(!sl)q=a;elseq=b;endendmodule完全的敏感列表modulesensc(q,a,b,sl);inputa,b,sl;outputq;regq;always@(sloraorb)beginif(!sl)q=a;elseq=b;endendmodule在下面的例子,a,b,sl是塊的輸入
sl用作條件,a、b用在過程賦值語句的右邊將塊的所有輸入都列入敏感表是很好的描述習(xí)慣。不同的綜合工具對不完全敏感表的處理有所不同。有的將不完全敏感表當(dāng)作非法。其他的則產(chǎn)生一個警告并假設(shè)敏感表是完全的。在這種情況下,綜合輸出和RTL描述的仿真結(jié)果可能不一致。always塊可以描述時序邏輯也可以描述組合邏輯敏感變量表中不能同時包含沿事件和非沿事件敏感變量表必須完整always@(AorBorC)D=(A&B)|C;敏感變量表不完整的影響always@(AorB)D=(A&B)|C;敏感變量表不同的影響(一)rega;always@(posedgeclkornegedgerst)beginif(!rst)a<=1’b0;elsea<=b;end敏感變量表不同的影響(二)rega;always@(posedgeclk)beginif(!rst)a<=1’b0;elsea<=b;endLatch任意邊沿在所有輸入信號的任意邊沿進(jìn)入的過程塊稱為組合塊。
always@(aorb) y=a&b;采用阻塞賦值語句可能產(chǎn)生組合邏輯或鎖存器過程賦值語句產(chǎn)生組合邏輯IF或CASE語句可能產(chǎn)生鎖存器moduleDFF(q,qb,d,clk,clr);outputq,qb;inputd,//inputdataclk,/*inputclock*/clr;regq;wireqb,d,clk,clr;assignqb=!q;always@(a,b,c…)begin
過程賦值語句;高級描述語句
if語句;
case語句;循環(huán)語句;
endendmodule鎖存器(latch)推斷modulelatch(q,data,enable);inputwiredata,enable;outputregq;
always@(enable,data)if(enable)q=data;endmodule在always塊中,條件語句如果沒有說明所有條件,將產(chǎn)生latch。在下面的例子中,由于沒有定義enable為低電平時data的狀態(tài),因此enable為低電平時data的值必須保持,綜合時將產(chǎn)生一個鎖存器條件語句自然完全的條件語句modulecomcase(inputwirea,b,c,d,outputrege);
always@(aorborcord)case({a,b})2'b11:e=d;2'b10:e=~c;2'b01:e=1'b0;2'b00:e=1'b1;endcaseendmodulemodulecompif(inputwirea,b,c,d,outputrege);
always@(aorborcord)if(a&b)e=d;elseif(a&~b)e=~c;elseif(~a&b)e=1'b0;elseif(~a&~b)e=1'b1;endmodule
例中定義了所有可能的選項,綜合結(jié)果是純組合邏輯,沒有不期望的鎖存器產(chǎn)生。不完全條件語句moduleinccase(inputwirea,b,c,d,outputrege);
always@(aorborcord)case({a,b})2'b11:e=d;2'b10:e=~c;endcaseendmodulemoduleincpif(inputwirea,b,c,d,outputrege);
always@(aorborcord)if(a&b)e=d;elseif(a&~b)e=~c;endmodule在上面的例子中,當(dāng)a變?yōu)榱銜r,不對e賦新值。因此e保存其值直到a變?yōu)?。這是鎖存器的特性。若a變?yōu)?,e為何值default完全條件語句modulecomcase(inputwirea,b,c,d,outputrege);
always@(a,b,c,d)case({a,b})2'b11:e=d;2'b10:e=~c;
default:e='bx;endcaseendmodulemodulecompif(inputwirea,b,c,d,outputrege);always@(a,b,c,d)if(a&b)e=d;elseif(a&~b)e=~c;
elsee='bx;endmodule
綜合工具將‘bx作為無關(guān)值,因此if語句類似于“fullcase”,可以進(jìn)行更好的優(yōu)化。例中沒有定義所有選項,但對沒有定義的項給出了缺省行為。同樣,其綜合結(jié)果為純組合邏輯——沒有不期望的鎖存器產(chǎn)生。指示完全條件語句moduledircase(a,b,c,d);inputb,c;input[1:0]a;outputregd;
always@(aorborc)case(a)//
ambitsynthesiscase=full2'b00:d=b;2'b01:d=c;endcaseendmodule
和前例一樣,沒有定義所有case項,但綜合指令通知優(yōu)化器缺少的case項不會發(fā)生。結(jié)果也為純組合邏輯,沒有不期望鎖存器產(chǎn)生。注意如果缺少的case項發(fā)生,而其結(jié)果未定義,綜合結(jié)果和RTL的描述的行為可能不同。綜合指令舉例這里列出部分Cadence綜合工具中綜合指令。這些與其他工具,如SynopsysDesignCompiler,中的指令很相似。
//ambitsynthesison//ambitsynthesisoff//ambitsynthesiscase=full,parallel,mux結(jié)構(gòu)指令
//ambitsynthesisarchitecture=claorrplFSM指令
//ambitsynthesisenumxyz//ambitsynthesisstate_vectorsigstate_vector_flag綜合指令—case指示case語句通常綜合為一個優(yōu)先級編碼器,列表中每個case項都比后面的case項的優(yōu)先級高。Case指令按下面所示指示優(yōu)化器://ambitsynthesiscase=parallel建立并行的編碼邏輯,彼此無優(yōu)先級。//ambitsynthesiscase=mux若庫中有多路器,使用多路器建立編碼邏輯。//ambitsynthesiscase=full假定所有缺少的case項都是“無關(guān)”項,使邏輯更為優(yōu)化并避免產(chǎn)生鎖存器。case指示例外moduleselect(inputwire[1:0]sl,outputrega,b);
always@(sl)case(sl)//ambitsynthesiscase=full2b'00:begina=0;b=0;end2b'01:begina=1;b=1;end2b'10:begina=0;b=1;end2b'11:b=1;default:begina='bx;b='bx;endendcaseendmodule有時使用了casefull指示,case語句也可能綜合出latch。下面的描述綜合時產(chǎn)生了一個latch。要求:條件語句中各分支的賦值對象一致。moduleselect(inputwrie[1:0]sl,outputrega,b);
always@(sl)if(sl) a=0;else b=1;endmodule函數(shù)的可綜合性moduleorand(inputa,b,c,d,e,
outputwireout);assignout=forand(a,b,c,d,e);functionforand;inputa,b,c,d,e;if(e==1)forand=(a|b)&(c|d);elseforand=0;endfunctionendmodule
函數(shù)沒有時序控制,因此綜合結(jié)果為組合邏輯。函數(shù)可以在過程塊內(nèi)或持續(xù)賦值語句中調(diào)用。下例中的or/and塊由持續(xù)賦值語句調(diào)用函數(shù)實現(xiàn)任務(wù)moduleorandtask(out,a,b,c,d,e);inputa,b,c,d,e;outputout;regout;always@(aorborcordore)orand(out,a,b,c,d,e);taskorand;inputa,b,c,d,e;outputout;if(e==1)out=(a|b)&(c|d);elseout=0;endtaskendmodule任務(wù)一般只在測試程序中使用,因為:
帶有時序控制的任務(wù)不可綜合下面是用任務(wù)描述的or/and塊:第二部分高性能編碼技術(shù)if語句modulesingle_if(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)beginif(sel[3])z=d;elseif(sel[2])z=c;elseif(sel[1])z=b;elseif(sel[0])z=a;elsez=0;endendmodulemodulemult_if(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)beginz=0;if(sel[0])z=a;if(sel[1])z=b;if(sel[2])z=c;if(sel[3])z=d;endendmodule例1.1a單個
if語句例1.1b多重
if語句注意代碼的優(yōu)先級推薦方式if語句的電路結(jié)構(gòu)case語句modulecase1(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)begin
casex(sel)4'b1xxx:z=d;4'bx1xx:z=c;4'bxx1x:z=b;4'bxxx1:z=a;default:z=1'b0;endcaseendendmodulecasex具有使用無關(guān)項的優(yōu)點,不用列出sel的所有組合。例1.2case
語句例中case語句的電路結(jié)構(gòu)晚到達(dá)信號處理
設(shè)計時通常知道哪一個信號到達(dá)的時間要晚一些。這些信息可用于構(gòu)造HDL,使到達(dá)晚的信號離輸出近一些。下面的例子中,針對晚到達(dá)信號重新構(gòu)造if和case語句,以提高邏輯性能。晚到達(dá)的是數(shù)據(jù)信號-無優(yōu)先級
順序if語句可以根據(jù)關(guān)鍵信號構(gòu)造HDL。在例1.1a中,輸入信號d處于選擇鏈的最后一級,也就是說d最靠近輸出。假如信號b_is_late是晚到達(dá)信號,我們就要重新構(gòu)造例1.1a使其最優(yōu)化。原if結(jié)構(gòu)modulesingle_if(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)beginif(sel[1])z=b_is_late;elseif(sel[3])z=d;elseif(sel[2])z=c;elseif(sel[0])z=a;elsez=0;endendmodule后if結(jié)構(gòu)modulesingle_if(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)beginif(sel[3])z=d;elseif(sel[2])z=c;elseif(sel[1])z=b;elseif(sel[0])z=a;elsez=0;endendmodule晚到達(dá)的是數(shù)據(jù)信號-保持優(yōu)先級
順序if語句可以根據(jù)關(guān)鍵信號構(gòu)造HDL。在例1.1a中,輸入信號d處于選擇鏈的最后一級,也就是說d最靠近輸出。假如信號b_is_late是晚到達(dá)信號,我們就要重新構(gòu)造例1.1a使其最優(yōu)化。modulemult_if_improved(a,b_is_late,c,d,sel,z);inputa,b_is_late,c,d;input[3:0]sel;outputz;regz,z1;always@(aorb_is_lateorcordorsel)beginif(sel[1]&~(sel[2]|sel[3]))z=b_is_late;elseif(sel[3])z=d;elseif(sel[2])z=c;elseif(sel[0])z=a;elsez=0;endendmodule保持優(yōu)先級的if結(jié)構(gòu)原if結(jié)構(gòu)modulesingle_if(a,b,c,d,sel,z);inputa,b,c,d;input[3:0]sel;outputz;regz;always@(aorborcordorsel)beginif(sel[3])z=d;elseif(sel[2])z=c;elseif(sel[1])z=b;elseif(sel[0])z=a;elsez=0;endendmodule晚到達(dá)的是數(shù)據(jù)信號晚到達(dá)的是控制信號
如果晚到達(dá)信號作為if語句條件分支的條件,也應(yīng)使這個信號離輸出最近。在下面的例子中,CTRL_is_late是晚到達(dá)的控制信號modulesingle_if_late(A,C,CTRL_is_late,Z);input[6:1]A;input[5:1]C;inputCTRL_is_late;outputZ;regZ;always@(CorAorCTRL_is_late)if(C[1]==1'b1)Z=A[1];elseif(C[2]==1'b0)Z=A[2];elseif(C[3]==1'b1)Z=A[3];elseif(C[4]==1'b1&&CTRL_is_late==1'b0)//if條件中晚到達(dá)的信號
Z=A[4];elseif(C[5]==1'b0)Z=A[5];elseZ=A[6];
endmodule晚到達(dá)的是控制信號modulesingle_if_late(A,C,CTRL_is_late,Z);input[6:1]A;input[5:1]C;inputCTRL_is_late;outputZ;regZ;always@(CorAorCTRL_is_late)
//if條件中晚到達(dá)的信號
if(C[4]==1'b1&&CTRL_is_late==1'b0)Z=A[4];elseif(C[1]==1'b1)Z=A[1];elseif(C[2]==1'b0)Z=A[2];elseif(C[3]==1'b1)Z=A[3];elseif(C[5]==1'b0)Z=A[5];elseZ=A[6];
endmoduleif-case嵌套語句modulecase_in_if_01(A,DATA_is_late_arriving,C,sel,Z);input[8:1]A;inputDATA_is_late_arriving;input[2:0]sel;input[5:1]C;outputZ;regZ;always@(selorCorAorDATA_is_late_arriving)if(C[1])Z=A[5];elseif(C[2]==1'b0)Z=A[4];elseif(C[3])Z=A[1];elseif(C[4])case(sel)3'b010:Z=A[8];3'b011:Z=DATA_is_late_arriving;3'b101:Z=A[7];3'b110:Z=A[6];default:Z=A[2];endcaseelseif(C[5]==1'b0)Z=A[2];elseZ=A[3];endmoduleif-case嵌套語句—修改后always@(selorCorAorDATA_is_late_arriving)beginif(C[1])Z1=A[5];elseif(C[2]==1’b0)Z1=A[4];elseif(C[3])Z1=A[1];elseif(C[4])case(sel)3'b010:Z1=A[8];//3'b011:Z1=DATA_is_late_arriving;3'b101:Z1=A[7];3'b110:Z1=A[6];default:Z1=A[2];endcaseelseif(C[5]==1'b0)Z1=A[2];elseZ1=A[3];FIRST_IF=(C[1]==1'b1)||(C[2]==1'b0)||(C[3]==1'b1);
if(!FIRST_IF&&C[4]&&(sel==3'b011))Z=DATA_is_late_arriving;elseZ=Z1;endif-case嵌套語句Case語句if語句if-case嵌套語句
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 1 Festivals and celebrations Reading and thinking 說課稿 -2024-2025學(xué)年人教版(2019)高中英語必修第三冊
- 三年級數(shù)學(xué)計算題專項練習(xí)及答案集錦
- 四年級數(shù)學(xué)(四則混合運算)計算題專項練習(xí)與答案
- 房產(chǎn)抵押借款合同書
- 游泳教學(xué)中的學(xué)生自我保護(hù)能力培養(yǎng)
- 戰(zhàn)略合作協(xié)議書
- 2025年滬教版七年級歷史下冊階段測試試卷含答案
- 2025年上教版八年級科學(xué)上冊階段測試試卷含答案
- 2025年人教B版九年級化學(xué)下冊階段測試試卷含答案
- 2025年新科版必修2物理上冊月考試卷含答案
- 中央2025年國務(wù)院發(fā)展研究中心有關(guān)直屬事業(yè)單位招聘19人筆試歷年參考題庫附帶答案詳解
- 外呼合作協(xié)議
- 小學(xué)二年級100以內(nèi)進(jìn)退位加減法800道題
- 2025年1月普通高等學(xué)校招生全國統(tǒng)一考試適應(yīng)性測試(八省聯(lián)考)語文試題
- 《立式輥磨機用陶瓷金屬復(fù)合磨輥輥套及磨盤襯板》編制說明
- 保險公司2025年工作總結(jié)與2025年工作計劃
- 育肥牛購銷合同范例
- 暨南大學(xué)珠海校區(qū)財務(wù)辦招考財務(wù)工作人員管理單位遴選500模擬題附帶答案詳解
- DB51-T 2944-2022 四川省社會組織建設(shè)治理規(guī)范
- 2024北京初三(上)期末英語匯編:材料作文
- 2024年大型風(fēng)力發(fā)電項目EPC總承包合同
評論
0/150
提交評論