在 register/flipflop 分配期间未在 Vivado 仿真中看到时钟周期延迟

Not seeing a clock cycle delay in Vivado simulation during a register/flipflop assignment

我正在尝试从信号 ext_sample_clk 生成脉冲。我的设计目前有 2 个时钟信号,clkext_sample_clk,我是通过测试台生成的。以下是我的简化代码。除此之外,我还有 clk 和重置生成逻辑,为简单起见我没有显示。如果需要,我可以分享这些。

module tb;
reg clk;
reg rst;
reg ext_sample_clk;
reg ext_sample_clk_r1;
wire ext_sample_pulse_orig;

//clock gen logic
always 
begin
    clk = 1'b1; 
    #5; // 10 ns

    clk = 1'b0;
    #5;
end

// reset gen logic
initial 
begin 
    rst = 1;
    #(100);
    rst = 0;
end

// ext_sample_clk logic
always 
begin
    ext_sample_clk = 1'b1; 
    #50; 
    ext_sample_clk = 1'b0;
    #50; 
end

// register the ext_sample_clk logic, should infer a flip flop
always @(posedge clk) begin
    if (rst)
        ext_sample_clk_r1       <= 0;
    else
        ext_sample_clk_r1       <= ext_sample_clk; // lhs doesn't appear to be delayed by 1 clock cycle wrt to rhs
end     
assign ext_sample_pulse_orig   = ext_sample_clk        && !ext_sample_clk_r1; 

endmodule

我希望 ext_sample_clk_r1 比 ext_sample_clk 延迟一个时钟脉冲。但以下是我 运行 在 Vivado 上进行仿真时观察到的情况。

任何人都可以解释为什么我在 ext_sample_clk_r1 中没有看到参考 ext_sample_clk 的时钟周期延迟。我错过了什么吗?

获得您看到的结果的最可能方法是对 ext_sample_clk 使用阻塞赋值而不是非阻塞赋值。您的测试台需要遵循相同的规则,就好像它是设计的一部分一样,以避免竞争条件。使用非阻塞分配或让您的测试平台在相反的边缘应用信号。

由于您希望 ext_sample_clk_r1ext_sample_clk 与同一时钟 (clk) 同步,因此您需要使用非阻塞将它们都从 posedge clk 中驱动作业(<=):

initial begin 
    ext_sample_clk = 1'b1; 
    forever begin
        repeat (10) @(posedge clk);
        ext_sample_clk <= ~ext_sample_clk;
    end
end

这是 edaplayground 上的 运行 示例。