[問題] verilog的blocking和non-blocking造成的差別

看板Electronics作者 (隱藏在!後面的?)時間14年前 (2010/11/29 16:16), 編輯推噓1(1020)
留言21則, 7人參與, 5年前最新討論串1/1
如題,我想產生一個受到輸入訊號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

11/29 18:28, , 1F
你的o2nB在哪?
11/29 18:28, 1F

11/29 21:23, , 2F
一般來說你沒加上Delay應該是不會有這個問題吧
11/29 21:23, 2F

11/29 21:24, , 3F
我跑起來就沒有那個突波
11/29 21:24, 3F

11/29 21:28, , 4F
o2nB在同一張圖的o2B下面^^
11/29 21:28, 4F

11/29 21:33, , 5F
加上delay只是為了讓clk_chg晚一個正緣被偵測到,而且即使
11/29 21:33, 5F

11/29 21:34, , 6F
偵測的是clk_chg而非clk_chg_delay,仍然有那個突波
11/29 21:34, 6F

11/29 21:35, , 7F
我用的是modelsim_ae for win 6.1g,是否因為版本不同呢?
11/29 21:35, 7F

11/29 23:29, , 8F
你這不管用nonblocking還是blocking其實合出來都是同一電路,
11/29 23:29, 8F

11/29 23:30, , 9F
且都會有一個問題就是可能會有glitch。
11/29 23:30, 9F

11/29 23:31, , 10F
因為clkout不是flip-flop的輸出,而是組合電路的輸出,
11/29 23:31, 10F

11/29 23:33, , 11F
PVT變異,電路可能就掛了。至於怎麼改,抱歉我沒空幫你。
11/29 23:33, 11F

11/29 23:34, , 12F
另外寫flip-flop sequential電路請務必使用nonblocking
11/29 23:34, 12F

11/29 23:35, , 13F
assignment,主要原因是要避免race condition。
11/29 23:35, 13F

11/29 23:47, , 14F
謝謝z大,雖然你說的我都知道,但我現在只想到這個方法...
11/29 23:47, 14F

11/30 13:46, , 15F
加delay buffer 讓clk正緣落後s,避掉glitch
11/30 13:46, 15F

12/01 04:58, , 16F
我沒有看到code裡面有o2nB..可以看一下是不是漏掉了嗎
12/01 04:58, 16F

12/01 17:18, , 17F
code改成nonblocking,輸出波形就變成和o2nB一樣
12/01 17:18, 17F

08/13 19:06, , 18F
加delay buff https://noxiv.com
08/13 19:06, 18F

09/17 23:00, , 19F
我用的是modelsi https://daxiv.com
09/17 23:00, 19F

11/11 16:02, , 20F
你這不管用nonblo https://noxiv.com
11/11 16:02, 20F

01/04 22:15, 5年前 , 21F
PVT變異,電路可能就 https://noxiv.com
01/04 22:15, 21F
文章代碼(AID): #1Cys5XlC (Electronics)