我为一个有10个输入的加法器编写了一些Verilog代码。模拟后,我得到一个额外的时钟延迟输出。为什么我会得到这个延迟?
`timescale 1ns/1ps
module add_10(z0,z1,z2,z3,z4,z5,z6,z7,z8,z9,clk,reset,o);
input [7:0] z0,z1,z2,z3,z4,z5,z6,z7,z8,z9;
input clk,reset;
output reg[15:0] o;
always @ (posedge clk or negedge reset)
begin
if (!reset)
o=16'b0000;
else
o = z0+z1+z2+z3+z4+z5+z6+z7+z8+z9;
end
endmodule
在断言复位后,我在一个时钟后得到输出。但是根据我写的代码,它应该在reset=1
时出现在下一个posedge clk。
答案 0 :(得分:1)
看起来它应该对我有用。
我认为你误解了reset
信号是如何被使用的。 reset
信号应始终保持高电平。当它变为低电平时,输出将立即清除(它在负边沿变化)。当它变高时,output
将占用下一个时钟周期的输入之和。
如果您想更新reset
信号的上升沿,请使用上升沿...
always @ (posedge clk or posedge reset)
...
请注意,这样做可能会影响您的最短周期时间。
答案 1 :(得分:1)
您的代码可能按预期工作,但可能不是。问题是(a)您没有显示如何生成重置,以及(b)您正在使用阻止分配(您不应该使用<=
),因此您可能在其他地方参加比赛,在你的重置生成中。
显示生成重置的代码。如果没有竞争条件,那么波形是正确的; edge A清除复位,但加法器看不到这一点,加法器认为复位仍然有效;加法器在下一个时钟边沿看到它被置低,因此产生一个结果。
答案 2 :(得分:1)
我建议您在测试平台中更改clk的重置时间。你拥有它的方式,重置和clk同时改变。我相信模拟器由于posedge clk而进入你的always块,而reset的值仍为0,因此为你的输出分配0。
我会将复位移到时钟的边缘的左侧或右侧。这应该会给你你想要的效果。