看板 Electronics 關於我們 聯絡資訊
[恕刪] : 推 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