在 register/flipflop 分配期间未在 Vivado 仿真中看到时钟周期延迟
Not seeing a clock cycle delay in Vivado simulation during a register/flipflop assignment
我正在尝试从信号 ext_sample_clk
生成脉冲。我的设计目前有 2 个时钟信号,clk
和 ext_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_r1
和 ext_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 上的 运行 示例。
我正在尝试从信号 ext_sample_clk
生成脉冲。我的设计目前有 2 个时钟信号,clk
和 ext_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_r1
和 ext_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 上的 运行 示例。