VHDL - 为什么不在 "process" 块中包含 else 条件是不好的做法?

VHDL - Why is it bad practice to not include an else-condition in a "process" block?

我正在观看 VHDL 初学者教程。讲师说,在“过程”块中不包含其他条件是不好的做法,因为它会创建一个锁存器并且不利于提前电路的计时。他说,包含一个 else-condition 将创建一个 mux,并且在大多数情况下更好用。 这是为什么? snippet from lecture video

为什么锁存器设计不利于时序,什么使多路复用器设计更好?

重点是制作产生您想要的设计的 VHDL 代码,风险是您会无意中创建锁存器。

VHDL中有几种基本结构可以说明这一点。

使用 if-then-else 按进程进行 Mux,可以使用以下代码进行:

process (all) is  -- Mux
begin
  if sel = '0' then
    z <= a;
  else
    z <= b;
  end if;
end process;

使用 if-then 和默认赋值的进程复用,可以用这个派生代码来实现:

process (all) is  -- Mux
begin
  z <= b;  -- Default b, thus for sel = '1', since no overwrite
  if sel = '0' then
    z <= a;
  end if;
end process;

但是,如果你想做一个多路复用器,那么更好的编码风格是通过以下代码连续赋值:

z <= a when (sel = '0') else b;

最后,如果结果输出未在代码的所有分支中分配,则可能导致进程闩锁。如果 if-then 既没有 else 也没有默认赋值给输出,就会发生这种情况,就像下面的代码:

process (all) is  -- Latch
begin
  if en = '1' then
    q <= d;
  end if;
end process;

因此,在使用过程设计组合逻辑时,一个好的规则是有一个初始行,该行对结果输出进行默认分配,例如仅分配未定义 'X'。从而避免了闩锁,如果这是一个错误,功能验证应该捕获未定义的'X'。

此外,请记住检查综合报告中有关已创建锁存器的警告,因为这很可能是设计中的错误。