这应该是 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;

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

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

原因是每次执行gt <= <value>指令时,<value>都不会立即分配给信号gt。相反,它被记录在模拟器内存中的某个地方,作为在当前仿真步骤结束时分配给信号gt的值。在当前模拟步骤结束时,在所有进程都已执行并暂停在wait语句(或其敏感度列表,相当于wait语句(上后,模拟器会使用记录的值更新信号gt

因此,如果您在同一模拟步骤中执行:

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

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

最新更新