我有一个设计,我的时钟从1转换到x,触发@posedge clk事件但是根据LRM 1到x应该触发negedge事件。
所以我试着用简单的d-flop触发器&它表现得与此类似。这是我用于模拟的d-flip / flop的代码。
module dff (clk,d,q);
input clk,d;
output q;
reg q;
always @(posedge clk) begin
q <= d;
end
endmodule
这是我的测试平台
module tb_dff();
reg clk,d;
wire q;
reg clk_int,en;
dff U1 (.clk(clk),.d(d),.q(q));
initial begin
clk_int = 0;
forever #5 clk_int = ~clk_int;
end
always @(*) begin
clk = en ? 1'bx :clk_int ;
end
initial begin
d <= 1'b1 ; en <= 1'b0;
@ (posedge clk);
@ (posedge clk);
#5
//clk 1-->x transition
d <= 1'b0 ; en <= 1'b1;
@ (posedge clk_int);
@ (posedge clk_int);
$stop;
end
endmodule
当我模拟设计时。 当我的clk从1变为x时,q得到新值1'b0。
你能解释一下这种行为吗?
答案 0 :(得分:1)
在:
之间存在零时间故障竞争条件forever #5 clk_int = ~clk_int;
...
always @(*) clk = en ? 1'bx :clk_int ;
和
...
@(posedge clk);
#5;
en <= 1'b1;
...
Verilog调度程序将在更新任何非阻塞分配之前更新所有计划的阻止分配。 en
是非阻止的,因此clk_int
和clk
将在en
之前更新。 clk
更新后,en
将重新评估。
在零时间内,clk
转换1'b1-> 1'b0-> 1'bx,触发negedge
和posedge
事件。
可能的解决方案:
en
之前减少延迟。 EX #4
en
分配阻止作业。 (98%的时间工作。只有潜在的问题是如果输入也有毛刺/竞争条件)clk_int
或clk
上使用非阻止分配( NOT RECOMMENCED!在小型设计中工作,但可能会产生更多毛刺/竞争条件。在大型模拟中,这可以添加通过重新评估对调度程序进行重大改进)答案 1 :(得分:0)
我看到与2个模拟器(NC和VCS)相同的结果。如果您在测试平台模块中将所有posedge
更改为negedge
,则其行为应符合您的要求:
initial begin
d <= 1'b1 ; en <= 1'b0;
@ (negedge clk);
@ (negedge clk);
#5
//clk 1-->x transition
d <= 1'b0 ; en <= 1'b1;
@ (negedge clk_int);
@ (negedge clk_int);
$stop;
end
在您的测试平台中,您以临时方式使用阻止和非阻塞分配以及#delay和@posedge。