作者zxvc (眾生都是未來佛)
看板Electronics
標題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