在Verilog中,@(*)是否总是期望动作在1个时钟周期内完成?

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

在 Verilog 中,我的外围设备 运行 在 100MHz = 10 纳秒。在一次 always@(positive) 块中,我试图执行超过 10 纳秒的操作。我重新安排了代码,以便现在在 always@(*) 块中执行操作。即使现在我也有同样的问题,我的比特流没有生成。所以我的问题是为什么总是要阻止应该担心的时期?因为时钟和 always@(*) 块之间的同步不是预期的

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

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

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

为了解决此类时序问题,您可以将逻辑分成更小的部分并将其流水线化,或者您可以将设计更改为迭代(采用多个时钟周期)。您可能可以更改设计中的逻辑,将长链转换为树结构或其他东西,以尝试打破通过逻辑的最长路径(从而减少整体传播延迟),但取决于设计,可能不可能。