等到 rising_edge(clk) 与 if rising_edge(clk)

wait until rising_edge(clk) vs if rising_edge(clk)

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

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

另一个是

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

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

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

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

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

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

这两种形式对于 Vivado 中的综合都是等效的。第二个 wait 形式可以被认为更紧凑,因为它 "saves" 一个缩进级别。

我基本同意@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;

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

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