【问题标题】:Is process in VHDL reentrant?VHDL中的过程是可重入的吗?
【发布时间】:2012-12-06 21:53:12
【问题描述】:

VHDL 中的一个进程是否可以连续运行两次或多次?

如果另一个事件发生(在敏感信号列表上)而进程的顺序执行没有完成,会发生什么?

有没有可能,或者我为流程考虑的VHDL 模型完全错误?

【问题讨论】:

  • 你可能想澄清你的问题
  • 你能用一些示例代码说明情况吗?我相信我知道您在问什么,但如果没有具体问题,很难回答。

标签: process delay vhdl reentrancy


【解决方案1】:

进程运行时不会发生任何事件!

当一个进程被事件唤醒时,它会运行到完成(“结束进程”)或明确的“等待”语句,然后进入睡眠状态。从理论上讲,这需要零时间。这意味着如果您的流程中有循环,它们将有效地完全展开,并且当您合成时,您将生成足够的硬件来并行运行每个迭代。此外,任何过程、函数等都需要零时间 - 除非它们包含明确的“等待”语句(在这种情况下,进程会在“等待”处暂停,就像过程已被内联一样)。

在整个过程中,所有信号都具有它们在进程唤醒时最初具有的值,并且任何信号分配都被存储起来,以便以后发生。 (变量会立即更新;过程中的后续语句会看到新值)。

当进程挂起时(在“等待”或“结束进程”),在所有其他进程也挂起之前什么都不会发生。 (但请记住,它们都需要零时间!)。如果一个进程在“结束进程”处挂起,它将在其敏感度列表唤醒它时从头开始重新启动。如果它在明确的“等待”处暂停,则“等待”将指定一个事件或未来时间,这将在“等待”之后重新启动它。 (注意:1:不要在同一个过程中混合敏感列表和等待样式!2:等待直到某些事件是可合成的(尽管某些工具可能会反对);等待一段时间只是模拟)

然后执行所有信号分配。由于所有进程都处于休眠状态,这消除了所有竞争条件和计时危险。其中一些分配(例如时钟的“1”)将导致事件被安排在对其敏感的进程上。

在所有信号分配完成后,时间向前移动一个无限短的滴答声(称为增量周期),然后唤醒所有具有预定事件的进程。

这一直持续到一个增量周期发生,其中没有安排新事件,最后模拟可以前进一个实时步长。

这样

process(clk)
begin
if rising_edge(clk) then
   A <= B;
   B <= A;
end if;
end process;

在 VHDL 中是无危险的。

如果您需要使用 Verilog,请注意其中一些情况会有所不同,并且您不能依赖模拟结果中相同级别的可预测性。


当然,在综合中,我们会生成需要一些实时时间来执行此过程的硬件。然而,综合和后端工具(布局和布线)保证要么忠实地遵循这个模型,要么失败并报告失败的原因。例如,他们会将所有实际延迟相加并验证总和是否小于您指定的时钟周期。 (除非您将时钟速度设置得太高!)。

所以结果是,只要工具报告成功(并且您正确设置了时钟速度等时序约束),您就可以假装上述“零时间”模型为真,并且真实的硬件行为将与模拟相匹配.保证,排除工具错误!

【讨论】:

  • “例如,他们会将所有实际延迟相加并验证总和是否小于您指定的时钟周期。(除非您将时钟速度设置得太高!)。”我不明白。因此,如果您将时钟速度设置得太高,那么它们将允许总和高于时钟周期并且不会验证?
  • 我想工具的这种保证也是没有推断出分隔符的原因。因为它们很可能总是花费比时钟周期更长的时间?
  • 他们将产生大于时钟周期的延迟总和,并报告他们未能满足您要求的时间安排。然后你必须修改设计(或工具实现的方式,例如“优化速度而不是面积”)或时序约束,然后重试,直到满足时序。
【解决方案2】:

在开始使用 VHDL(或任何其他 HDL)时,丢弃所有顺序代码的概念非常重要,而是专注于通过硬件的数据流。在硬件中,一切本质上都是并行的(一切同时发生),但使用不断变化的数据(输入信号)来计算不断变化的结果(输出信号)!

无需深入探讨变量、等待命令等更高级的主题,进程中的所有内容都会同时发生。如果在同一个进程中发生冲突(多次写入同一个信号),则进程中的最后一条语句获胜,这通常是 VHDL 中“顺序”代码混淆的原因。

这是由于将值分配给信号的方式而起作用的。给信号赋值时,信号的值不会立即改变!相反,分配的值会被记住,并将在稍后作为实际信号值提交(为下一个增量周期做准备,这实际上是下一个时间段)。

由于直到前一个 delta 周期的所有进程都完成后才会开始下一个 delta 周期,因此信号值仅在没有进程运行时才会更改。一旦所有信号都发生了变化,下一个增量周期就开始了,任何对变化的信号敏感的进程都将被执行。

如果一个进程对它也写入的信号敏感,那么您就有了所谓的组合循环,例如,输出馈送输入的门。这(几乎)总是电路中的错误,通常会导致模拟器进入无限增量循环循环。

这就是我现在要写的全部内容,因为在我写这篇文章时,Brian Drummond 的答案刚刚弹出,但请随时发表评论,我会添加更多细节。

【讨论】:

    【解决方案3】:

    一旦进程开始运行(由于某个事件),它会在任何其他事件被允许触发其他任何事件之前运行到完成。

    【讨论】:

    • 是在整个entity 中还是在process还有其他内容
    • 只是过程。进程完成后,您无法知道下一个准备运行相同增量周期的进程将被调度。它可能来自同一实体,也可能不是。而且(只要你不使用共享变量)没关系
    猜你喜欢
    • 2015-08-13
    • 1970-01-01
    • 2022-01-03
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多