总是阻止@posedge时钟

时间:2013-07-08 19:35:55

标签: verilog clock

我们来看下面的示例代码:

always @(posedge clock)
   begin
   if (reset == 1)
     begin
        something <= 0
     end
   end

现在让我们假设重置从0变为1,同时还有时钟的假设。那一点&lt; = 0?或者这会在下次有时钟的假设时发生(假设复位保持为1)?

4 个答案:

答案 0 :(得分:3)

如果reset是同步的并且基于clock,则模拟器将在下一个时钟而不是当前时间看到复位。物理设计具有时钟到Q,因此在引起它的同一时钟中不会观察到复位的上升。您可能会看到与波形时钟同时复位。 reset <= 1'b1;使得赋值发生在调度程序的末尾附近(在所有代码执行完毕之后)。

在查看波形时不必担心这一点,一些逻辑设计人员喜欢在分配上设置延迟,从而产生人为的时钟到Q延迟(ex reset <= #1 1'b1;something <=#1 0;) 。综合工具将忽略延迟,但有些人会发出警告。使用宏可以避免这种警告。

`ifdef SYNTHESIS
`define Q   /* blank */
`else
`define Q #1
`endif
...
reset <= `Q 1'b1;
...
something <=`Q 1'b1;
...

如果reset是异步的并且与同步复位一起使用,则需要遵守设置时间要求。在模拟中,如果时钟和复位同时上升,则由您的verilog调度程序决定复位是新值还是旧值。通常它将采用左侧值(旧值),这意味着当前时钟将错过重置。物理设计不确定,具有亚稳定性风险。

答案 1 :(得分:2)

这取决于reset的确切驱动方式。

如果同一时钟触发了resetsomething,那么在复位为1后,某个时钟周期会变为0。例如:

always @(posedge clock)
   begin
   if (somethingelse)
     begin
        reset <= 1;
     end
   end

答案 2 :(得分:1)

您编写的代码推断出具有同步复位功能的触发器。这意味着假设“复位”信号在以这种方式使用之前与“时钟”域同步。如果“reset”信号未同步,那么您应修改代码以推断具有异步复位的触发器,如下所示:

always@(posedge clock or posedge reset)
begin
  if (reset)
    something <= 0
  else 
    something <= something_else
end

回到你的问题并假设你所写的代码是你想要的,结果取决于重置的驱动方式。如果它是同步的,那么模拟器将在下一个时钟边沿看到它。如果它是异步的,那么模拟器可以假设任何东西,它可以从模拟器到模拟器不等。请注意,在模拟器中,一切都是一系列事件,并且没有同时发生的事情。

在物理世界中,你编码的将导致触发器,其中复位信号是驱动该触发器输入的组合的输入之一。现在,如果重置是同步的,则保证在此次翻牌时不会出现设置或保持违规。触发器是否“看到”此时钟或下一个时钟的复位取决于合成电路的各种延迟(通常这是复位始终保持几个时钟周期以确保设计中所有触发器的主要原因看到重置)。如果复位是异步的,那么翻牌将进入亚稳状态。你永远不会想要这个在你的设计中。 希望这澄清。

答案 3 :(得分:0)

简短的回答是,你的两个结果中的任何一个(立即或下一个周期)都可能发生。这是一个标准的竞争条件,模拟器可以任意方式自由处理;有些人会给出一个答案,有些人会给出另一个答案。

对于长篇答案,请查阅有关VHDL delta周期如何工作的任何介绍性文本。 Verilog没有指定'delta cycles',但任何Verilog模拟器都将以完全相同的方式工作,整个调度算法中会有一些(不相关的)更改。在这种情况下,调度程序发现它在队列中有两个特定增量的事件 - 重置上升和时钟上升。这就是“同时”的意思。它以未指定的方式选择一个(它可能在文本源中较早,或者稍后,例如),通过与该边相关的所有更改,然后返回并处理与另一个边相关的所有更改。