FPGA组合逻辑设计技巧分享2

警惕不完整 if 语句生成锁存器

采用if语句描述组合逻辑时,对于不完备的if语句,即缺少else分支的if语句要格外关注,因为综合工具会将其视为锁存器。

1、锁存器生成原理

组合逻辑电路不应该具有记忆功能,而当if语句没有覆盖所有可能的输入条件时,综合工具会认为在未覆盖的条件下需要保持信号的原有值,这就需要生成锁存器(Latch)来实现 “保持” 功能。

锁存器是电平敏感的存储元件,会带来时序不稳定、功耗增加以及难以进行时序分析等问题。

2、错误示例

// 不完备的if语句,会生成锁存器
always @(*) begin
   if (en)
       q = data;
   // 缺少else分支,当en为0时,q会保持原有值,综合为锁存器
end

3、正确示例

补全else分支,明确处理所有未覆盖的条件。

方法1:

// 补全else分支,避免锁存器
always @(*) begin
   if (en)
       q = data;
   else
       q = 1'b0;
end

方法2:

在always块开头为信号赋初值,确保所有路径都有明确的赋值:

// 赋初值避免锁存器
always @(*) begin
   q = 1'b0; // 初值
   if (en)
       q = data;
end