In Verilog, whether always @(*) expects the actions to be completed in 1 clock period?

时间:2015-10-06 08:17:21

标签: verilog

In Verilog, my peripherals are running at 100MHz = 10 nano seconds. In once always@(positive) block I was trying to do operations that exceeds 10 nano seconds. I rearranged the code so that the operations are performed now in an always@(*) block. Even now I have the same issue and my bitstream is not getting generated. So my question is why should always block should worry about the period ? as synchronization between clock and always@(*) block is not expected

1 个答案:

答案 0 :(得分:1)

虽然在不了解您的代码和综合结果的情况下,我无法确定这是您的问题;您可能会遇到一个时序问题,即设计中的逻辑无法在单个100MHz周期内完成。

在创建顺序设计时,必须始终意识到实际逻辑具有传播延迟。这意味着寄存器之间的逻辑越多(即,需要在单个时钟周期内完成),逻辑将实时采用的时间越长。因此,您可能面临的问题是,您在一个步骤中尝试执行的计算量所花费的时间比时钟周期长(减去存储结果的寄存器的设置时间)。

同样重要的是要注意,虽然将设计从使用单个always @(posedge)更改为always @(*),但不会导致合成结果发生任何重大变化,因为您所描述的设计实际上是相同的(即,一堆逻辑进行一些计算,然后是一组寄存器来存储结果)。虽然模拟设计可能会有所不同,但从代码中合成的硬件将非常相似,因此问题仍将存在。

为了解决这些时序问题,您可以将逻辑拆分为较小的部分并对其进行流水线处理,也可以将设计更改为迭代(采用多个时钟周期)。您可能能够更改设计中的逻辑以将长链转换为树结构或其他东西,以尝试分解通过逻辑的最长路径(从而减少总体传播延迟),但根据设计,可能不可能。