Verilog x-跃迁情况下posedge事件的意外行为

Verilog x-跃迁情况下posedge事件的意外行为,verilog,Verilog,我有一种设计,在这种设计中,我的时钟从1转换到x,触发@posedge clk事件,但根据LRM,1到x应该触发NEGDEDGE事件 所以我在简单的d触发器上尝试了这一点&它的行为类似。这是我用于模拟的d触发器的代码 module dff (clk,d,q); input clk,d; output q; reg q; always @(posedge clk) begin q <= d; end endmodule 模块dff(时钟、d、q); 输入时钟,d; 输出q; reg q;

我有一种设计,在这种设计中,我的时钟从1转换到x,触发@posedge clk事件,但根据LRM,1到x应该触发NEGDEDGE事件

所以我在简单的d触发器上尝试了这一点&它的行为类似。这是我用于模拟的d触发器的代码

module dff (clk,d,q);
input clk,d;
output q;
reg q;
always @(posedge clk) begin
q <= d;
end
endmodule
模块dff(时钟、d、q);
输入时钟,d;
输出q;
reg q;
始终@(posedge clk)开始

q我在两个模拟器(NC和VCS)上看到了与您相同的结果。如果您在testbench模块中将所有的
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
初始开始
d x跃迁

d在以下情况之间存在零时间故障竞争条件:

forever #5 clk_int = ~clk_int;
...
always @(*) clk = en ? 1'bx :clk_int ; 

。。。
@(中电);
#5;
en 1'b0->1'bx,触发
negedge
posedge
事件

可能的解决办法:

  • 在提升
    en
    之前减少延迟。EX
    #4
  • 使用阻塞分配来分配
    en
    。(98%的时间工作。唯一的潜在问题是输入是否也有故障/竞争条件)
  • clk_int
    clk
    上使用非阻塞分配(不重新开始!在小型设计中工作,但可能会产生更多的小故障/竞争条件。在大型模拟中,这可能会通过重新评估为调度程序增加显著的开销)

你在使用哪个模拟器?@Morgan:cadence-NCSIM
forever #5 clk_int = ~clk_int;
...
always @(*) clk = en ? 1'bx :clk_int ; 
...
@(posedge clk);
#5;
en <= 1'b1;
...