Verilog的可綜合描述風(fēng)格.ppt_第1頁
Verilog的可綜合描述風(fēng)格.ppt_第2頁
Verilog的可綜合描述風(fēng)格.ppt_第3頁
Verilog的可綜合描述風(fēng)格.ppt_第4頁
Verilog的可綜合描述風(fēng)格.ppt_第5頁
已閱讀5頁,還剩34頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Verilog的可綜合描述風(fēng)格,學(xué)習(xí)目標(biāo): 學(xué)習(xí)組合邏輯和時序邏輯的可綜合的描述風(fēng)格及技術(shù),包括:,不支持的Verilog結(jié)構(gòu) 過程塊 寄存器 敏感列表 持續(xù)賦值 綜合指導(dǎo) 條件結(jié)構(gòu),阻塞及非阻塞賦值 鎖存器/MUX推斷 函數(shù)function 任務(wù)task 復(fù)位 有限狀態(tài)機FSM 宏庫及設(shè)計復(fù)用,描述風(fēng)格簡介,如果邏輯輸出在任何時候都直接由當(dāng)前輸入組合決定,則為組合邏輯。 如果邏輯暗示存儲則為時序邏輯。如果輸出在任何給定時刻不能由輸入的狀態(tài)決定,則暗示存儲。 通常綜合輸出不會只是一個純組合或純時序邏輯。 一定要清楚所寫的源代碼會產(chǎn)生什么類型輸出, 并能夠反過來確定為什么所用的綜合工具產(chǎn)生這個輸出, 這是非常重要的。,不支持的Verilog結(jié)構(gòu),綜合工具通常不支持下列Verilog結(jié)構(gòu): initial 循環(huán): repeat forever while 非結(jié)構(gòu)化的for語句 數(shù)據(jù)類型: event real time,UDP forkjoin塊 wait 過程持續(xù)賦值: assign deassign force release 操作符: = = = ! = =,過程塊,任意邊沿 在所有輸入信號的任意邊沿進(jìn)入的過程塊產(chǎn)生組合邏輯。這種過程塊稱為組合塊。 always ( a or b) / 與門 y = a ,過程塊中的寄存器類型,若同步塊中使用一個reg,則: 如果在一個時鐘周期賦值并在另一個周期被采樣,則只能以硬件寄存器實現(xiàn)。 如果reg還是一個基本輸出,它會出現(xiàn)在綜合網(wǎng)表中,但不一定是一個硬件寄存器。 若兩者都不是,該信號可能被優(yōu)化掉。 若組合塊中使用一個reg,則: 如果reg值隨塊的任何一個輸入的變化而改變, 則在綜合時不會產(chǎn)生硬件寄存器。 如果reg值并不總是隨塊的輸入變化而改變,則綜合時會產(chǎn)生一個鎖存器。,同步寄存器舉例,在這個例子中,rega只作暫存,因此會被優(yōu)化掉。 module ex1reg (d, clk, q); input d, clk; output q; reg q, rega; always ( posedge clk) begin rega = 0; if (d) rega = 1; q = rega; end endmodule,在這個例子中,rega產(chǎn)生一個寄存器,不會被優(yōu)化掉。 module ex2reg (d, clk, q); input d, clk; output q; reg q, rega; always ( posedge clk) begin rega = 0; if (d) rega = 1; end always ( posedge clk) q = rega; endmodule,組合邏輯中的寄存器類型舉例,在這個例子中, y和rega總是賦新值, 因此產(chǎn)生一個純組合邏輯。 module ex3reg (y, a, b, c); input a, b, c; output y; reg y, rega; always ( a or b or c) begin if (a end endmodule,在這個例子中,rega不總是產(chǎn)生新值,因此會產(chǎn)生一個鎖存器,y是鎖存器的輸出 module ex4reg (y, a, b, c); input a, b, c; output y; reg y, rega; always ( a or b or c) begin if (a end endmodule,在下面的例子, rega是暫存變量,并被優(yōu)化掉,敏感列表,敏感表不完全: module sens (a, q, b, sl); input a, b, sl; output q; reg q; always ( sl) begin if (! sl) q = a; else q = b; end endmodule,完全的敏感列表 module sensc (q, a, b, sl); input a, b, sl; output q; reg q; always ( sl or a or b) begin if (! sl) q = a; else q = b; end endmodule,在下面的例子,a, b, sl是塊的輸入 sl用作條件 a、b用在過程賦值語句的右邊,將塊的所有輸入都列入敏感表是很好的描述習(xí)慣。不同的綜合工具對不完全敏感表的處理有所不同。有的將不完全敏感表當(dāng)作非法。其他的則產(chǎn)生一個警告并假設(shè)敏感表是完全的。在這種情況下,綜合輸出和RTL描述的仿真結(jié)果可能不一致。,敏感列表,將塊的所有輸入都列入敏感表是很好的描述習(xí)慣。不同的綜合工具對不完全敏感表的處理有所不同。有的將不完全敏感表當(dāng)作非法。其他的則產(chǎn)生一個警告并假設(shè)敏感表是完全的。在這種情況下,綜合輸出和RTL描述的仿真結(jié)果可能不一致。 上述兩例綜合結(jié)果(SYNOPSYS)相同,但RTL描述的仿真結(jié)果不同。也就是左邊的敏感表不完全的例子的RTL描述和綜合出的網(wǎng)表的仿真結(jié)果不同。,module sens_t; reg a, b, sl; sens u1(a, q, b, sl); sensc u2(qc, a, b, sl); initial begin $monitor($time,“ %b %b %b %b %b“, a, b, sl, q, qc); a =0;b=0;sl = 0; #10 a =1; #10 sl = 1; #10 sl = 0; #10 $finish; end endmodule,0 0 0 0 0 0 10 1 0 0 0 1 20 1 0 1 0 0 30 1 0 0 1 1,持續(xù)賦值,module orand (out, a, b, c, d, e); input a, b, c, d, e; output out; assign out = e endmodule,持續(xù)賦值驅(qū)動值到net上。因為驅(qū)動是持續(xù)的,所以輸出將隨任意輸入的改變而隨時更新,因此將產(chǎn)生組合邏輯。,過程持續(xù)賦值,module latch_quasi (q, en, d); input en, d; output q; reg q; always ( en) if (en) assign q = d; else deassign q; endmodule,過程持續(xù)賦值是在過程塊(always或initial)內(nèi)給一個寄存器數(shù)據(jù)類型進(jìn)行的持續(xù)賦值。這在大多數(shù)綜合工具中是非法的。,綜合指示,大多數(shù)綜合工具都能處理綜合指示。 綜合指示可以嵌在Verilog注釋中,因此他們在Verilog仿真時忽略,只在綜合工具解析時有意義。 不同工具使用的綜合指示在語法上不同。但其目的相同,都是在RTL代碼內(nèi)部進(jìn)行最優(yōu)化。 通常綜合指示中包含工具或公司的名稱。例如,下面介紹的Envisia Ambit synthesis工具的編譯指示都以ambit synthesis開頭。,綜合指示,這里列出部分Cadence綜合工具中綜合指示。這些與其他工具,如Synopsys Design Compiler,中的指示很相似。 / ambit synthesis on / ambit synthesis off / ambit synthesis case = full, parallel, mux 結(jié)構(gòu)指示 / ambit synthesis architecture = cla or rpl FSM指示 / ambit synthesis enum xyz / ambit synthesis state_vector sig state_vector_ flag,綜合指示 case指示,case語句通常綜合為一個優(yōu)先級編碼器,列表中每個case項都比后面的case項的優(yōu)先級高。 Case指示按下面所示指示優(yōu)化器:,/ambit synthesis case = parallel 建立并行的編碼邏輯,彼此無優(yōu)先級。 /ambit synthesis case = mux 若庫中有多路器,使用多路器建立編碼邏輯。 /ambit synthesis case = full 假定所有缺少的case項都是“無關(guān)”項,使邏輯更為優(yōu)化并避免產(chǎn)生鎖存器。,條件語句,自然完全的條件語句,module comcase (a, b, c, d, e); input a, b, c, d; output e; reg e; always ( a or b or c or d) case ( a, b) 2b11: e = d; 2b10: e = c; 2b01: e = 1b0; 2b00: e = 1b1; endcase endmodule,module compif (a, b, c, d, e); input a, b, c, d; output e; reg e; always ( a or b or c or d) if (a endmodule,例中定義了所有可能的選項,綜合結(jié)果是純組合邏輯,沒有不期望的鎖存器產(chǎn)生。,不完全條件語句,module inccase (a, b, c, d, e); input a, b, c, d; output e; reg e; always ( a or b or c or d) case ( a, b) 2b11: e = d; 2b10: e = c; endcase endmodule,module incpif (a, b, c, d, e); input a, b, c, d; output e; reg e; always ( a or b or c or d) if (a endmodule,在上面的例子中,當(dāng)a變?yōu)榱銜r,不對e賦新值。因此e保存其值直到a變?yōu)?。這是鎖存器的特性。,若 a 變?yōu)?0, e 為何值,default完全條件語句,module comcase (a, b, c, d, e); input a, b, c, d; output e; reg e; always ( a or b or c or d) case ( a, b) 2b11: e = d; 2b10: e = c; default: e = bx; endcase endmodule,module compif (a, b, c, d, e); input a, b, c, d; output e; reg e; always ( a or b or c or d) if (a endmodule,綜合工具將 bx作為無關(guān)值,因此if語句類似于“ full case”,可以進(jìn)行更好的優(yōu)化。 例中沒有定義所有選項,但對沒有定義的項給出了缺省行為。同樣,其綜合結(jié)果為純組合邏輯沒有不期望的鎖存器產(chǎn)生。,指示完全條件語句,module dircase (a, b, c, d); input b, c; input 1: 0 a; output d; reg d; always ( a or b or c) case (a) / ambit synthesis case = full 2b00: d = b; 2b01: d = c; endcase endmodule,和前例一樣,沒有定義所有case項,但綜合指示通知優(yōu)化器缺少的case項不會發(fā)生。結(jié)果也為純組合邏輯,沒有不期望鎖存器產(chǎn)生。注意如果缺少的case項發(fā)生,而其結(jié)果未定義,綜合結(jié)果和RTL的描述的行為可能不同。,case指示例外,module select (a, b, sl); input 1: 0 sl; output a, b; req a, b; always ( sl) case (sl) / ambit synthesis case = full 2b00: begin a = 0; b = 0; end 2b01: begin a = 1; b = 1; end 2b10: begin a = 0; b = 1; end 2b11: b = 1; default: begin a = bx; b = bx; end endcase endmodule,有時使用了case full指示,case語句也可能綜合出latch。 下面的描述綜合時產(chǎn)生了一個latch。,函數(shù),module orand (out, a, b, c, d, e); input a, b, c, d, e; output out; wire out; assign out = forand (a, b, c, d, e); function forand; input a, b, c, d, e; if (e = 1) forand = (a| b) endfunction endmodule,函數(shù)沒有時序控制,因此綜合結(jié)果為組合邏輯。函數(shù)可以在過程塊內(nèi)或持續(xù)賦值語句中調(diào)用。 下例中的or/and塊由持續(xù)賦值語句調(diào)用函數(shù)實現(xiàn),任務(wù),module orandtask (out, a, b, c, d, e); input a, b, c, d, e; output out; reg out; always ( a or b or c or d or e) orand (out, a, b, c, d, e); task orand; input a, b, c, d, e; output out; if (e = 1) out = (a| b) endtask endmodule,任務(wù)一般只在測試基準(zhǔn)使用,因為: 沒有時序控制的任務(wù)如同函數(shù) 帶有時序控制的任務(wù)不可綜合 下面是用任務(wù)描述的or/and塊:,鎖存器(latch)推斷,module latch (q, data, enable); input data, enable; output q; reg q; always ( enable or data) if (enable) q = data; endmodule,在always塊中,如果沒有說明所有條件,將產(chǎn)生latch。在下面的例子中,由于沒有定義enable為低電平時data的狀態(tài),因此enable為低電平時data的值必須保持,綜合時將產(chǎn)生一個存儲元件,同步反饋(feedback)推斷,有反饋 : module dffn (q, d, clk, en); input d, clk, en; output q; reg q; always ( negedge clk) if (en) q = d; endmodule,綜合工具一般不支持組合邏輯反饋,但支持同步反饋。 在同步過程塊中,如果條件語句的一個分支沒有給所有輸出賦值,則推斷出反饋。,無反饋: module dffn (q, d, clk, en); input d, clk, en; output q; reg q; always ( negedge clk) if (en) q = d; else q = bx; endmodule,帶使能的寄存器,module dffn (q, d, clk, en); input d, clk, en; output q; reg q; always ( negedge clk) if (en) q = d; endmodule,上述帶反饋的描述用于帶使能端的寄存器的描述。在寄存器的描述中,敏感列表是不完全的。,阻塞或非阻塞,使用的賦值類型依賴于所描述的邏輯類型: 在時序塊RTL代碼中使用非阻塞賦值 非阻塞賦值保存值直到時間片段的結(jié)束,從而避免仿真時的競爭情況或結(jié)果的不確定性 在組合的RTL代碼中使用阻塞賦值 阻塞賦值立即執(zhí)行,阻塞、非阻塞對比,非阻塞賦值語句并行執(zhí)行,因此臨時變量不可避免地在一個周期中被賦值,在下一個周期中被采樣。,module bloc (clk, a, b); input clk, a; output b; reg y; reg b; always ( posedge clk) begin y =a; b =y; end endmodule,module nonbloc (clk, a, b); input clk, a; output b; reg y; reg b; always ( posedge clk) begin y = a; b = y; end endmodule,復(fù)位,復(fù)位是可綜合編碼風(fēng)格的重要環(huán)節(jié)。狀態(tài)機中一般都有復(fù)位。,module sync( q, ck, r, d); input ck, d, rst; output q; reg q; always ( negedge ck) if (r) q = 0; else q = d; endmodule,module async( q, ck, r, d); input ck, d, r; output q; reg q; always ( negedge ck or posedge r) if (r) q = 0; else q = d; endmodule,同步復(fù)位,同步塊的異步復(fù)位,同步復(fù)位描述:在同步塊內(nèi),當(dāng)復(fù)位信號有效時,進(jìn)行復(fù)位操作;當(dāng)復(fù)位信號無效時,執(zhí)行該塊的同步行為。如果將復(fù)位信號作為條件語句的條件,且在第一個分支中進(jìn)行復(fù)位,綜合工具可以更容易的識別復(fù)位信號。 異步復(fù)位:在同步塊的敏感表中包含復(fù)位信號的激活邊沿。在塊內(nèi),復(fù)位描述方式與同步方式相同。,復(fù)位,下面的異步復(fù)位描述(異步復(fù)位和同步塊分開)是一種很不好的描述風(fēng)格,并且有的綜合工具不支持。在仿真中,如果r和ck在同一時刻改變,則結(jié)果不可確定。,module async( q, ck, r, d); input ck, d, r; output q; reg q; always ( negedge ck) if ( !r ) q = d; always ( posedge r) q = 0; endmodule,不好的異步復(fù)位描述方式,帶復(fù)位、置位的鎖存器latch,下面的例子給出了一個復(fù)雜一些的復(fù)位分支。由于是一個latch,因此敏感表是完全的。,module latch (q, enable, set, clr, d); input enable, d, set, clr; output q; reg q; always ( enable or set or clr or d) begin if (set) q = 1; else if (clr) q = 0; else if (enable) q = d; end endmodule,有限狀態(tài)機有兩種不同類型 顯式和隱式。 隱式狀態(tài)機用多個(posedge clk)語句指出狀態(tài)跳變。 隱式狀態(tài)機的抽象級比顯式狀態(tài)機高,通常不可綜合。 顯式狀態(tài)機用case語句顯式定義每個可能狀態(tài)。 通常,顯式狀態(tài)機用于可綜合代碼描述。,顯式有限狀態(tài)機,timescale 1ns/100ps module state4 (clock, reset, out); input reset, clock; output 1: 0 out; reg 1: 0 out; parameter /狀態(tài)變量枚舉 stateA = 2b00, stateB = 2b01, stateC = 2b10, stateD = 2b11; reg 1: 0 state; /狀態(tài)寄存器 reg 1: 0 nextstate; always ( posedge clock) if (reset) /同步復(fù)位 state = stateA; else state = nextstate;,always ( state) / 定義下一狀態(tài)的組合邏輯 case (state) stateA: begin nextstate = stateB; out = 2b00; / 輸出決定于當(dāng)前狀態(tài) end stateB: begin nextstate = stateC; out = 2b11; end stateC: begin nextstate = stateD; out = 2b10; end stateD: begin nextstate = stateA; out = 2b00; end endcase endmodule,有限狀態(tài)機FSM指導(dǎo),enum指導(dǎo) 狀態(tài)賦值枚舉,也用來將狀態(tài)賦值捆綁到狀態(tài)向量。 state_vector指導(dǎo) 定義狀態(tài)寄存器和編碼類型,狀態(tài)機的描述也有綜合指導(dǎo)。在RTL代碼中,F(xiàn)SM指導(dǎo)向優(yōu)化器傳遞狀態(tài)機有關(guān)的特性信息。 這些指導(dǎo)有:,FSM指導(dǎo),timescale 1ns/ 100ps module state4 (clock, reset, out); input reset, clock; output 1: 0 out; reg 1: 0 out; parameter /* ambit synthesis enum state_info */ stateA = 2b00, stateB = 2b01, stateC = 2b10, stateD = 2b11; reg 1: 0 /* ambit synthesis enum state_info */ state; reg 1: 0 /* ambit synthesis enum state_info */ nextstate; always ( posedge clock) /* ambit synthesis state_vector state -encoding one_hot */ if (reset) state = stateA; else state = nextstate; . . .,枚舉名稱定義,枚舉名稱限用于state、nextstate向量,定義狀態(tài)寄存器并指定編碼格式,資源共享,資源共享是指多節(jié)代碼共享一組邏輯。例如:,always ( a or b or c or d) if (a) out = b + c; else out = b + d;,沒有資源共享,資源共享,資源共享與所用綜合工具有關(guān)。但通常,要共享資源,表達(dá)式必須在同一個always塊中的同一個條件語句中。,資源共享,資源共享可以由RTL代碼控制。例如,可以改變編碼風(fēng)格強制資源共享。,if (a) out = b + c; else out = b + d;,原始代碼,強制資源共享,temp = a ? c : d; out = b + temp; 或 out = b + (a ? c : d);,復(fù)雜操作符,大多數(shù)工

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論