这应该是 vhdl 中的多驱动器错误

should this be a multiple drive error in vhdl

考虑这个 VHDL 代码:

process(a, b)
begin
    equal <= '0'; --default
    gt <= '0'; --default
    if a=b then
        equal <= '1';
    end if;
    if a>b then
        gt <= '1';
    end if;
end process;

所谓的 'default' 值应该可以防止信号 gtequal 的锁存器。但由于这不是一个时钟过程,这不应该是信号 gtequal 的多个驱动程序的错误吗?

这不是多驱动情况,因为您的信号是由一个进程驱动的(当然,除非您还从另一个进程驱动它们)。所以没关系。也许让您感到困惑的是,在同一个进程执行期间多次分配同一个信号。完整而详细的答案对于这个简短的答案来说太复杂了。但为了简单起见,如果您仅使用 简单 信号分配(没有 after 子句,没有波形...),那么最后一个分配将获胜。

原因是每次执行gt <= <value>指令时,<value>并没有立即赋值给信号gt。相反,它被记录在模拟器内存​​中的某处,作为 在当前模拟步骤 结束时分配给信号 gt 的值。在当前模拟步骤结束时,在所有进程都已执行并暂停在 wait 语句(或它们的敏感列表,相当于 wait 语句)之后,模拟器更新信号gt 与记录值。

所以,如果你在同一个模拟步骤中执行:

gt <= '0';
...
gt <= '1';

第二个赋值将覆盖第一个赋值记录的值,并且 gt 将在模拟步骤结束时取值 '1'