作者zxvc (眾生都是未來佛)
看板Electronics
標題Re: [心得] Verilog使用nonblocking assignment解ꠠ…
時間Wed Aug 25 11:45:53 2010
那個"除頻器的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