我想将输入信号延迟一个完整的时钟周期。
我有下面的代码,它基本上试图改变时钟位置的信号。
然而,测试台显示它并不总是延迟1个循环。
在某些情况下,它会在输入信号改变的同时发生变化。
有没有办法解决这类问题?
std::vector
这是波形:
例如,波形显示当输入信号在时钟边沿变为1010时,输出也同时变化。实际上,delayed_signal实际上没有延迟到下一个周期!
答案 0 :(得分:2)
因此,在original_signal
的上升沿发生的同时更改clk
时,original_signal
会根据clk
在更新前获取新值,结果是你没有得到理想的延迟。
使用非阻止分配(<=
),而不是阻止=
块中的分配(always
)。
同样使用clk
来控制刺激数据的变化,repeat (5) @(posedge clk);
为@ e19293001指出,以便为顺序设计提供强大的测试平台。
详细了解上述搜索中的问题,以及此Nonblocking Assignments in Verilog Synthesis。
答案 1 :(得分:2)
此问题与您的问题Why is my D Flip Flop not waiting for the positive edge of the clock?
非常相似您可能希望尝试此约定以避免竞争条件:
@(posedge clk);
尽量避免使用阻止分配将输入信号设置到RTL代码。使用非阻塞分配,而不是@Morten Zilmer建议的那样。
你的测试台应该看起来像这样:
module delay_one_cycle(
input clk,
input[3:0] original_signal,
output reg[3:0] delayed_signal
);
always @(posedge clk) begin
delayed_signal <= original_signal;
end
endmodule
module delay_one_cycle_tb();
reg clk;
reg[3:0] original_signal;
wire[3:0] delayed_signal;
delay_one_cycle doc_inst (clk, original_signal, delayed_signal);
// Initial setup
initial begin
original_signal <= 4'd9;
repeat (5) @(posedge clk);
original_signal <= 4'd10;
repeat (5) @(posedge clk);
original_signal <= 4'd11;
repeat (4) @(posedge clk);
original_signal <= 4'd12;
repeat (3) @(posedge clk);
original_signal <= 4'd13;
// finish the simulation
repeat (5) @(posedge clk);
$finish;
end
initial begin
clk = 0;
forever begin
#1 clk = !clk;
end
end
endmodule
希望有所帮助。
答案 2 :(得分:0)
这可能是因为在您更改输入数据的那一刻,输出值就会更改,但是例如,根据您的测试台,将值更改为4'd11是在时钟的疏忽下发生的。因此,直到时钟摆正之前,才输入原始模块中的始终块。