Re: [心得] Verilog使用nonblocking assignment解ꠠ…
[恕刪]
: 推 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
→
08/24 22:37, , 1F
08/24 22:37, 1F
→
08/24 22:38, , 2F
08/24 22:38, 2F
→
08/24 22:39, , 3F
08/24 22:39, 3F
→
08/24 22:45, , 4F
08/24 22:45, 4F
→
08/24 23:11, , 5F
08/24 23:11, 5F
→
08/24 23:13, , 6F
08/24 23:13, 6F
討論串 (同標題文章)