EDA技術與應用教程(Verilog HDL版)(第3版)課件 63 Verilog設計與綜合中的陷阱_第1頁
EDA技術與應用教程(Verilog HDL版)(第3版)課件 63 Verilog設計與綜合中的陷阱_第2頁
EDA技術與應用教程(Verilog HDL版)(第3版)課件 63 Verilog設計與綜合中的陷阱_第3頁
EDA技術與應用教程(Verilog HDL版)(第3版)課件 63 Verilog設計與綜合中的陷阱_第4頁
EDA技術與應用教程(Verilog HDL版)(第3版)課件 63 Verilog設計與綜合中的陷阱_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Verilog數(shù)字系統(tǒng)設計與實踐第10章

Verilog設計與綜合中的陷阱學習指南知識目標】(1)理解并掌握阻塞語句與非阻塞語句區(qū)別(2)理解并掌握Always中敏感變量不完全時候產(chǎn)生的前后仿真不一致(3)理解并掌握鎖存器的的無意識產(chǎn)生的幾種情況(在使用if/case對組合邏輯描述、組合邏輯反饋等),了解鎖存器的危害所帶來的危害。(3)了解組合邏輯反饋并注意在設計中避免組合邏輯反饋(4)了解for語句在可綜合邏輯中的意義(5)理解優(yōu)先級編碼和并行編碼的實現(xiàn)機制(6)理解同步復位和異步復位的實現(xiàn)原理及各自優(yōu)點與缺陷危害【技能目標】(1)學會通過好的設計規(guī)范避免出現(xiàn)前后仿真的不一致性(2)掌握Verilog綜合中鎖存器與寄存器的區(qū)別,能夠通過代碼分析鎖存器,避免鎖存器的設計(3)學會使用for語句實現(xiàn)多個相同的邏輯塊(4)學會根據(jù)需要設計具有優(yōu)先級編碼和并行編碼的電路(5)學會同步復位和異步復位的設計,學會使用改進的復位電路進行設計(6)能夠根據(jù)本章列舉Design-Rule進行Verilog設計學習指南【重點難點】(1)阻塞語句與非阻塞語句區(qū)別,學習時,一定要仔細體會例子,并通過實際仿真進行驗證(2)鎖存器的無意識綜合是本章的另外一個難點,需要從電路角度了解其本質(zhì),并結合綜合和仿真工具進行理解(3)復位電路設計是Verilog設計中比較容易忽略的問題,我們列出器陷進與改進,需要在學習中需要重點理解。10.1阻塞語句與非阻塞語句

通常在VerilogHDL設計規(guī)范中有兩條著名的規(guī)范:VerilogHDL組合邏輯描述中使用Blocking賦值VerilogHDL時序邏輯描述中使用Non-Blocking賦值10.1.1阻塞語句阻塞語句用操作符號(”=”)進行連接,起基本語法格式如下:寄存器變量(reg)=表達式/變量阻塞語句包括兩層含義:一是阻塞語句中RHS變量或者表達式的賦值不會被其他Verilog語句打斷,這就是說多個阻塞語句順序出現(xiàn)是,前面的語句將會完全阻塞后面的動作,直到前面語句被執(zhí)行結束,即執(zhí)行的順序性。二是在語句中RHS對LHS賦值的動作不能插入任何其他的動作,單步完成賦值。10.1.2非阻塞語句非阻塞語句用操作符號(”<=”)進行連接,起基本語法格式如下:寄存器變量(reg)<=表達式/變量10.1阻塞語句與非阻塞語句

非阻塞語句包括兩層含義:一是在仿真開始時刻,計算非阻塞語句中RHS表達式的值,在仿真結束時刻才對LHS中變量進行更新。這就是說,在某一非阻塞語句的RHS和LHS的更新過程中,其他非阻塞Verilog語句的RHS表達式也可以被執(zhí)行。二是對于一個含有多條非阻塞語句的進程中,前面的語句并不會阻塞后面語句的執(zhí)行。10.2敏感變量的不完備性

圖10.7Example_10_5電路綜合結果

【例10.5】我們看下面的代碼,這是一個用Verilog描述的一個7位加法器電路,對應的測試代碼為tb_non_complete_sens_var,其電路綜合結果如圖10.7所示,o_sum_ab作為i_a和i_b的和輸出,o_a_out直接透傳i_a的值,這是一個組合邏輯電路。//example_10_5//敏感變量不完整所產(chǎn)生的前后仿真不匹配//`timescale1ns/1psmodulenon_complete_sens_var

(input[7:0]i_a,input[7:0]i_b,outputreg[7:0]o_a_out,outputreg[7:0]o_sum_ab);

10.2敏感變量的不完備性

always@(i_b)begin

o_a_out=i_a;//Non-Blockassignment

o_and_ab=i_a+i_b;endEndmodule//Testbenchfornon_complete_sens_var//`timescale1ns/1psmoduletb_non_complete_sens_var();

reg[7:0]i_a;

reg[7:0]i_b;wire[7:0]o_a_out;wire[7:0]o_and_ab;

non_complete_sens_var

u_non_complete_sens_var

10.2敏感變量的不完備性

(.i_a (i_a ), .i_b (i_b ),.o_a_out (o_a_out ),.o_sum_ab (o_sum_ab ));initialbegin

i_a=8'h00;

i_b=8'h00;#10;

i_a=8'h10;#10;

i_b=8'h10;#10;$finish;end

endmodule10.2敏感變量的不完備性

圖10.8Example_10_5non_complete_sens_var電路仿真結果10.3鎖存器(Latch)的產(chǎn)生與危害

無意識鎖存器產(chǎn)生的主要原因有兩個:一是在設計組合邏輯中使用不完整的條件判斷語句,即有if沒有else,而是在設計組合邏輯中使用不完整的case語句;另外一個是設計中使用到了組合邏輯反饋等異步邏輯。兩個潛在的缺陷將出現(xiàn)在鎖存器的應用中:1.噪聲與毛刺輸入;2.鎖存enalbe端的毛刺例10.6】我們看下面一個例子關于寄存器總線讀取數(shù)據(jù),原本的設計思路是希望在信號i_read_en有效(電平為高)時把數(shù)據(jù)讀出,無效時不管,然而確沒有注意到這是一個多路選擇的組合邏輯,對于每一個條件分支都應該有確定的輸出,也就是說,當i_read_en無效(電平為低)時,也應該給一個確定的輸出。首先看第一個if,這里的判決條件是i_read_en,只有i_read_en為高時,o_mux_out才有輸出,當o_mux_out為低時,綜合器將認為這個時候需要鎖存之前在的i_read_en有效時o_mux_out所接收到的值,一個無意識的鎖存器就產(chǎn)生了。10.3鎖存器(Latch)的產(chǎn)生與危害

//example_10_6://這是一個無意識鎖存器產(chǎn)生的例子,希望在設計中能夠避免modulereg_bus_read_mux

(inputi_read_en,inputi_addr,inputi_reg_a,inputi_reg_b,outputreg

o_mux_out

);

//注意:所有RHS都必須放在always得敏感變量中

always@(i_read_enori_addrori_reg_aori_reg_b)beginif(i_read_en)beginif(i_addr==1'b0)begin

o_mux_out=i_reg_a;end

10.3鎖存器(Latch)的產(chǎn)生與危害

elseif(i_addr==1'b1)begin

o_mux_out=i_reg_b;endendendendmodule圖10.10

代碼example_10_6電路綜合

10.4組合邏輯反饋

組合邏輯反饋環(huán)路是數(shù)字同步邏輯設計的大忌,它最容易因振蕩、毛刺、時序違規(guī)等問題引起整個系統(tǒng)的不穩(wěn)定和不可靠。組合邏輯反饋環(huán)路是二種高風險的設計方式,主要原因如下:1.組合反饋環(huán)的邏輯功能完全依賴于其反饋環(huán)路上組合邏輯的門延時和布線延時等,如果這些傳播延時有任何改變,則該組合反饋環(huán)單元的整體邏輯功能將徹底改變,而且改變后的邏輯功能很難確定。2.組合反饋環(huán)的時序分析是無窮循環(huán)的時序計算,綜合、實現(xiàn)等EDA工具迫不得已一般必須主動割斷其時序路徑,以完成相關的時序計算。而不同的EDA工具對組合反饋環(huán)的處理方法各不相同,所以組合反饋環(huán)的最終實現(xiàn)結果有很多不確定因素。3.通常的綜合工具(synplify_pro)在處理組合邏輯反饋問題時,將產(chǎn)生Latch,這將對時序造成許多問題?!纠?0.8】這是一個組合邏輯反饋的例子,o_mux根據(jù)輸入條件i_sel進行選擇,當i_sel=0,選擇i_a作為輸出,當i_sel=1,選擇i_b作為輸出,當i_sel為其他值時候,設計試圖通過組合邏輯反饋使輸出能夠保留原來的值,這個時候問題就出現(xiàn)了,由于使用了組合邏輯的反饋,綜合工具會將把o_mux當作鎖存器(Latch)輸出,而不會產(chǎn)生反饋邏輯。10.4組合邏輯反饋

//example_10_8://這是一個組合邏輯反饋的例子,設計中應當避免modulecomb_fead_back(input[1:0]i_sel,inputi_a,inputi_b,outputreg

o_mux);always@(i_selori_aori_b)beginif(i_sel==2'b00)begin

o_mux=i_a;endelseif(i_sel==2'b01)begin

o_mux=i_b;endelsebegin

o_mux=o_mux;end

10.4組合邏輯反饋

endendmodule圖10.11

代碼example_10_8組合邏輯反饋產(chǎn)生的電路結果10.5

For循環(huán)

【例10.9】看下面一個組合邏輯并行加法的例子,當將for循環(huán)展開時,就變成“sum[0]=add_a[0]+add_b[0]”和“sum[1]=add_a[1]+add_b[1]”,這就是完成一個并行加法,用for循環(huán)語句完成電路功能的復制,該代碼的電路如圖10.13所示。//example_10_9ParallelAddersynthesisizedbyforloopmoduleparal_add_for_synth(input[7:0]i_add_a0,input[7:0]i_add_a1,

input[7:0]i_add_b0,input[7:0]i_add_b1,

output[7:0]o_sum_b0,output[7:0]o_sum_b1,);wire[7:0]add_a[1:0];wire[7:0]add_b[1:0];

reg[7:0]sum[1:0];

10.5

For循環(huán)

integeri;assignadd_a[1]=i_add_a0;assignadd_a[0]=i_add_a1;assignadd_b[1]=i_add_b0;assignadd_b[0]=i_add_b1;assigno_sum_b0=sum[1];assigno_sum_b1=sum[0];always@(add_a[1]oradd_a[0]oradd_b[1]oradd_b[0])beginfor(i=0;i<2;i=i+1)begin

sum[i]=add_a[i]+add_b[i];endendendmodule10.5

For循環(huán)

圖10.13example_10_9并行加法的電路圖10.6優(yōu)先級與并行編碼

【例10.10】在代碼example_10_10的priority_mux中,如果輸入選擇控制字i_sel的bit0置位,輸入i_din[0]將被選作輸出。如果i_sel的bit0未被置位,這個時候i_sel的其他位將決定選擇i_din的某個位輸出到寄存器。只有當i_sel中前面的位未被置1時,后面的才有機會選通,這就是優(yōu)先級編碼,其電路結構如圖10.14所示。圖10.14example_10_10優(yōu)先級編碼的電路結構圖//example_10_10//帶優(yōu)先級編碼器modulepriority_mux(inputi_clk,input[3:0]i_din,input[3:0]i_sel,outputreg

o_mux_out);always@(posedge

i_clk)beginif(i_sel[0])begin

o_mux_out<=i_din[0];end

10.6優(yōu)先級與并行編碼

elseif(i_sel[1])begin

o_mux_out<=i_din[1];endelseif(i_sel[2])begin

o_mux_out<=i_din[2];endelseif(i_sel[3])begin

o_mux_out<=i_din[3];endelsebegin

o_mux_out<=o_mux_out;endendendmodule圖10.14example_10_10優(yōu)先級編碼的電路結構圖10.7多路控制分支結構

【例10.12】在代碼example_10_12中,o_dat分別在不同的判決條件下被賦予不同的值,即如果條件i_ctrl1成立,輸入數(shù)據(jù)i_dat1被賦予o_dat,i_ctrl2成立時,輸入數(shù)據(jù)i_dat2也被賦予o_dat。通常,判決條件i_ctrl1和i_ctrl2并不一定就是互斥的,這個時候代碼就具有模糊性,對于綜合工具而言,必須在實現(xiàn)之前作出假定,尤其在兩個條件都同時成立的條件下,綜合工具往往會根據(jù)條件出現(xiàn)的順序確定優(yōu)先級。具體就是出現(xiàn)在越后面的條件,其優(yōu)先級就越高(并不是所有綜合工具都這樣)。對于example_10_12中的代碼而言,i_ctrl2優(yōu)先級最高,當把控制條件放置順序交換時,優(yōu)先級也會相應的交換。這一點和if-else結構優(yōu)點不同,if-else機構是出現(xiàn)在越前面的語句優(yōu)先級越高。圖10.17是上面代碼的在synplify下綜合后的電路圖,i_ctrl2優(yōu)先級高于i_ctrl1://example_10_12,multiple_branch//多路控制分支結構,壞的代碼風格modulemultiple_branch(outputreg

o_dat,inputi_clk,inputi_dat1,inputi_dat2,

10.7多路控制分支結構

inputi_ctrl1,inputi_ctrl2);always@(posedge

i_clk)beginif(i_ctrl1)o_dat<=i_dat1;if(i_ctrl2)o_dat<=i_dat2;end圖10.17example_10_12多路分支的電路實現(xiàn)10.8復位電路設計問題與改進

10.8.1同步復位電路在同步復位中,復位信號作為組合邏輯的一部分影響到寄存器的狀態(tài)。同步復位基于這樣一個事實:只有在時鐘的邊沿處(上升或者下降),才能有效的將寄存器復位到初始狀態(tài)。圖10.18

同步復位計數(shù)器電路原理圖

endmodule【例10.13】Example_11_13描述了一個同步復位計數(shù)器的例子。從其所描述的電路中(圖10-18)可以看出,復位信號與輸入邏輯組合作為寄存器的輸入端,注意到這里同步復位增加了組合邏輯的延遲,降低了設計速度,關于設計速度的問題將在后面的章節(jié)提到。//example_10_13sync_reset_cnt//同步復位計數(shù)器modulesync_reset_cnt(inputi_clk,inputi_rst_n,input[7:0]i_din,inputi_load,outputreg[7:0]o_dout

10.8復位電路設計問題與改進

圖10.18

同步復位計數(shù)器電路原理圖

);always@(posedge

i_clk)beginif(~i_rst_n)begin

o_dout<=8'd0;endelsebeginif(i_load)begin

o_dout<=i_din;endelse

o_dout<=o_dout+8'd1;endendendendmodule圖10.18

同步復位計數(shù)器電路原理圖10.8復位電路設計問題與改進

圖10.18

同步復位計數(shù)器電路原理圖

10.8.2異步復位電路

異步復位電路的定義是:復位信號的斷言(復位使能)與無效(復位釋放)都與時鐘完全無關(異步),即時鐘信號對復位信號完全未知。通常,異步復位信號直接連到觸發(fā)器的復位引腳,如圖10.19所示。異步復位的代碼風格如example_10_14。圖10.19

異步復位電路框圖10.8復位電路設計問題與改進

圖10.18

同步復位計數(shù)器電路原理圖

10.8.2異步復位電路//example_10_14async_reset_dff//異步復位觸發(fā)器moduleasync_reset_cnt(inputi_clk,inputi_rst_n,input[7:0]i_din,inputi_ld,outputreg[7:0]o_dout);always@(posedge

i_clkornegedge

i_rst_n)beginif(~i_rst_n)begin

o_dout<=8'd0;endelsebeginif(i_ld)begin

10.8復位電路設計問題與改進

圖10.18

同步復位計數(shù)器電路原理圖

o_dout<=i_din;endelse

o_dout<=o_dout+8'd1;endendendendmodule圖10.20

異步復位毛刺的影響

10.8復位電路設計問題與改進

圖10.18

同步復位計數(shù)器電路原理圖

圖10.21

異步復位恢復時間

10.8復位電路設計問題與改進

10.8.3復位電路的改進1.同步異步復位信號圖10.23

異步復位信號的同步【例10.16】同步異步復位的代碼實現(xiàn),需要注意的是由于外部輸入復位信號仍然是異步的,第一級寄存器建立時間很可能不能滿足而出現(xiàn)亞穩(wěn)態(tài)(這將在下面一個章節(jié)重點介紹),所以需要第二級觸發(fā)器,減小亞穩(wěn)態(tài)出現(xiàn)的概率,保證復位信號的完整性。同時應當注意對復位信號進行同步的兩個寄存器是不可復位的。//example_10_16//對異步輸入信號的同步modulesync_async_rst(outputreg

o_rst_sync,

10.8復位電路設計問題與改進

inputi_clk,inputi_asyn_rst_n);

reg

sync_rst_in_r;//寄存器sync_rst_in_r和o_rst_sync不能復位

always@(posedge

i_clk)begin

sync_rst_in_r<=i_asyn_rst_n;

o_rst_sync<=sync_rst_in_r;endendmodule10.8復位電路設計問題與改進

2.異步復位同步釋放圖10.26

異步復位同步釋放電路框圖

【例10.17】異步復位同步釋放的代碼實現(xiàn),我們看其時序功能圖10.27,很明顯i_asyn_rst_n是一個異步復位輸入信號,在其復位階段(低電平),輸出信號o_rst_sync能夠有效的輸出低電平對電路內(nèi)部各個寄存器復位,當輸入復位信號在A時刻釋放時,o_rst_sync并沒有馬上恢復,只有當時鐘信號在B時刻采樣到i_async_rst_n后,內(nèi)部寄存器sync_rst_r0從復位狀態(tài)恢復,在接下來的一個時鐘周期C時刻時,內(nèi)部寄存器sync_rst_r1才從復位狀態(tài)恢復。很明顯,在異步復位有效期間,o_rst_sync都能輸出有效復位信號,只有在時鐘沿到來時,才從復位狀態(tài)中恢復出來。10.8復位電路設計問題與改進

//example_10_17//異步復位同步釋放例子moduleasync_rst_sync_recover(outputo_rst_sync,inputi_clk,inputi_asyn_rst_n);

regsync_rst_r0;

regsync_rst_r1;assigno_rst_sync=sync_rst_r1;always@(posedge

i_clkornegedge

i_asyn_rst_n)beginif(~i_asyn_rst_n)begin//異步復位階段

sync_rst_r0<=1'b0;sync_rst_r1<=1'b0;endelsebegin

10.8復位電路設計問題與改進

sync_rst_r0<=1'b1;//同步復位階段

sync_rst_r1<=sync_rst_r0;end

endendmodule

圖10.27

同步復位異步釋放時序圖思考與練習1.根據(jù)你所學,請回答阻塞賦值與非阻塞賦值的本質(zhì)區(qū)別是什么?它可能會導致哪些問題?*2.下面是兩段代碼(Exercise1-a,Exercise1-b)關于阻塞賦值與非阻塞賦值的行為描述的代碼(即不可綜合),請畫出該段代碼的時序圖,并用modelsim完成仿真,驗證你的結果。//第10章

Exercise1-a`timescale1ns/1psmodulenon_block1;

rega1,b1,c1,a2,b2,c2;//blockingassignmentsinitialbegina1=#101;//a1willbeassigned1attime10b1=#20;//b1willbeassigned0attime12c1=#41;//c1willbeassigned1attime16end//non-blockingassignments

思考與練習initialbegina2<=#101;//a2willbeassigned1attime10b2<=#20;//b2willbeassigned0attime2c2<=#41;//c2willbeassigned1attime4endendmodule思考與練習//第10章

Exercise1-b`timescale1ns/1psmodulenon_block1;

rega1,b1,a2,b2;initialbegina1=0;b1=1;a1<=b1; //分兩步執(zhí)行

b1<=a1;endinitialbegina2<=0;b2<=1;a2=b2; //分1步執(zhí)行

b2=a2;endinitialbegin

思考與練習$monitor($time,,"a1=%b1b1=%b1",a1,b1);$monitor($time,,"a2=%b2b2=%b2",a2,b2);#100$finish;endendmodule*3.閱讀下面代碼,請問該電路綜合結果中各有幾個觸發(fā)器,并在synplify_pro上完成電路的綜合,驗證你的結果?//第10章

Exercise2-a`timescale1ns/1psmoduleblock_cnt(inputi_clk,inputi_rst_n,output[1:0]i_init,outputreg[1:0]o_cnt);

reg[1:0]init_r;

思考與練習always@(posedge

i_clk)beginif(~i_rst_n)begin

init_r=2'b00;

o_cnt=2'b00;endelsebegin

init_r=i_init;

o_cnt=init_r+2'b01;endendendmodule思考與練習//第10章Exercise2-b`timescale1ns/1psmodulenon_block_cnt(inputi_clk,inputi_rst_n,output[1:0]i_init,outputreg[1:0]o_cnt);

reg[1:0]init_r;

always@(posedge

i_clk)beginif(~i_rst_n)begin

init_r<=2'b00;

o_cnt<=2'b00;endelsebegin

思考與練習igniter<=i_init;

o_cnt<=init_r+2'b01;endendendmodule4.在Verilog

設計時,什么是敏感變量的不完備性?有哪些因素可能造成敏感變量的不完備性?敏感變量不完備性可能導致什么樣的問題?設計中應該采用什么樣的方法去避免這個問題?*5.用綜合工具對下面代碼綜合,會綜合出什么樣的電路?編寫測試向量,觀察其結果。//第10章Exercise5modulemux21(inputi_a,inputi_b,inputi_c,outputreg

o_mux);always@(i_aori_b)begin

思考與練習if(i_sel)begin

o_mux=i_a;endelsebegin

o_mux=i_b;endendendmodule6.鎖存器器有哪些危害?無意識的鎖存器是指的是什么?怎樣才能避免無意識的鎖存器發(fā)生?*7.比較下面兩段代碼,那個會產(chǎn)生鎖存器?該如何消除?//第10章

Exercise7-amodulestate_dec1(inputi_clk,inputi_rst_n,input[3:0]i_state,outputreg[1:0]o_dec

思考與練習);always@(posedge

i_clkornegedge

i_rst_n)

if(!i_rst_n)begin

o_dec<=2'b00;endelsebeginca

溫馨提示

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

評論

0/150

提交評論