【问题标题】:wait until rising_edge(clk) vs if rising_edge(clk)等到rising_edge(clk) vs ifrising_edge(clk)
【发布时间】:2015-09-22 12:35:47
【问题描述】:

我在 VHDL 中遇到了两种风格的过程语句。

process(clk)
begin
    if rising_edge(clk)
....do something....

另一个是

process
begin    
    wait until rising_edge(clk)
    ....do something....

每种方法的优缺点是什么。

【问题讨论】:

标签: vhdl


【解决方案1】:

假设第二个示例的... 部分没有任何wait 语句,这两种形式在语义上是等价的。

它们在模拟中的行为相同。

但是,第一种形式是推荐的综合样式,并且会被许多人认为更具可读性。

【讨论】:

  • 谁推荐的?两种形式都受支持,请参见撤回的 IEEE Std 1076.6-2004、6.1.3.1 边缘敏感存储从具有敏感性列表和一个时钟的进程和使用单个等待语句的 6.1.3.2 边缘敏感存储。区别在于进程是否有一个敏感列表,它暗示wait on clk; 作为进程的最后一个顺序语句(IEEE Std 1076-2008 11.3 进程语句)。哪种形式是纯编码风格的选择。,
  • @user 我手头没有任何参考资料,但是有 synthesis 工具无法使用 wait 语法推断出正确的 FF。
  • 而且它们不会符合 1076.6。
  • @user 是的,但综合工具并不意味着实现完整的标准。
  • @Wap26 它们不是 100% 等价的:根据 LRM,敏感度列表等同于没有敏感度列表并在 last 中添加 wait on <sensitivity-list>; 的同一进程陈述过程,而不是首先。因此,您几乎是对的,它们是等效的:在模拟期间,初始化是不同的。取决于...,差异可能是可观察到的。
【解决方案2】:

这两种形式在 Vivado 中的综合是等效的。第二个wait 形式可以被认为更紧凑,因为它“保存”了一个缩进级别。

【讨论】:

  • 恕我直言,保存缩进级别是没有意义的,除非您的编辑器只显示 80 列。
  • 我并不是说它具有巨大的价值。选择大多是任意的,并且像任何编码标准一样取决于个人喜好。工具不在乎。
  • 此外,如果您的文本编辑器或 IDE 确实“折叠”了代码,那么 wait until ... 将被隐藏,但合成列表仍然可见,假设它与处理关键字。
【解决方案3】:

我大体上同意@wap26 的回答,但要补充一点。

我有时喜欢编写一个顶层架构,它既可以作为可综合的顶层设计,也可以作为仿真测试平台——通常用于较小的设计。

在此类设计中,您通常在仿真期间自己驱动时钟,使用等待语句,例如:

if IS_SIMULATION then
    wait for SIM_CLK_PERIOD / 2; 
    clk <= '0';
    wait for SIM_CLK_PERIOD / 2;
    clk <= '1';
else
    clk <= external_clk;
end if;

现在的问题是您仍然需要处理可合成部分的初始/重置状态。这需要断言实体的信号已在外部时钟的第一个(或某些)上升沿之前初始化。

但是我们不能使用if rising_edge(external_clk),因为这个进程不能有敏感列表(它在模拟部分使用等待语句)。因此,在这种情况下,需要使用wait until rising_edge(external_clk)

【讨论】:

    【解决方案4】:

    本质上,第二种类型仅在模拟中有用。等待语句需要时间在进程内的不同语句之间流动,这与硬件综合过程不同。它通常出现在模拟刺激或诊断过程中。第一种形式,进程由时钟事件触发,单步运行,代表同步逻辑。

    【讨论】:

    • 我不完全同意你回答的第二部分。 wait 确实可以用来产生复杂/异步的刺激,但它也可以用来模拟完全同步的行为,例如触发器。
    • 这是不正确的。在“时间流”方面,两者本质上是相同的,两者之间只有一个细微的(不相关的)差异。我希望大多数综合工具(如果不是全部的话)都能接受这两种形式。不过,几乎每个人都使用第一个。
    • 你被误导了。在之前的项目中,我们使用了wait until rising_edge(clk),因为它“保存”了一个缩进级别并且更紧凑。综合工具(例如 Vivado)认为这两种形式是等效的。
    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    相关资源
    最近更新 更多