当前位置: 首页 > news >正文

fpga系列 HDL:verilog latch在fpga中的作用 避免latch的常见做法

目录

    • Latch在FPGA中的作用
    • Quartus中有关latch的警告⚠
    • 避免Latch的常见做法
      • 1. if-else 语句未覆盖所有条件
        • 生成Latch的代码:
        • 修复后的代码:
      • 2. case语句未覆盖所有分支
        • 生成Latch的代码:
        • 修复后的代码:
      • 3. 组合逻辑中缺少默认赋值
        • 生成Latch的代码:
        • 修复后的代码:
      • 4. 多路选择器中未处理所有输入
        • 生成Latch的代码:
        • 修复后的代码:
      • 5. 部分条件未赋值
        • 生成Latch的代码:
        • 修复后的代码:
      • 6. 反馈路径中的Latch
        • 生成Latch的代码:
        • 修复后的代码:
  • CG

Latch在FPGA中的作用

  • Latch是一种电平敏感的存储元件,与边沿触发的触发器(Flip-Flop)不同,它会在使能信号有效期间保持其状态。
  • 一般地,Latch可以用于临时存储数据或作为组合逻辑的一部分来保存某些中间结果。
  • 但在现代FPGA设计中,Latch通常不是首选。FPGA 中应避免使用电平敏感的透明锁存器,而应仅使用边沿敏感的触发器。锁存器使布局和布线工具无法灵活地满足时序要求。
  • 如果设计中某些 latch 在不该传递时还在传递信号,会让电路行为不可预测,调试也更困难。级联触发器的效果是可预测的,与深度无关。相比之下,锁存器输出的时序则更加“模拟”。信号进入锁存器的延迟会导致信号输出的延迟。即使锁存器自身的约束得到满足,这种延迟也可能导致下游问题。

Quartus中有关latch的警告⚠

  • 如果代码中生成了Latch,会收到类似如下的警告:Warning (10240): Verilog HDL Always Construct warning at test.v(8): inferring latch(es) for variable “q”, which holds its previous value in one or more paths through the always construct

在这里插入图片描述

避免Latch的常见做法

  • 当在组合逻辑(如if-elsecase语句)中没有处理所有可能的输入条件时,如果某个信号在某些条件下没有被明确赋值,则综合工具可能会推断出Latch以维持该信号的前一状态。在一些复杂的组合逻辑中,存在从输出到输入的直接反馈路径也可能导致Latch的生成。

1. if-else 语句未覆盖所有条件

生成Latch的代码:
module test (input wire sel,input wire in1,output reg out
);always @(*) beginif (sel == 1'b1) beginout = in1;end// 没有 else 分支end
endmodule

在这里插入图片描述
在这里插入图片描述

修复后的代码:
module test (input wire sel,input wire in1,input wire in2, // 添加额外输入output reg out
);always @(*) beginout = in2; // 默认值if (sel == 1'b1) beginout = in1;endend
endmodule

在这里插入图片描述

2. case语句未覆盖所有分支

生成Latch的代码:
module test (input wire [1:0] state,input wire in1,input wire in2,output reg out
);always @(*) begincase (state)2'b00: out = in1;2'b01: out = in2;// 没有 default 分支endcaseend
endmodule

在这里插入图片描述

修复后的代码:
module test (input wire [1:0] state,input wire in1,input wire in2,output reg out
);always @(*) begincase (state)2'b00: out = in1;2'b01: out = in2;default: out = 1'b0; // 添加默认值endcaseend
endmodule

在这里插入图片描述

3. 组合逻辑中缺少默认赋值

生成Latch的代码:
module test (input wire enable,input wire data_in,output reg out
);always @(*) beginif (enable) beginout = data_in;end// 没有 else 分支end
endmodule

在这里插入图片描述

修复后的代码:
module test (input wire enable,input wire data_in,output reg out
);always @(*) beginout = 1'b0; // 默认值if (enable) beginout = data_in;endend
endmodule

在这里插入图片描述

4. 多路选择器中未处理所有输入

生成Latch的代码:
module test (input wire [1:0] sel,input wire in1,input wire in2,input wire in3,output reg out
);always @(*) begincase (sel)2'b00: out = in1;2'b01: out = in2;2'b10: out = in3;// 没有处理 2'b11endcaseend
endmodule

在这里插入图片描述

修复后的代码:
module test (input wire [1:0] sel,input wire in1,input wire in2,input wire in3,output reg out
);always @(*) begincase (sel)2'b00: out = in1;2'b01: out = in2;2'b10: out = in3;default: out = 1'b0; // 添加默认值endcaseend
endmodule

在这里插入图片描述

5. 部分条件未赋值

生成Latch的代码:
module test (input wire condition1,input wire condition2,input wire in1,input wire in2,output reg out
);always @(*) beginif (condition1) beginout = in1;end else if (condition2) beginout = in2;end// 没有 else 分支end
endmodule

在这里插入图片描述

修复后的代码:
module test (input wire condition1,input wire condition2,input wire in1,input wire in2,output reg out
);always @(*) beginout = 1'b0; // 默认值if (condition1) beginout = in1;end else if (condition2) beginout = in2;endend
endmodule

在这里插入图片描述

6. 反馈路径中的Latch

生成Latch的代码:
module test (input wire reset,input wire enable,input wire d,output reg q
);always @(*) beginif (reset) beginq = 1'b0;end else if (enable) beginq = d;end// 没有 else 分支end
endmodule

在这里插入图片描述

修复后的代码:
module test (input wire reset,input wire enable,input wire d,output reg q
);always @(*) beginq = 1'b0; // 默认值if (reset) beginq = 1'b0;end else if (enable) beginq = d;endend
endmodule

在这里插入图片描述

CG

  • 1.5.3.1. 避免意外锁存生成

相关文章:

  • 可以在电脑上使用的备忘录记事工具评测
  • 第2讲:R语言中的色彩美学——科研图表配色指南
  • 爬虫练习 js 逆向
  • c++进阶——类与继承
  • 牛客小白月赛115-B题:签到题
  • Hot100方法及易错点总结2
  • 1.2-1.3考研408计算机组成原理第一章 计算机系统概述
  • Java 安全:如何防止 DDoS 攻击?
  • 广安理工学院(暂定名)华清远见校企合作签约揭牌,共建实习实训基地
  • 软考中级-软件设计师 知识点速过1(手写笔记)
  • Android FFmpeg 交叉编译全指南:NDK编译 + CMake 集成
  • 告别默认配置!Xray自定义POC开发指南
  • 《R语言SCI期刊论文绘图专题计划》大纲
  • 【Web应用服务器_Tomcat】一、Tomcat基础与核心功能详解
  • Hadoop生态圈框架部署 - Windows上部署Hadoop
  • 紫光国微:特种集成电路领域将导入AI技术
  • 【Test】单例模式❗
  • Java实现HTML转PDF(deepSeekAi->html->pdf)
  • 【机器学习速记】面试重点/期末考试
  • Flink 系列之七 - Data Stream API的源算子原理
  • 仅退款正式成历史?仅退款究竟该不该有?
  • 剪纸纹样“流动”在水乡,谁不忆江南
  • 官方披露:临汾昔日“明星官员”宿青平已于去年落马
  • 迎接神十九乘组回家,东风着陆场各项工作已准备就绪
  • 凯撒旅业:2024年营业收入约6.53亿元,同比增长12.25%
  • 宁夏中卫深化公立医院机构编制改革:市人民医院机构规格升为正处级