版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Verilog語言教程
邏輯及語法2021/7/131Verilog語言教程
邏輯及語法2021/7/131數字系統(tǒng)設計的核心知識
復雜數字系統(tǒng)的構成;基本電路和Verilog的對應關系;同步有限狀態(tài)機在電路中的作用;時鐘樹與自動綜合技術2021/7/132數字系統(tǒng)設計的核心知識
復雜數字系統(tǒng)的構成;2021/7/數字邏輯電路的構成
-組合邏輯:輸出只是輸入邏輯電平的函數(有延時),與電路的原始狀態(tài)無關。時序邏輯:輸出不只是輸入的邏輯電平的函數,還與電路所處的狀態(tài)有關。同步時序邏輯是在同一時鐘跳變節(jié)拍的前提下,如輸入條件滿足,則進入下一狀態(tài),否則仍留在原來的狀態(tài)的狀態(tài)機。2021/7/133數字邏輯電路的構成
-組合邏輯:輸出只是輸入邏輯電平的函數字邏輯電路的構成組合邏輯:由與、或、非門組成的網絡。常用的有:多路器、數據通路開關、加法器、乘法器等,沒有記憶功能。時序邏輯:
由多個觸發(fā)器和多個組合邏輯塊組成的網絡。常用的有:計數器、復雜的數據流動控制邏輯、運算控制邏輯、指令分析和操作控制邏輯。同步時序邏輯的設計是設計復雜的數字邏輯系統(tǒng)的核心。存儲器和寄存器:用于暫時存儲數據信息。2021/7/134數字邏輯電路的構成組合邏輯:由與、或、非門組成的網絡。常用的組合邏輯舉例之一
一個八位數據通路控制器`defineON1‘b1`defineOFF1‘b0wireControlSwitch;wire[7:0]out,in;assignout=(ControlSwith==`ON)?in:8‘h00in[7]ControlSwitchout[7]in[0]out[0]…...…...2021/7/135組合邏輯舉例之一
一個八位數據通路控制器`define一個八位數據通路控制器的波形:
in[7:0]開關out[7:0]tt31
0215
3262
88
0215
320000in[7]ControlSwitchout[7]in[0]out[0]…...…...2021/7/136一個八位數據通路控制器的波形:
in[7:0]開關out[帶寄存器的八位數據通路控制器的波形in[7]ControlSwitchout[7]CLOCKDQ[7]CLOCKin[0]ControlSwitchout[0]DQ[0]out[7]out[0]2021/7/137帶寄存器的八位數據通路控制器的波形in[7]ControlS帶寄存器的八位數據通路控制器的Verilog描述`defineON1‘b1`defineOFF1‘b0wireControlSwitch;wireclockwire[7:0]out,in;always@(posedgeclock)if(ControlSwith==`ON)out<=in;elseout<=out;2021/7/138帶寄存器的八位數據通路控制器的Verilog描述`defin帶復位端和使能端的寄存器
moduleregena(clock,ena,reset,R,Q);parametern=8;input[n-1:0]R;inputclock,enareset;output[n-1:0]Q;always@(posedgeclockornegedgereset)if(!reset)Q<=0;elseif(ena)Q<=R;endmoduleenaRclockDQQreset2021/7/139帶復位端和使能端的寄存器moduleregena(cl具有并行置數和使能控制輸入的移位寄存器R1enawclockDQQresetQ1DQQ0R0load2021/7/1310具有并行置數和使能控制輸入的移位寄存器R1enawclock具有并行置數和使能控制輸入的移位寄存器moduleshiftregs(R,load,ena,w,clock,Q,reset);input[3:0]R;inputw,load,ena,reset,clock;output[3:0]Q;reg[3:0]Q;integerk;always@(posedgeclockornegedgereset)if(!reset)Q<=0;elseif(load)Q<=R;elseif(ena)beginQ[0]<=W;for(k=1;k<4;k+1)Q[k]<=Q[k-1];endendmodule2021/7/1311具有并行置數和使能控制輸入的移位寄存器moduleshif組合邏輯舉例之二:
一個八位三態(tài)數據通路控制器`defineON1‘b1`defineOFF1‘b0wireLinkBusSwitch;wire[7:0]outbuf;inout[7:0]bus;assignbus=(LinkBusSwitch==`ON)?outbuf:8‘hzz…...…...outbuf[7]LinkBusSwitchbus[7]2021/7/1312組合邏輯舉例之二:
一個八位三態(tài)數據通路控制器`define八位三態(tài)數據通路控制器的波形:
outbuf[7:0]開bus[7:0]tt31
0215
3262
88
0215
32ZZZZLinkBusSwitch關outbuf[7]LinkBusSwitchbus[7]2021/7/1313八位三態(tài)數據通路控制器的波形:
outbuf[7:0]開b靜態(tài)隨機存儲器(SRAM)
Sel信號必須維持一定時間,直到經過兩個反向器傳遞過來的Data信號可以自動保持;
Data的驅動能力必須大于小反向器的驅動能力;用的三極管很少,可以把密度做得很高。SelData2021/7/1314靜態(tài)隨機存儲器(SRAM)Sel信號必須維持一定時間靜態(tài)隨機存儲器(SRAM)陣列Sel0Data[0]Sel1Data[1]2021/7/1315靜態(tài)隨機存儲器(SRAM)陣列Sel0Data[0]Sel1地址譯碼和SRAM塊的讀寫DataoutputAddressAm-1A1A0Am-2writereadDatainputsel0sel1Sel2m-2Sel2m-1地址譯碼器2021/7/1316地址譯碼和SRAM塊的讀寫DataoutputAddre開關邏輯應用舉例
寄存器間數據流動的控制開關qdqdqdqdqdqdqdqdqdqdqdqdclock開關S1
開關S2組合邏輯組合邏輯寄存器1寄存器2寄存器32021/7/1317開關邏輯應用舉例
寄存器間數據流動的控制開關qdqdqdqd開關邏輯應用舉例
寄存器間數據流動的控制開關clock開關S5
寄存器Cqd開關S6開關S3
寄存器Bqd開關S4開關S1
寄存器Aqd開關S22021/7/1318開關邏輯應用舉例
寄存器間數據流動的控制開關clock開關S開關邏輯的時延問題
控制數據運算和流動的開關的開啟和關閉時序.
組合邏輯輸出控制開關Sn
in[7:0]out[15:0]in[7:0]
8‘d31
8‘d202
16‘d93
16‘d606延時10nsSn開關out[15:0]ttt2021/7/1319開關邏輯的時延問題
控制數據運算和流動的開關的開啟和關閉時序全局時鐘網和平衡樹結構全局時鐘網絡觸發(fā)器緩沖器
觸發(fā)器1觸發(fā)器n圖1全局時鐘網示意圖
圖2平衡樹結構示意圖2021/7/1320全局時鐘網和平衡樹結構全局時鐘網絡觸發(fā)器緩沖器觸發(fā)器1觸避免冒險和競爭由于組合邏輯和布線的延遲引起abttcclockabc2021/7/1321避免冒險和競爭由于組合邏輯和布線的延遲引起abttccloc避免冒險和競爭與流水線組合邏輯和布線的延遲在組合邏輯中的疊加ba#2#3#4cedba#2#3#4ced總延遲=Max{2,3}+4=7時鐘周期必須>7ns總延遲={Max{2,3}+4+1}=8時鐘周期必須>4ns總處理數據的吞吐量增加#1#1clock2021/7/1322避免冒險和競爭與流水線組合邏輯和布線的延遲在組合邏輯中的疊加為什么要設計有限狀態(tài)機?
如果能嚴格以時鐘跳變沿為前提,按排好時時序,來操作邏輯系統(tǒng)中每一個開關Si,則系統(tǒng)中數據的流動和處理會按同一時鐘節(jié)拍有序地進行,可以控制冒險和競爭現象對邏輯運算的破壞,時延問題就能有效地加以解決。利用同步有限狀態(tài)機就能產生復雜的以時鐘跳變沿為前提的同步時序邏輯,并提供操作邏輯系統(tǒng)的開關陣列所需要的復雜控制時序(具有信號互鎖和先后次序等要求的)。2021/7/1323為什么要設計有限狀態(tài)機?
如果能嚴格以時鐘跳變沿為前提為什么要設計有限狀態(tài)機?如果我們能設計這樣一個電路:1)能記住自己目前所處的狀態(tài);2)狀態(tài)的變化只可能在同一個時鐘的跳變沿時刻發(fā)生,而不可能發(fā)生在任意時刻;3)在時鐘跳變沿時刻,如輸入條件滿足,則進入下一狀態(tài),并記住自己目前所處的狀態(tài),否則仍保留原來的狀態(tài);4)在進入不同的狀態(tài)時刻,對系統(tǒng)的開關陣列做開啟或關閉的操作。2021/7/1324為什么要設計有限狀態(tài)機?如果我們能設計這樣一個電路:2021為什么要設計有限狀態(tài)機?clock10nsS2開關S1tttSnS3tttS42021/7/1325為什么要設計有限狀態(tài)機?clock10nsS2開關S1為什么要設計有限狀態(tài)機?
有了以上電路,我們就不難設計出復雜的控制序列來操縱數字系統(tǒng)的控制開關陣列。能達到以上要求的電路就是時序和組合電路互相結合的產物:同步有限狀態(tài)機和由狀態(tài)和時鐘共同控制的開關邏輯陣列。我們只要掌握有限狀態(tài)機的基本設計方法,加上對基本電路的掌握,再加上對數據處理的過程的細致了解,我們就可以避免由于邏輯器件和布線延遲產生的冒險競爭現象所造成的破壞,設計出符合要求的復雜數字邏輯系統(tǒng)。2021/7/1326為什么要設計有限狀態(tài)機?有了以上電路,我們就不難設計出數字系統(tǒng)的構成示意圖同步有限狀態(tài)機ena_2ena_3ena_nena_1clock組合邏輯
1寄存器組組合邏輯
2寄存器組組合邏輯
3寄存器組組合邏輯
N寄存器組input_1input_2input_n2021/7/1327數字系統(tǒng)的構成示意圖ena_2ena_3ena_nena_1同步有限狀態(tài)機的設計什么是有限狀態(tài)機(FSM)FSM的種類和不同點設計舉例2021/7/1328同步有限狀態(tài)機的設計什么是有限狀態(tài)機(FSM)2021/什么是有限狀態(tài)機?
-有限狀態(tài)機是由寄存器組和組合邏輯構成的硬件時序電路;-其狀態(tài)(即由寄存器組的1和0的組合狀態(tài)所構成的有限個狀態(tài))只能在同一時鐘跳變沿的情況下才能從一個狀態(tài)轉向另一個狀態(tài);-究竟轉向哪一狀態(tài)不但取決于各個輸入值,還取決于當前狀態(tài)。-狀態(tài)機可用于產生在時鐘跳變沿時刻開關的復雜的控制邏輯,是數字邏輯的控制核心。2021/7/1329什么是有限狀態(tài)機?
2021/7/1329Mealy狀態(tài)機
下一個狀態(tài)=F(當前狀態(tài),輸入信號);
輸出信號=G(當前狀態(tài),輸入信號);
圖1.時鐘同步的狀態(tài)機結構(Mealy狀態(tài)機)下一狀態(tài)的邏輯F輸出邏輯
G狀態(tài)寄存器時鐘信號clkclk輸入輸入輸出當前狀態(tài)激勵信號2021/7/1330Mealy狀態(tài)機
下一個狀態(tài)=F(當前狀態(tài),輸入信號
Moor狀態(tài)機
下一個狀態(tài)=F(當前狀態(tài),輸入信號)
輸出信號=G(當前狀態(tài));
下一狀態(tài)的邏輯F輸出邏輯
G狀態(tài)寄存器時鐘信號clkclk輸入輸入輸出當前狀態(tài)激勵信號圖2.時鐘同步的狀態(tài)機結構(Moor狀態(tài)機)2021/7/1331
Moor狀態(tài)機
下一個狀態(tài)=F(當前狀態(tài),輸入信號
帶流水線輸出的Mealy狀態(tài)機
下一個狀態(tài)=F(當前狀態(tài),輸入信號);
輸出信號=G(當前狀態(tài),輸入信號);
輸出圖3帶流水線輸出的Mealy狀態(tài)機下一狀態(tài)的邏輯F輸出邏輯
G狀態(tài)寄存器時鐘信號clkclk輸入輸入當前狀態(tài)激勵信號輸出流水線寄存器
clk輸入2021/7/1332
帶流水線輸出的Mealy狀態(tài)機
下一個狀態(tài)=簡單的狀態(tài)機設計舉例狀態(tài)轉移圖表示RTL級可綜合的Verilog模塊表示2021/7/1333簡單的狀態(tài)機設計舉例狀態(tài)轉移圖表示2021/7/1333有限狀態(tài)機的圖形表示圖形表示:狀態(tài)、轉移、條件和邏輯開關圖3.4狀態(tài)轉移圖Idle
Start
StopClear
A/K1=0
!AA/K2=1
!Reset/K2=0K1=0!Reset/K2=0K1=0
(!Reset|!A)/K2=0K1=1!Reset/K2=0K1=02021/7/1334有限狀態(tài)機的圖形表示圖形表示:狀態(tài)、轉移、條件和邏輯開關圖3有限狀態(tài)機的Verilog描述定義模塊名和輸入輸出端口;定義輸入、輸出變量或寄存器;定義時鐘和復位信號;定義狀態(tài)變量和狀態(tài)寄存器;用時鐘沿觸發(fā)的always塊表示狀態(tài)轉移過程;在復位信號有效時給狀態(tài)寄存器賦初始值;描述狀態(tài)的轉換過程:符合條件,從一個狀態(tài)到另外一個狀態(tài),否則留在原狀態(tài);驗證狀態(tài)轉移的正確性,必須完整和全面。2021/7/1335有限狀態(tài)機的Verilog描述定義模塊名和輸入輸出端口;20表示方法之一modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;//定義時鐘、復位和輸入信號outputK2,K1;//定義輸出控制信號的端口regK2,K1;//定義輸出控制信號的寄存器reg[1:0]state;
//定義狀態(tài)寄存器parameterIdle=2’b00,Start=2’b01,Stop=2’b10,Clear=2’b11;//定義狀態(tài)變量參數值
always@(posedgeClock)if(!Reset)begin//定義復位后的初始狀態(tài)和輸出值
state<=Idle;K2<=0;K1<=0;end2021/7/1336表示方法之一modulefsm(Clock,Rese表示方法之一(續(xù))elsecase(state)Idle:beginif(A)beginstate<=Start;K1<=0;endelsestate<=Idle;endStart:beginif(!A)state<=Stop;elsestate<=Start;end2021/7/1337表示方法之一(續(xù))else2021/7/1337表示方法之一(續(xù))
Stop:begin//符合條件進入新狀態(tài),否則留在原狀態(tài)
if(A)beginstate<=Clear;K2<=1;endelsestate<=Stop;endClear:beginif(!A)beginstate<=Idle;K2<=0;K1<=1;endelsestate<=Clear;endendcaseendmodule
2021/7/1338表示方法之一(續(xù))Stop:begin//符表示方法之二我們還可以用另一個VerilogHDL模型來表示同一個有限狀態(tài),見下例。(用可綜合的Verilog模塊設計用獨熱碼表示狀態(tài)的狀態(tài)機)
modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[3:0]state;
parameterIdle=4’b1000,Start=4’b0100,Stop=4’b0010,Clear=4’b0001;
2021/7/1339表示方法之二我們還可以用另一個VerilogHDL模型來表示方法之二(續(xù))always@(posedgeclock)if(!Reset)beginstate<=Idle;K2<=0;K1<=0;endelsecase(state)Idle:if(A)beginstate<=Start;K1<=0;endelsestate<=Idle;
2021/7/1340表示方法之二(續(xù))always@(posedgeclo表示方法之二(續(xù))
Start:if(!A)state<=Stop;elsestate<=Start;Stop:if(A)beginstate<=Clear;K2<=1;endelsestate<=Stop;Clear:if(!A)beginstate<=Idle;K2<=0;K1<=1;endelsestate<=Clear;2021/7/1341表示方法之二(續(xù))Start:if(!A)表示方法之二(續(xù))
default:state<=Idle;endcaseendmodule
[例2]與[例1]的主要不同點是狀態(tài)編碼,[例2]采用了獨熱編碼,而[例1]則采用Gray碼,究竟采用哪一種編碼好要看具體情況而定。
2021/7/1342表示方法之二(續(xù))default:s表示方法之三
在比較復雜的狀態(tài)機設計過程中,我們往往把狀態(tài)的變化與輸出開關的控制分成兩部分來考慮。就象前面講過的Mealy狀態(tài)機輸出部分的組合邏輯。為了調試方便,還常常把每一個輸出開關寫成一個個獨立的always組合塊。在調試多輸出狀態(tài)機時,這樣做比較容易發(fā)現問題和改正模塊編寫中出現的問題。建議同學們在設計復雜的多輸出狀態(tài)機時采用下面的風格舉例,說明如下:
2021/7/1343表示方法之三在比較復雜的狀態(tài)機設計過程中,我們往往把表示方法之三(續(xù))modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[1:0]state,nextstate;
parameterIdle=2'b00,Start=2'b01,Stop=2'b10,Clear=2'b11;2021/7/1344表示方法之三(續(xù))modulefsm(Clock,R表示方法之三(續(xù))
//--------每一個時鐘沿產生一次可能的狀態(tài)變化-----------always@(posedgeClock)beginif(!Reset)state<=Idle;elsestate<=nextstate;end//-------------------------------------------------------2021/7/1345表示方法之三(續(xù))//--------每一個時鐘沿產生一表示方法之三(續(xù))//------產生下一狀態(tài)的組合邏輯-------------------------
always@(stateorA)case(state)Idle:if(A)nextstate=Start;elsenextstate=Idle;Start:if(!A)nextstate=Stop;elsenextstate=Start;Stop:if(A)nextstate=Clear;elsenextstate=Stop;Clear:if(!A)nextstate=Idle;elsenextstate=Clear;default:nextstate=2'bxx;endcase2021/7/1346表示方法之三(續(xù))//------產生下一狀態(tài)的組合邏輯表示方法之三(續(xù))//----產生輸出K1的組合邏輯--------------always@(stateorResetorA)if(!Reset)K1=0;elseif(state==Clear&&!A)//從Clear轉向IdleK1=1;elseK1=0;
//---產生輸出K2的組合邏輯---------------always@(stateorResetorA)if(!Reset)K2=0;elseif(state==Stop&&A)//從Stop轉向ClearK2=1; elseK2=0;//------------------------------------------endmodule
2021/7/1347表示方法之三(續(xù))//----產生輸出K1的組合邏輯--表示方法之四
用輸出指定的碼表示狀態(tài)的狀態(tài)機
方法四采用了另一種方法:直接把狀態(tài)碼定義為輸出。也就是把狀態(tài)碼的指定與狀態(tài)機控制的輸出聯系起來,把狀態(tài)的變化直接用作輸出,這樣做可以提高輸出信號的開關速度并節(jié)省電路器件。這種設計方法常用在高速狀態(tài)機中。建議同學們在設計高速狀態(tài)機時采用方法四的風格。例中state[3]和state[0]分別表示前面兩個例子中的輸出K2和K1。2021/7/1348表示方法之四
用輸出指定的碼表示狀態(tài)的狀態(tài)機方法四采用了表示方法之四(續(xù))modulefsm(Clock,Reset,A,K2,K1,state);inputClock,Reset,A;outputK2,K1;output[4:0]state;reg[4:0]state;
assignK2=state[4];//把狀態(tài)變量的最高位用作輸出K2assignK1=state[0];//把狀態(tài)變量的最低位用作輸出K12021/7/1349表示方法之四(續(xù))modulefsm(Clock,R表示方法之四(續(xù))parameter//-------outputcodedstateassignment---//--------K2_i_j_n_K1–Idle=5'b0_0_0_0_0,Start=5'b0_0_0_1_0,Stop=5'b0_0_1_0_0,StopToClear=5'b1_1_0_0_0,Clear=5'b0_1_0_1_0,ClearToIdle=5'b0_0_1_1_1;
2021/7/1350表示方法之四(續(xù))parameter2021/7/1350表示方法之四(續(xù))
always@(posedgeClock)if(!Reset)beginstate<=Idle;endelsecase(state)Idle:if(A)state<=Start;elsestate<=Idle;
Start:if(!A)state<=Stop;elsestate<=Start;
2021/7/1351表示方法之四(續(xù))always@(posedgeClo表示方法之四(續(xù))Stop:if(A)state<=StopToClear;elsestate<=Stop;StopToClear:state<=Clear;Clear:if(!A)state<=ClearToIdle;elsestate<=Clear;
ClearToIdle:state<=Idle;
default:state<=Idle;endcaseendmodule2021/7/1352表示方法之四(續(xù))Stop:if(A)2021/狀態(tài)機的測試
不同風格的描述適合不同規(guī)模的狀態(tài)機和不同的綜合工具,有的風格查錯和修改較容易,但寫簡單的狀態(tài)機時比較麻煩。Synopsys公司的綜合器建議使用這種風格來描述狀態(tài)機。
上面四個例子是同一個狀態(tài)機的四種不同的VerilogHDL模型,它們都是可綜合的,在設計復雜程度不同的狀態(tài)機時有它們各自的優(yōu)勢。如用不同的綜合器對這四個例子進行綜合,綜合出的邏輯電路可能會有些不同,但邏輯功能是相同的。下面列出測試這些不同風格狀態(tài)機的測試模塊,供同學們參考:
2021/7/1353狀態(tài)機的測試不同風格的描述適合不同規(guī)模的狀態(tài)機和不同
狀態(tài)機的測試模塊`timescale1ns/1nsmodulet;rega;regclock,rst;wirek2,k1;initial//initial常用于仿真時信號的給出。
begina=0;rst=1;//給復位信號變量賦初始值
clock=0;//給時鐘變量賦初始值
#22rst=0;//使復位信號有效
#133rst=1;//經過一個多周期后使復位信號無效
end
2021/7/1354狀態(tài)機的測試模塊`timescale1ns/1ns202
狀態(tài)機的測試模塊
always#50clock=~clock;//產生周期性的時鐘
always@(posedgeclock)//在每次時鐘正跳變沿時刻產生不同的abegin#30a={$random}%2;//每次a是0還是1是隨機的。
#(3*50+12);//a的值維持一段時間
endinitialbegin#100000$stop;end//系統(tǒng)任務,暫停仿真以便觀察仿真波形。
//-----------調用被測試模塊t.m----------fsmm(.Clock(clock),.Reset(rst),.A(a),.K2(k2),.K1(k1));
endmodule
2021/7/1355狀態(tài)機的測試模塊always#50clock=~狀態(tài)機設計的總結:有限狀態(tài)機設計的一般步驟:
1)
邏輯抽象,得出狀態(tài)轉換圖
2)
狀態(tài)化簡
3)
狀態(tài)分配在觸發(fā)器資源豐富的FPGA或ASIC設計中采用獨熱編碼(one-hot-coding)既可以使電路性能得到保證又可充分利用其觸發(fā)器數量多的優(yōu)勢,也可以采取輸出編碼的狀態(tài)指定來簡化電路結構,并提高狀態(tài)機的運行速度。
4)選定觸發(fā)器的類型并求出狀態(tài)方程、驅動方程和輸出方程。
5)
按照方程得出邏輯圖2021/7/1356狀態(tài)機設計的總結:有限狀態(tài)機設計的一般步驟:2021/7/1狀態(tài)機設計的總結:
用VerilogHDL來描述有限狀態(tài)機,可以充分發(fā)揮硬件描述語言的抽象建模能力,使用always塊語句和case(if)等條件語句及賦值語句即可方便地實現。具體的邏輯化簡及邏輯電路到觸發(fā)器映射均可由計算機自動完成,上述設計步驟中的第2步及4、5步不再需要很多的人為干預,使電路設計工作得到簡化,效率也有很大的提高。2021/7/1357狀態(tài)機設計的總結:2021/7/1357邏輯電路的測試故障模型測試集合的復雜性路徑的激活樹狀結構的電路隨機測試時序電路的測試電路內部自測試(Build-inSelf-Test)線路板的測試2021/7/1358邏輯電路的測試故障模型2021/7/1358邏輯電路的測試
故障模型信號無法變化的模型
信號w總是固定在0或1:stuck_at_0表示為:w/0stuck_at_1表示為:w/1單個故障和多個故障
把多個故障問題簡化為許多個單個故障問題來處理。CMOS電路的故障特點
晶體三極管的開路或短路:stuck_at_0或stuck_at_1
復雜的情形,不定態(tài);組合邏輯變?yōu)闀r序邏輯的行為….2021/7/1359邏輯電路的測試
故障模型信號無法變化的模型2021/7/13邏輯電路的測試
測試集合的復雜性
想要知道模塊中a,b,c,d,f端中是否有電平不能變化的,需要測試信號w1,w2,w3的各種變化組合。最全的情況有8種,最少有四種:測試集合={001,010,011,100}w1fw2w3dbac2021/7/1360邏輯電路的測試
測試集合的復雜性
想要知道模塊中a,b邏輯電路的測試
測試路徑的激活(Sensitizing)
把w1端的變化直接傳到f端,必須把w2置1,w3置0,w4置1。這叫做從w1到f的路徑被激活。W3=0fW2=1w1bacW4=12021/7/1361邏輯電路的測試
測試路徑的激活(Sensitizing)
把邏輯電路的測試
樹狀結構的電路
最小測試集合的確定比較麻煩fW4
W1W4W2W2W3
W1W3 ̄W3 ̄ ̄ ̄2021/7/1362邏輯電路的測試
樹狀結構的電路
最小測試集合的確定比較麻煩f掃描路徑的安排clockDQ
y3clockDQ
y2正常0/掃描1Dy1
Q組合邏輯電路111000掃描輸入
Y3
Y2
Y1······2021/7/1363掃描路徑的安排clockDQy3clockDQ電路內部自測試
(Build-inSelf-Test)在芯片中必須存儲有對測試向量的正確響應,經過比較知道被測試電路是否有故障。測試向量被測試電路測試結果處理x0Pm-1P0Xn-12021/7/1364電路內部自測試
(Build-inSelf-Test)在芯四位內部邏輯塊觀察器
Built-inLogicBlockObserver(BILBO)M1M2的不同組合產生不同的功能10DQDQDQDQM1M2q0q2q3q1clockP0P1P2P3G/Ssinxor2021/7/1365四位內部邏輯塊觀察器
Built-inLogicBloc四位內部邏輯塊觀察器
(BILBO)的M1M2的不同組合時不同的功能
M1M2=11,正常系統(tǒng)模式,p0到p3直接傳遞到q0到q3;M1M2=00,當G/S=1時,為移位寄存器模式,測試矢量一位一位地移動進入,給被測試電路一位一位地加上測試信號。當G/S=0時,電路成為二進制偽隨機序列發(fā)生器。(xor的兩個為輸入端相同時,輸出為0,否則為1)M1M2=10,為簽字模式,p0到p3與寄存器中存儲的數比較后,得到簽字輸出q0到q3,相同為0,不同出現1。M1M2=01,復位模式,所有觸發(fā)器置0。2021/7/1366四位內部邏輯塊觀察器
(BILBO)的M1M2的不同組合簽字分析分五個步驟完成簽字分析過程:組合電路塊CN1組合電路塊CN2BILBO1BILBO2掃描輸出掃描輸入2021/7/1367簽字分析分五個步驟完成簽字分析過程:組合電路塊CN1組合電路簽字分析的
五個步驟把測試向量一位一位地輸入BILBO1,復位BILBO2。用BILBO1做偽隨機序列信號源,用BILBO2產生簽字分析結果。把BILBO2的內容逐位輸出,在外面比較簽字分析;然后逐位向BILBO2輸入CN2的測試向量,啟動測試;把BILBO1中的寄存器復位。用BILBO2做偽隨機序列信號源,用BILBO1產生簽字分析結果。把BILBO1的內容逐位輸出,在外面比較簽字分析。2021/7/1368簽字分析的
五個步驟把測試向量一位一位地輸入BILBO1,復
邊界掃描電路的可測試性:可以施加測試向量,并可觀察輸出結果。電路的可測試性包括:芯片的可測試、線路板可測試、系統(tǒng)可測試。用移位寄存器的方法,把測試向量逐位移入寄存器,把測試結果逐位移出寄存器,與EDA仿真工具的結果進行比較,分析真實的物理線路是否運行正常。這個方法非常普及。已經建立有關邊界掃描的國際標準:IEEEStandard1149.1.設計線路板、芯片都要符合國際標準。有自動化工具在芯片設計的過程中(功能邏輯設計結束后)插入有關DFT(DesignForTest)設計。2021/7/1369邊界掃描電路的可測試性:可以施加測試向量,并可觀察輸出結果有關測試的總結小規(guī)模的電路可以進行全覆蓋測試來驗證它的功能。組合邏輯可以根據真值表來測試。時序邏輯可以根據狀態(tài)轉移表來測試。如果電路是根據上面介紹的可測試性來設計的,則小規(guī)模的電路進行完整的測試是比較容易的。大規(guī)模電路無法進行全覆蓋的窮舉測試,因為測試向量數量太大,必須動腦筋想辦法找到可管理的有效測試集合,以節(jié)省測試時間。EDA工具對于得到設計電路的測試集是有幫助的,但是并不能確定電路的功能確實完全符合設計初衷。2021/7/1370有關測試的總結小規(guī)模的電路可以進行全覆蓋測試來驗證它的功能。語法要點詳細講解
有關測試模塊編寫的語法;語法的高級部分:函數、任務、文件、存貯器建立模型、雙向總線、UDP、綜合指令。。。。2021/7/1371語法要點詳細講解
2021/7/1371語法詳細講解
Verilog測試模塊的編寫目的:
復習如何編寫較復雜的測試文件,對所做的設計進行完整的測試和驗證。掌握組織模塊測試的常用方法;學會編寫常用的測試代碼。2021/7/1372語法詳細講解
Verilog測試模塊的編寫目的:2021/語法詳細講解
用Verilog設計的步驟
注:虛線表示編譯器能檢查輸入文件的可讀性和是否存在以及是否允許生成輸出文件include文件設計文件廠家元件庫文件輸入文件:激勵和期望的輸出信號輸出文件:激勵和實際輸出的信號編譯器仿真器仿真器2021/7/1373語法詳細講解
用Verilog設計的步驟注:虛線表示語法詳細講解
測試平臺的組成
激勵信號需要驗證的設計激勵信號和用于驗證的結果數據需要驗證的設計簡單的測試平臺復雜的測試平臺2021/7/1374語法詳細講解
測試平臺的組成激勵需要驗證的激勵信號需要驗語法詳細講解
并行塊在測試塊中常用到fork…join塊。用并行塊能表示以同一個時間起點算起的多個事件的運行,并行地執(zhí)行復雜的過程結構,如循環(huán)或任務。舉例說明如下:moduleinline_tb;reg[7:0]data_bus;initialforkdata_bus=8’b00;#10data_bus=8’h45;//這兩個repeat開始執(zhí)行時間不同,但能同時運行
#20repeat(10)#10data_bus=data_bus+1;#25repeat(5)#20data_bus=data_bus<<1;#140data_bua=8’h0f;joinendmodule2021/7/1375語法詳細講解
并行塊在測試塊中常用到fork…join塊。語法詳細講解
并行塊時間data_bus08’b0000_0000108’b0100_0101308’b0100_0110408’b0100_0111458’b1000_1110508’b1000_1111608’b1001_0000658’b0010_0000708’b0010_0001時間data_bus808’b0010_0010858’b0100_0100908’b0100_01011008’b0010_00011058’b0100_01101108’b1000_11001208’b1000_11101258’b0001_11001408’b0000_1111上面模塊的仿真輸出如下:2021/7/1376語法詳細講解
并行塊時間data_bus時間語法詳細講解
強制激勵在一個過程塊中,可以用兩種不同的方式對信號變量或表達式進行連續(xù)賦值。過程連續(xù)賦值往往是不可以綜合的,通常用在測試模塊中。兩種方式都有各自配套的命令來停止賦值過程。兩種不同方式均不允許賦值語句間的時間控制。
assign和deassign適用于對寄存器類型的信號(例如:RTL級上的節(jié)點或測試模塊中在多個地方被賦值的信號)進行賦值。
initialbegin#10assigntop.dut.fsml.state_reg=`init_state;2021/7/1377語法詳細講解
強制激勵在一個過程塊中,可以用兩種不同的方式對
#20deassigntop.dut.fsml.state_reg;endforce和release用于寄存器類型和網絡連接類型(例如:門級掃描寄存器的輸出)的強制賦值,強制改寫其它地方的賦值。
initialbegin#10forcetop.dut.counter.scan_reg.q=0;#20releasetop.dut.counter.scan_reg.q;end
在以上兩個例子中,在10到20這個時間段內,網絡或寄存器類型的信號被強制賦值,而別處對該變量的賦值均無效。force的賦值優(yōu)先級高于assign。如果先使用assign,再使用force對同一信號賦值,則信號的值為force所賦的值,語法詳細講解
強制激勵2021/7/1378#20deassigntop.du語法詳細講解
強制激勵
當執(zhí)行release后,則信號的值為assign所賦的值。如果用force對同一個信號賦了幾次值,再執(zhí)行release,則所有賦的值均不再存在??梢詫π盘柕哪常ù_定)位、某些(確定)位或拼接的信號,使用force和release賦值;但不能對信號的可變位使用force和release來賦值。不能對寄存器類型的信號某位或某些位使用assign和deassign來賦值。 2021/7/1379語法詳細講解
強制激勵當執(zhí)行releas雖然有時在設計中會包含時鐘,但時鐘通常用在測試模塊中。下面三個例子分別說明如何在門級和行為級建立不同波形的時鐘模型。[例1]簡單的對稱方波時鐘:regclk;alwaysbegin#period/2clk=0;#period/2clk=1;endreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period/2)go=1;end注:在有些仿真器中,如果設計所用的時鐘是由與其相同抽象級別的時鐘模型產生的,則仿真器的性能就能得到提高。語法詳細講解
建立時鐘2021/7/1380雖然有時在設計中會包含時鐘,但時鐘通常用在測試模塊中。下面r[例2]簡單的帶延遲的對稱方波時鐘:語法詳細講解
建立時鐘regclk;initialbeginclk=0;#(period)forever#(period/2)clk=!clkendreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period)go=1;end注:這兩個時鐘模型有些不同,行為描述的模型延遲期間一直是低電平,而門級描述的模型開始延遲有半個周期是不確定的。2021/7/1381[例2]簡單的帶延遲的對稱方波時鐘:語法詳細講解
建立時鐘[例3].帶延遲、頭一個脈沖不規(guī)則的、占空比不為1的時鐘:regclk;initialbegin#(period+1)clk=1;#(period/2-1)foreverbegin#(period/4)clk=0;#(3*period/4)clk=1;endendreggo;wireclk;nand#(3*period/4,period/4)ul(clk,clk,go);initialbegin#(period/4+1)go=0;#(5*period/4-1)go=1;end注:這兩個時鐘模型也有些不同,行為描述的模型一開始就有確定的電平,而門級描述的模型有延遲,開始時電平是不確定的。語法詳細講解
建立時鐘2021/7/1382[例3].帶延遲、頭一個脈沖不規(guī)則的、占空比不為1的時鐘:[例2]簡單的帶延遲的對稱方波時鐘:語法詳細講解
建立時鐘regclk;initialbeginclk=0;#(period)forever#(period/2)clk=!clkendreggo;wireclk;nand#(period/2)ul(clk,clk,go);initialbegingo=0;#(period)go=1;end注:這兩個時鐘模型有些不同,行為描述的模型延遲期間一直是低電平,而門級描述的模型開始延遲有半個周期是不確定的。2021/7/1383[例2]簡單的帶延遲的對稱方波時鐘:語法詳細講解
建立時鐘語法詳細講解
怎樣使用任務舉例說明如何使用任務:modulebus_ctrl_tb;reg[7:0]data;regdata_valid,data_rd;cpuul(data_valid,data,data_rd);initialbegincpu_driver(8’b0000_0000);cpu_driver(8’b1010_1010);cpu_driver(8’b0101_0101);end2021/7/1384語法詳細講解
怎樣使用任務舉例說明如何使用任務:2021/7語法詳細講解
怎樣使用任務taskcpu_driver;input[7:0]data_in;begin#30data_valid=1;wait(data_rd==1);#20data=data_in;wait(data_rd==0);#20data=8’hzz;#30data_valid=0;endendtaskendmodule2021/7/1385語法詳細講解
怎樣使用任務taskcpu_driver;2語法詳細講解
怎樣使用任務
在測試模塊中使用任務可以提高程序代碼的效率,可以用任務把多次重復的操作包裝起來。waitwaitwaitwaitdata1data2data3data4cpu_data
clkdata_validdata_rdread_cpu_state2021/7/1386語法詳細講解
怎樣使用任務在測試模塊中使用任務可以提高語法詳細講解
存儲建模目標學會如何用Verilog對存儲器建模。學會如何用Verilog中對雙向(即輸入/輸出)端口,(inout)建模。2021/7/1387語法詳細講解
存儲建模目標2021/7/1387存儲器建模必須注意以下兩個方面的問題:聲明存儲器容量的大小。明確對存儲器訪問操作的權限。例如:指出可以對存儲器做以下哪幾種操作:
1)只讀
2)讀寫
3)同步讀寫
4)多次讀,同時進行一次寫
5)多次同步讀寫,同時提供一些方法保證一致性語法詳細講解
存儲器建模2021/7/1388存儲器建模必須注意以下兩個方面的問題:語法詳細講解
存儲器建`timescale1ns/10psmodulemyrom(read_data,addr,read_en_);inputread_en_;input[3:0]addr;output[3:0]read_data;reg[3:0]read_data;reg[3:0]mem[0:15];initial$readmemb(“my_rom_data”,mem);always@(addrorread_en_)if(!read_en_)read_data=mem[addr];endmodule語法詳細講解
簡單ROM建模my_rom_data
0000010111000011110100100011111110001001100000011101101000011101ROM的數據存儲在另外的一個獨立的文件中2021/7/1389`timescale1ns/10ps語法詳細講解
簡單ROM建模上頁所示的ROM模型說明:如何在Verilog中用二維的寄存器組來定義存儲器。ROM中的數據保存在一個獨立的文件中,如上頁的右邊的虛線方框所示。這是一種保存ROM數據的通用的方法,它可以使數據和ROM模型分開。2021/7/1390語法詳細講解
簡單ROM建模上頁所示的ROM模型說明:202語法詳細講解
簡單RAM建模`timescale1ns/1nsmodulemymem(data,addr,read,write);inout[3:0]data;inout[3:0]addr;inputread,write;reg[3:0]memory[0:15];//4bits,16個單元//從存儲器讀出到總線上
assigndata=read?memory[addr]:4’bz;//從總線寫入存儲器
always@(posedgewrite)memory[addr]=data;endmodule2021/7/1391語法詳細講解
簡單RAM建模`timescale1ns/1語法詳細講解
簡單RAM建模RAM模型比ROM模型稍微復雜:它必須具有讀寫能力;進行讀寫時通常使用相同的數據總線;需要新技術來處理雙向總線;當讀信號無效時,RAM模型與總線脫離,如果此時寫信號也無效,總線無驅動源,則總線進入高阻狀態(tài),這就避免了RAM中的讀寫競爭。上頁的RAM模塊是可綜合的,但綜合出來是一大堆寄存器,占比較大的面積,經濟上不太合算。2021/7/1392語法詳細講解
簡單RAM建模RAM模型比ROM模型稍微復雜:例:modulescalable_ROM(mem_word,address);parameteraddr_bits=8;//sizeofaddressbusparameterwordsize=8;//widthofawordparameterwords=(1<<addr_bits);//sizeofmemoutput[wordsize:1]mem_word;//wordofmemoryinput[addr_bits:1]address;//addressbus
reg[wordsize:1]mem[0:words-1];//memdeclaration//outputonewordofmemorywire[wordsize:1]mem_word=mem[address];endmodule語法詳細講解
存儲量可變的只讀存儲器建模2021/7/1393例:語法詳細講解
存儲量可變的只讀存儲器建模2021/7/1語法詳細講解
存儲量可變的只讀存儲器建模
上述的例子演示了怎樣通過設置字長和地址位數來編寫只讀存儲器的行為模塊。
[注意]!!在上例中,存儲字的范圍從0開始的,而不是從1開始,這是因為存儲單元是直接通過地址線尋址定位的。同樣地,也可以用下面的方法來定義存儲器和尋址:
reg[wordsize:1]mem[1:words];//存儲器地址從1開始
//地址一個一個地增加直到包含了每個地址對應的存儲器
wire[wordsize:1]mem_word=mem[address+1];2021/7/1394語法詳細講解
存儲量可變的只讀存儲器建模上述的例子演示
可以在初始化塊中用一個循環(huán)或系統(tǒng)任務把初始數據存入存儲器的每個單元。
使用循環(huán)把值賦給存儲器數組。
for(i=0;i<memsize;i=i+i)//initializememorymema[i]={wordsize{1’b1}};調用$readmem系統(tǒng)任務。
//從文件mem_file.txt中,把初始數據存入存儲器(mem)的每個單元
$readmemb(“mem_file.txt”,mem);
注意:上面兩項必須寫在initial塊中,加載這些初始化數據不需要時間。語法詳細講解
存儲器的加載2021/7/1395可以在初始化塊中用一個循環(huán)或系統(tǒng)任務把初始數據存入語法詳細講解
怎樣使用雙向口使用inout關鍵字聲明端口為雙向口。
inout[7:0]databus;使用雙向口必需遵循下面的規(guī)則:inout口只能聲明為網絡連接類型,不允許把它聲明為寄存器類型。(所以仿真器能確定多個驅動源的最終值。)在設計中,每次只能從一個方向來驅動inout口。例如:當使用總線讀RAM中的數據時,如果同時又向RAM模型的雙向數據總線寫數據,就會產生邏輯競爭,導致總線數據無法確定。所以必須為inout口設計控制邏輯,只有這樣才能保證正確的操作。2021/7/1396語法詳細講解
怎樣使用雙向口使用inout關鍵字聲明端口為雙語法詳細講解
怎樣使用雙向口[注意]:聲明一個inout口,可以用來輸入或輸出數據。inout口默認為網絡連接類型。不允許在過程塊(initial或always塊)中對網絡連接類型的數據進行過程賦值;但可以在過程塊外把一個寄存器數據類型通過連續(xù)賦值語句賦給它(inout口),或者把它與用戶定義的源語(UDP)相連。必須為inout口設計控制邏輯,用來保證正確的操作。當把inout口作為輸入口時,必須通過控制邏輯禁止輸出到inout口。2021/7/1397語法詳細講解
怎樣使用雙向口[注意]:2021/7/1397使用Verilog中的基本元件(bufif1)為雙向口建模:語法詳細講解
雙向口建模b2b1en_a_ben_b_abus_abus_b2021/7/1398使用Verilog中的基本元件(bufif1)為雙向口建模:語法詳細講解
雙向口建模[注意]:
在上頁的例子中,使用en_a_b和en_b_a來控制元器件bufifl,如果控制信號同時有效,則結果無法確定。所以必須把控制信號en_a_b和en_b_a在時間上分開。modulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;bufiflb1(bus_b,bus_a,en_a_b);bufiflb2(bus_a,bus_b,en_b_a);//結構模塊邏輯endmodule當en_a_b=1時,元器件b1激活,bus_a的值傳到bus_b上當en_b_a=1時,元器件b1激活,bus_b的值傳到bus_a上2021/7/1399語法詳細講解
雙向口建模[注意]:mod
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度產品上樣金融支持合作協議4篇
- 2025版新能源項目合作協議-環(huán)保設施投資與建設3篇
- 二零二五年度農業(yè)科技項目第三方擔保貸款合同模板3篇
- 二零二五年度智能倉儲系統(tǒng)采購合同范本3篇
- 二零二五年度出國打工人員勞動爭議調解與仲裁合同3篇
- 2025年度電熱水器智能化改造升級合同樣本4篇
- 二零二五年度抽沙船租賃與工程配套合同4篇
- 2025版?zhèn)€人二手房置換交易合同
- 二零二五年度文化演出活動組織承攬合同范本4篇
- 2025年中國輕型車凸輪軸市場調查研究報告
- 勞務協議范本模板
- 2024年全國職業(yè)院校技能大賽高職組(生產事故應急救援賽項)考試題庫(含答案)
- 2025大巴車租車合同范文
- 老年上消化道出血急診診療專家共識2024
- 人教版(2024)數學七年級上冊期末測試卷(含答案)
- 2024年國家保密培訓
- 2024年公務員職務任命書3篇
- 《GMP基礎知識培訓》課件
- CFM56-3發(fā)動機構造課件
- 會議讀書交流分享匯報課件-《殺死一只知更鳥》
- 2025屆撫州市高一上數學期末綜合測試試題含解析
評論
0/150
提交評論