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'。
此外,请记住检查综合报告中有关已创建锁存器的警告,因为这很可能是设计中的错误。
我正在观看 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'。
此外,请记住检查综合报告中有关已创建锁存器的警告,因为这很可能是设计中的错误。