Verilog加法器出现意外延迟

时间:2014-01-22 05:25:18

标签: verilog fpga

我为一个有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。

3 个答案:

答案 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。

我会将复位移到时钟的边缘的左侧或右侧。这应该会给你你想要的效果。