作者numberX (隱藏在!後面的?)
看板Electronics
標題[問題] verilog的blocking和non-blocking造成的差別
時間Mon Nov 29 16:16:29 2010
如題,我想產生一個受到輸入訊號clk_chg控制的clock
使用blocking assignment能成功產生我要的波形,即下圖的 o2B
http://kr.imghost.us/6f2/sim.JPG
code如下:
module test2_blocking(clk, reset, clk_chg, clkout); //使用blocking assignment
input clk, reset, clk_chg;
output clkout;
reg clk_chg_delay, con, s;
reg [2:0] state;
wire clkout=(s)?con:clk; //在受控制的DFF(con)和clk之間做切換
always@(negedge clk) //讓clk_chg訊號delay半個cycle
clk_chg_delay=(clk_chg)?1'b1:1'b0;
always@(posedge clk)
if (reset)
begin
con=1'b0;
s=1'b0;
state=1;
end
else
if (clk_chg_delay)
begin
case(state)
1:begin
con=1'b1;
s=1'b1;
state=2;
end
2:begin
con=con;
s=1'b0;
state=3;
end
3:begin
con=1'b0;
s=1'b1;
state=1;
end
default:begin
con=1'b0;
s=1'b0;
state=1;
end
endcase
end
else
begin
con=1'b0;
s=1'b0;
state=1;
end
endmodule
但是兩個always改成 non-blocking assignment 後,
就變成圖中的o2nB,會有 glitch (紅色圓圈處)
請問原因為何?
又是否有別的方法產生我要的波形呢? 謝謝,請多多指教^^
個人推測原因:non-blocking assignment在當下那個time step "結束" 時才更新值,
使得切換的動作慢了一點,才會有glitch;而blocking assignment在當下那個time
step "開始" 時即更新值,所以即使應該也有glitch,但因為時間太短,modelsim
忽略掉。這想法正確嗎?
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.231.188.49
1F:→ klorc:你的o2nB在哪? 11/29 18:28
2F:→ chrispherd:一般來說你沒加上Delay應該是不會有這個問題吧 11/29 21:23
3F:→ chrispherd:我跑起來就沒有那個突波 11/29 21:24
4F:→ numberX:o2nB在同一張圖的o2B下面^^ 11/29 21:28
5F:→ numberX:加上delay只是為了讓clk_chg晚一個正緣被偵測到,而且即使 11/29 21:33
6F:→ numberX:偵測的是clk_chg而非clk_chg_delay,仍然有那個突波 11/29 21:34
7F:→ numberX:我用的是modelsim_ae for win 6.1g,是否因為版本不同呢? 11/29 21:35
8F:推 zxvc:你這不管用nonblocking還是blocking其實合出來都是同一電路, 11/29 23:29
9F:→ zxvc:且都會有一個問題就是可能會有glitch。 11/29 23:30
10F:→ zxvc:因為clkout不是flip-flop的輸出,而是組合電路的輸出, 11/29 23:31
11F:→ zxvc:PVT變異,電路可能就掛了。至於怎麼改,抱歉我沒空幫你。 11/29 23:33
12F:→ zxvc:另外寫flip-flop sequential電路請務必使用nonblocking 11/29 23:34
13F:→ zxvc:assignment,主要原因是要避免race condition。 11/29 23:35
14F:→ numberX:謝謝z大,雖然你說的我都知道,但我現在只想到這個方法... 11/29 23:47
15F:→ palapalaqoo:加delay buffer 讓clk正緣落後s,避掉glitch 11/30 13:46
16F:→ kingofgar:我沒有看到code裡面有o2nB..可以看一下是不是漏掉了嗎 12/01 04:58
17F:→ numberX:code改成nonblocking,輸出波形就變成和o2nB一樣 12/01 17:18