Intel® Quartus® Prime Pro Edition用户指南: 设计建议

ID 683082
日期 9/28/2020
Public

本文档可提供新的版本。客户应 单击此处 前往查看最新版本。

文档目录

1.5.3.1. 避免意外锁存生成

当设计组合逻辑时,某些编码样式会创建意外的锁存器。 例如,当CASEIF语句未涵盖所有可能的输入条件时,如果未分配新的输出值,那么综合工具可以推断锁存器以保留输出。请查看综合工具消息以参考获推断的锁存器。

如果代码无意中创建了一个锁存器,那么请修改RTL以删除此锁存器:

  • 当HDL代码将值分配给时钟沿之外的信号时(例如,使用异步reset),综合会推断一个锁存器,但是代码不会在边沿触发的设计模块中分配一个值。
  • 当HDL代码在边沿触发的设计模块中为信号分配值时,也会出现意外的锁存器,但是综合优化会删除此逻辑。例如,当CASEIF语句测试仅评估为FALSE的条件时,综合会在优化过程中删除此语句中的任何逻辑或信号分配。这种优化可能导致推断信号的锁存器。
  • IFCASE语句中省略最后的ELSEWHEN OTHERS子句也可以生成一个锁存器。默认条件上的don’t care (X) assignment对于防止存储器生成很有用。为了实现最佳逻辑优化,请对默认的CASE或最终的ELSE值分配一个don’t care (X),而不是一个逻辑值。

在Verilog HDL设计中,使用full_case属性将未指定的情况视为don’t care值(X)。但是,由于full_case属性是synthesis-only,因此可能导致仿真不匹配,因为仿真工具仍将未指定的情况视为锁存器。

防止意外创建锁存器的VHDL代码

没有最终的ELSE子句,以下代码将创建意外的锁存器,以覆盖SEL输入的其余组合。当对 Stratix® 器件系列使用此代码时,省略最终的ELSE条件会导致综合工具最多使用六个LE,而不是使用ELSE语句的三个LE。此外,将最终的ELSE子句赋值给1而不是X会导致LE的增加,因为当指定一个常量值而不是don’t care值时,综合工具无法执行尽可能多的优化。

LIBRARY ieee;
USE IEEE.std_logic_1164.all;

ENTITY nolatch IS
	PORT (a,b,c: IN STD_LOGIC;
		sel: IN STD_LOGIC_VECTOR (4 DOWNTO 0);
		oput: OUT STD_LOGIC);
END nolatch;

ARCHITECTURE rtl OF nolatch IS
BEGIN
	PROCESS (a,b,c,sel) BEGIN
		IF sel = "00000" THEN
			oput <= a;
		ELSIF sel = "00001" THEN
			oput <= b;
		ELSIF sel = "00010" THEN
			oput <= c;
		ELSE 				  --- Prevents latch inference
			oput <= 'X'; --/
		END IF;
	END PROCESS;
END rtl;