看板 Electronics 關於我們 聯絡資訊
那個"除頻器的nonblocking assignment問題"的HDL code在這篇文章的後面。 (以下文章只有count[0]是Verilog bit-select,"[0]"不是citation XD) 然後來對於這個HDL的Scheduling分析如下。 首先module t有三個always,我們由上而下命名always0, always1, always2。 always0, always1對posedge clock敏感,always2對posedge count[0]敏感。 當一posedge clock出現時,always0, always1會產生evaluation events (這是屬於process的evaluation event,assignment也有evaluation event)[1], 也就是要計算它們的sequential blocks。這兩個evaluation events,執行順序 以SystemVerilog標準而言是任意的(arbitrary)。 但今天不管always0的"count <= count+1;",還是always1的"a <= i;"先執行, count與a都不會立即update,因為它們是NBA。 等到進入NBA events region時(嚴格講是NBA events region所有events都active, 被放到active events region執行[2]), 如果count先更新,它的更新會產生posedge count[0], 就會使得always2產生evaluation event。 但一個問題來了這evaluation event究竟會被放到哪個region, IEEE 1800-2009沒有講清。 依我用排除法: inactive events region放#0 statements,所以不合。 NBA events region放NBA updates,所以不合。 所以最適合的地方就是active events region。 那現在active events region有: "a <= i;" NBA update, always2 evaluation events。 又active events region有nondeterminism特性, 所以理論上誰先執行都是符合IEEE 1800-2009的標準,所以有race condition! 但實際上我用NC-Verilog, ModelSim, VCS都得到b會抓a新值(edge之後)。 所以我之前說"b訊號都應該會抓a的新值"嚴格來講不太正確, 這可能只是實際simulators是如此作,但理論、標準上沒有這麼說。 從上面所見NBA的特性我們可以得知,若是多個always都由同一clock edge觸發且 使用NBA,那麼應該不會有race condition的問題。 但跨clock domain,如always1與always2,理論上會有race的問題。 雖然跨clock domain的RTL simulation雖然會得到與實際電路 timing不同的結果,但實際拿去作synthesis、修hold time, 就會得到一般數位電路的行為,也就是變成"b會去抓a舊值", 這也是horsehead大所提到的問題。 這也是RTL and synthesis mismatch的問題。 這問題最好用"q <= #1 d;"就可以解決mismatch問題。 目前看來"q <= #1 d;"並沒有很嚴重的缺點, 又可以解決跨clock domain的RTL simulation問題, 它應該是比"q <= d;"更好的coding style。 至於ViewMoon大說曾經遇過同一clock group,不加#1, 不同simulator會有不同結果,不知可否提供範例讓大家研究是怎樣的情形。 [1] IEEE, "IEEE 1800-2009," p.p. 23, Dec 2009. ※ 引述《zxvc (眾生都是未來佛)》之銘言: : 標題: Re: [心得] Verilog使用nonblocking assignment解ꠠ… : 時間: Tue Aug 24 21:41:32 2010 : : [恕刪] : : : 推 ViewMoon:sunburst 上的 paper 是好物,在我初學時獲益良多深受啟發 08/24 20:48 : : → ViewMoon:q <= d 最好寫成 q <= #1 d; 一是為了 waveform 易 check 08/24 20:50 : : → ViewMoon:另外它也反映 gate level simulation 時, clock edge 的 08/24 20:51 : : → ViewMoon:相位超前 q transition point 的事實 08/24 20:52 : : → ViewMoon:還有一個原因是, 我遇過加或不加 #1, 導致 simulation 08/24 20:53 : : → ViewMoon:result 不同, 原因可能是 dff0/dff1 clock 不同, 但這兩 08/24 20:55 : : → ViewMoon:個 clock 是同一 clock group, 加 #1 比較不會遇到 08/24 20:56 : : → ViewMoon:simulator 牌子不同而不同的結果 08/24 20:57 : : ViewMoon大提到的"q <= #1 d;"這個問題我用SystemVerilog Scheduling去 : 推,真的會有race的問題(即使用了NBA)。至於詳細推導過程就懶得說了。 : : 一個可能發生這race的問題是"除頻器": : ~~~~~~~~~~~t.sv~~~~~~~~~~~~~~~~~~ : module t : ( : input i, : input nreset, : input clock : ); : logic a, b; : logic [0:0] count; : : always_ff@(posedge clock or negedge nreset) begin : if(!nreset) : count <= 0; : else : count <= count+1; : end : : always_ff@(posedge clock or negedge nreset) begin : if(!nreset) : a <= 0; : else : a <= i; : end : : always_ff@(posedge count[0] or negedge nreset) begin : if(!nreset) : b <= 0; : else : b <= a; : end : endmodule : : module tb; : logic i; : logic nreset; : logic clock; : : initial begin : clock = 0; : forever #50 clock = ~clock; : end : : t t1(.*); : : initial begin : nreset = 1; : i = 0; : : #5; : nreset = 0; : : #5; : nreset = 1; : : #30; : i = 1; : : #100; : i = 0; : : #100; : i = 1; : : #100; : $stop; : end : endmodule : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ : : ModelSim SE 6.6b模擬結果: : http://pic.pimg.tw/zxvc/ccf4322240d5a015cf5b7a8c88ad616d.png?v=1282656775 : : 其中b在250 ps時沒有capture到a的0。 : 用"q <= #1 d;"應該可以解決這問題。 : : -- : 信佛的人要知道:佛絕不會說謊。但請把握時光。 : 法滅盡經: : http://www.cbeta.org/result/normal/T12/0396_001.htm : 共勉之。 : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 140.115.221.79 : → zxvc:抱歉,剛才仔細想想這問題不是非決定性的問題,b應該不管 08/24 22:37 : → zxvc:用什麼simulator(假設符合Verilog標準)都應該會抓a的新值。 08/24 22:38 : → zxvc:理由改天有空再解釋,不信的人可以先用各種simulators模擬。 08/24 22:39 : → zxvc:但我並沒有否定如"q <= #1 d;可以用來解這除頻器問題"。 08/24 22:45 : → horsehead:這應該是因為他是RTL LEVEL 模擬的關係吧 不然正式設計 08/24 23:11 : → horsehead:上應該不可能讓信號跟時脈同時轉變 08/24 23:13 -- 信佛的人要知道:佛絕不會說謊。但請把握時光。 法滅盡經: http://www.cbeta.org/result/normal/T12/0396_001.htm 共勉之。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.73.168 ※ 編輯: zxvc 來自: 140.115.73.168 (08/25 11:46)
zxvc:補充一點,那些simulators我沒原始碼,所以我所看到的模擬結 08/25 11:55
zxvc:果充其量只是"實驗結果",我說"實際上b會抓新值"只是"假說"。 08/25 11:57
zxvc:這篇文章最大的意義是"指出跨clock domain"有不確定性,最好 08/25 11:58
zxvc:用"q <= #1 d;"解。 08/25 11:58