作者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)
1F:→ zxvc:补充一点,那些simulators我没原始码,所以我所看到的模拟结 08/25 11:55
2F:→ zxvc:果充其量只是"实验结果",我说"实际上b会抓新值"只是"假说"。 08/25 11:57
3F:→ zxvc:这篇文章最大的意义是"指出跨clock domain"有不确定性,最好 08/25 11:58
4F:→ zxvc:用"q <= #1 d;"解。 08/25 11:58