让我们下面的示例代码:总是阻止@posedge时钟
always @(posedge clock)
begin
if (reset == 1)
begin
something <= 0
end
end
现在让我们假设同时有另外的时钟posedge复位从0变为1。 < = 0在这一点上?或者当下一次出现时钟偏移时(假设复位保持1),会发生这种情况吗?
让我们下面的示例代码:总是阻止@posedge时钟
always @(posedge clock)
begin
if (reset == 1)
begin
something <= 0
end
end
现在让我们假设同时有另外的时钟posedge复位从0变为1。 < = 0在这一点上?或者当下一次出现时钟偏移时(假设复位保持1),会发生这种情况吗?
这取决于如何驱动reset
。
如果reset
和something
都触发了相同的时钟,然后事情会复位后去到1。例如去0一个时钟周期:
always @(posedge clock)
begin
if (somethingelse)
begin
reset <= 1;
end
end
如果reset
是同步的,基于clock
, simulatore会在下一个时钟看到重置,而不是当前。物理设计具有时钟到Q,因此在引起复位的时钟中不会观察到复位的增加。您可能会看到与波形时钟同时复位。 reset <= 1'b1;
使调度程序结束时执行任务(在所有代码执行后)。
为了在查看波形时不必担心这个问题,一些逻辑设计人员喜欢在创建人工时钟到Q延迟(例如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调度程序决定复位是新值还是旧值。通常它会采用左侧值(旧值),这意味着当前时钟将会丢失重置。物理设计不确定以及具有元稳定性风险。
简而言之,您的两个结果(立即或下一个周期)中的任何一个都可能发生。这是一个标准的竞赛条件,模拟器可以自由地处理任何他们想要的方式;有些人会给出一个答案,其他人会给另一个答案。
对于长时间的答案,请查阅关于VHDL delta循环如何工作的任何介绍性文字。 Verilog没有指定'增量循环',但是任何Verilog仿真器都能以完全相同的方式工作,并且在整个调度算法中会有一些(不相关的)变化。在这种情况下,调度程序发现它在队列中有两个事件在特定的增量 - 复位上升和时钟上升。这是“同时”的意思。它以非特定的方式选择一个(它可能在文本源中较早,或者稍后),处理与该边缘相关的所有更改,然后返回并处理与另一个边缘关联的所有更改。
您编写的代码推断同步重置触发器。这意味着假定在以这种方式使用之前“复位”信号与“时钟”域同步。如果“复位”信号不那么同步,您应该修改代码来推断触发器具有异步复位如下:
[email protected](posedge clock or posedge reset)
begin
if (reset)
something <= 0
else
something <= something_else
end
现在回到你的问题,假设你已经编写的代码是你想要什么,结果取决于重置的驱动方式。如果它是同步的,那么模拟器会在下一个时钟边沿看到它。如果它是异步的,那么模拟器可以假设任何东西,它可以从模拟器变为模拟器。请注意,在模拟器中,所有事件都是一系列事件,并没有同时发生的事情。
在物理世界中,您所编码的将会产生一个触发器,其中复位信号是驱动此触发器输入的组合输入之一。现在如果重置是同步的,你可以保证在这次翻牌没有设置或保持违规。翻转是否会在这个时钟或下一个时钟中看到复位取决于合成电路的各种延迟(通常这是复位总是保持几个时钟周期以确保设计中的所有触发器的主要原因看到重置)。如果重置是异步的,那么翻牌将进入亚稳状态。你永远不会想要你的设计。 希望澄清。
@ user2548255:这不能回答你的问题。你的意思是“同时”吗?如果你这样做了,那么重置如何驱动并不重要。如果没有,那么你应该编辑你的问题。 – EML