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
答案 0 :(得分:1)
虽然在不了解您的代码和综合结果的情况下,我无法确定这是您的问题;您可能会遇到一个时序问题,即设计中的逻辑无法在单个100MHz周期内完成。
在创建顺序设计时,必须始终意识到实际逻辑具有传播延迟。这意味着寄存器之间的逻辑越多(即,需要在单个时钟周期内完成),逻辑将实时采用的时间越长。因此,您可能面临的问题是,您在一个步骤中尝试执行的计算量所花费的时间比时钟周期长(减去存储结果的寄存器的设置时间)。
同样重要的是要注意,虽然将设计从使用单个always @(posedge)
更改为always @(*)
,但不会导致合成结果发生任何重大变化,因为您所描述的设计实际上是相同的(即,一堆逻辑进行一些计算,然后是一组寄存器来存储结果)。虽然模拟设计可能会有所不同,但从代码中合成的硬件将非常相似,因此问题仍将存在。
为了解决这些时序问题,您可以将逻辑拆分为较小的部分并对其进行流水线处理,也可以将设计更改为迭代(采用多个时钟周期)。您可能能够更改设计中的逻辑以将长链转换为树结构或其他东西,以尝试分解通过逻辑的最长路径(从而减少总体传播延迟),但根据设计,可能不可能。