这应该是 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' 值应该可以防止信号 gt
和 equal
的锁存器。但由于这不是一个时钟过程,这不应该是信号 gt
和 equal
的多个驱动程序的错误吗?
这不是多驱动情况,因为您的信号是由一个进程驱动的(当然,除非您还从另一个进程驱动它们)。所以没关系。也许让您感到困惑的是,在同一个进程执行期间多次分配同一个信号。完整而详细的答案对于这个简短的答案来说太复杂了。但为了简单起见,如果您仅使用 简单 信号分配(没有 after
子句,没有波形...),那么最后一个分配将获胜。
原因是每次执行gt <= <value>
指令时,<value>
并没有立即赋值给信号gt
。相反,它被记录在模拟器内存中的某处,作为 在当前模拟步骤 结束时分配给信号 gt
的值。在当前模拟步骤结束时,在所有进程都已执行并暂停在 wait
语句(或它们的敏感列表,相当于 wait
语句)之后,模拟器更新信号gt
与记录值。
所以,如果你在同一个模拟步骤中执行:
gt <= '0';
...
gt <= '1';
第二个赋值将覆盖第一个赋值记录的值,并且 gt
将在模拟步骤结束时取值 '1'
。
考虑这个 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' 值应该可以防止信号 gt
和 equal
的锁存器。但由于这不是一个时钟过程,这不应该是信号 gt
和 equal
的多个驱动程序的错误吗?
这不是多驱动情况,因为您的信号是由一个进程驱动的(当然,除非您还从另一个进程驱动它们)。所以没关系。也许让您感到困惑的是,在同一个进程执行期间多次分配同一个信号。完整而详细的答案对于这个简短的答案来说太复杂了。但为了简单起见,如果您仅使用 简单 信号分配(没有 after
子句,没有波形...),那么最后一个分配将获胜。
原因是每次执行gt <= <value>
指令时,<value>
并没有立即赋值给信号gt
。相反,它被记录在模拟器内存中的某处,作为 在当前模拟步骤 结束时分配给信号 gt
的值。在当前模拟步骤结束时,在所有进程都已执行并暂停在 wait
语句(或它们的敏感列表,相当于 wait
语句)之后,模拟器更新信号gt
与记录值。
所以,如果你在同一个模拟步骤中执行:
gt <= '0';
...
gt <= '1';
第二个赋值将覆盖第一个赋值记录的值,并且 gt
将在模拟步骤结束时取值 '1'
。