数字IC前端学习笔记:锁存器Latch的综合

发布时间:2026/10/27 1:12:34

数字IC前端学习笔记:锁存器Latch的综合 相关文章数字IC前端专栏https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482锁存器的生成方式有两种一种是有意的而另一种是无意的。无意生成的锁存器会浪费硅片面积因为在大部分FPGA资源中没有现成的锁存器需要使用更多的资源来实现锁存器且锁存器的存在会使静态时序分析(STA)变得更加复杂。因此懂得什么样的设计会被综合工具综合出锁存器是很重要的。可以用带反馈的门级原语或连续赋值语句锁存器我们可以看以下两种尝试构造锁存器的行为。// 下面用两种方式描述了一对交叉耦合的与非门构成的SR锁存器 // 但是很遗憾有些综合器不支持这种构造锁存器的行为 // 方式一 assign q ~(set qbar); assign qbar ~(rst q); // 方式二 nand(q, set, qbar); nand(qbar, rst, q);一个带反馈和条件操作符?:的连续赋值语句注意这里是一个和上面的反馈不一样带反馈即赋值的变量RHS又出现在条件操作符表达式中会被综合出一个带反馈的多路选择器构成的锁存器一般情况下这个多路选择器直接使用组合逻辑生成不会调用Mux库单元。这是一种有意生成锁存器的方法如在构建存储器时。SRAM存储器单元可由以下带反馈的连续赋值语句建模assign data_out ( CS_B 0 ) ? ( WE_b 0 ) ?data_in:data_out:1bz;CS_b和WE_b分别是片选和写使能信号均为低电平有效。如果CS_b有效且WE_b有效那么data_out透明输出data_in的值但当WE_b切换到1时data_outdata_out。根据这一反馈综合工具会生成带反馈的多路选择器构成的锁存器因为当WE_b1时data_out不受输入影响而是会保持之前的值。当CS_b1时电路将处在高阻状态。一、锁存器的无意综合例1模块or4_behave描述了一个4输入或门虽然看起来有点奇怪。always块中首先将输出初始化为0然后循环测试输入。若有一输入为1则设置输出为1并跳出循环。该描述被综合成组合逻辑应该注意的是尽管输出变量被声明为寄存器变量但是并没有被综合成寄存器所有过程赋值的变量都应该是寄存器变量。module or4_behav (y, x_in); parameter word_length 4; output y; input [word_length - 1: 0] x_in; reg y; integer k; always (x_in) begin: check_for_1 y 0; for (k 0; k word_length -1; k k1) if (x_in[k] 1) begin y 1; disable check_for_1; end end endmodule现在再来分析一下下面这个模块or4_behav_latch的描述它的事件控制对x_in[0]不敏感这就会无意间综合出锁存输出即电路仅在x_in[3:0]变化时才会激活周期性行为并更新输出当x_in变化时输出处于锁存状态。module or4_behav_latch (y, x_in); parameter word_length 4; output y; input [word_length - 1: 0] x_in; reg y; integer k; always (x_in[3:1]) begin: check_for_1 y 0; for (k 0; k word_length -1; k k1) if (x_in[k] 1) begin y 1; disable check_for_1; end end endmodule事实也确实如此下图a是or4_behave的综合结果而图b是or4_behav_latch的综合结果我们可以明显看到图b中带有一个锁存器。如果描述中没有隐含对存储器结构的需求电平敏感周期性行为会被综合为组合逻辑。否则设计中则会出现锁存器。为了避免出现锁存器组合逻辑的所有输入信号都必须包含在事件控制表达式中。例如在赋值表达式的右逻辑发生变化的所有情况下都必须给赋值表达式左值赋值所以等号右边的所有信号都要出现在事件控制表达式中。或者像例1一样的if控制表达式中的控制信号也必须出现在事件控制表达式中。实际上由于不完整的敏感列表带来的风险如此巨大HDL语言新加了一个*通配符来形成一个完整的敏感列表。*自动将RHS、函数和任务调用、case语句的expression和item项、if语句的expression项、LHS的索引加入敏感列表这里不包括wait语句中、内嵌事件控制表达式中、和LHS这三个地方的信号。当在电平敏感周期性行为中赋值表达式右端的信号又出现在左端则行为隐含了锁存器而不是无反馈的组合逻辑了。当在连续赋值语句中赋值表达式右端的信号通过条件运算符?:出现在了左端如前言那样则行为隐含了锁存器而不是无反馈的组合逻辑了。当一个case语句或if语句没有对所有可能的输入指定输出值时即未定义完整的case和if语句可能会出现非预期的锁存器。因为这表示在特定输入下输出保持原值不管是在进入case前初始化输出还是使用default语句针对case语句指定默认输出都必须保证case和if是完整的。例2当case语句不能完全译码时综合工具即将导出锁存器用以在有输入信号行为未定义的情况下保持输出值。在这个例子中当{sel_a, sel_b}2b00和2b11时锁存器使能保持输出不变。图a给出了一个使用通用单元综合的实现图b给出了使用实际库单元的实现。后者用到了库中的双通道MUX和一个泄放电荷的上/下拉器件在这个例子中该器件上拉连接到锁存器复位输入端。module mux_latch (y_out, sel_a, sel_b, data_a, data_b); output y_out; input sel_a, sel_b, data_a, data_b; reg y_out; always ( sel_a or sel_b or data_a or data_b) //y_out1b0; 加上能消除锁存器 case ({sel_a, sel_b}) 2b10: y_out data_a; 2b01: y_out data_b; //default:y_out1b0;加上也能消除锁存器 endcase endmodule例3还有一种情况会产生锁存器也是很容易被忽略的情况就是在一种情况下always块内的赋值不完整即赋值没有覆盖所有组合逻辑变量这时你就隐含地告诉了综合器在某些特定信号下需要保持输出不变从而综合成一个锁存器如下所示。module mux_latch (y_out, sel_a, sel_b, data_a, data_b); output y_out; input sel_a, sel_b, data_a, data_b; reg y_out,z_out; always ( sel_a or sel_b or data_a or data_b) case ({sel_a, sel_b}) 2b10: y_out data_a; 2b01: z_out data_b; default:y_out1b0,z_out1b0; endcase endmodule这个代码中有两个组合逻辑输出但在{sel_a, sel_b}2b10时没有对z_out的赋值在{sel_a, sel_b}2b01时没有对y_out的赋值。赋值没有覆盖所有组合逻辑变量因此会综合出锁存器。这种情况下消除寄存器的方法只能通过补齐case语句所有情况下的赋值或者直接在进入always语句后对所有组合逻辑变量赋初值。实际上以上说的综合出latch的情形也不是绝对的为什么这么说在以上的例子中我们对输入信号是没有限制的比如说在例2中sel的取值是2b00、2b01、2b10、2b11中的任意一个所以如果case语句不能完全译码就会出现某些信号变化时不改变y_out从而综合出锁存器如果前面的逻辑限制sel只能是2b01、2b10中的一个时即使不能完全译码也不会综合出锁存器。综合工具能自行根据上下文判断是否一定要使用锁存器综合出锁存器的本质原因是出现了某些情况下需要保持信号值不变的要求。二、锁存器的有意综合如上节所述如果行为流在任何情况下都能给指定寄存器赋值即不存在不完整的case语句和if语句那么仅当显式地将某个变量赋值给自己时才会出现反馈生成锁存器。而赋值给自己的行为分为两种一种是直接过程赋值一种是使用?:条件运算符反馈赋值。直接过程赋值分为两种一、在电平敏感周期性行为中会生成带反馈的多路选择器构成的锁存器。二、在边沿敏感周期性行为中不会生成锁存器而会是一个带有反馈的寄存器。使用?:条件运算符反馈赋值分为三种一、在连续赋值语句中会生成带反馈的多路选择器构成的锁存器。二、在过程赋值中会直接生成硬件锁存器就像敏感列表和case或if不完整那样。三、在边沿敏感周期性行为中不会生成锁存器而会是一个带有反馈的寄存器。总结就是如果if和case、敏感列表完整但有反馈赋值的情况下。在电平敏感周期性行为赋值中使用?:反馈赋值会直接生成硬件锁存器在边沿敏感周期性行为中不会生成锁存器在其他情况下生成的是带反馈的多路选择器构成的锁存器。例3下面的latch_if1模块是一个带有完整敏感列表、if语句也完整的周期性行为的描述if语句中具有直接过程赋值的data_out反馈赋值。如上所述综合结果是一个带反馈的多路选择器构成的锁存器。不过我在Synopsys DC 2018上的实验表示只要在电平敏感周期性行为有给自己的显式赋值都会生成硬件锁存器可能是作者的综合工具不同导致的module latch_if1(data_out, data_in, latch_enable); output [3: 0] data_out; input [3: 0] data_in; input latch_enable; reg [3: 0] data_out; always (latch_enable or data_in) if (latch_enable) data_out data_in; else data_out data_out; //assign data_outlatch_enable?data_in:data_out; 使用这种形式综合结果是一样的 //always (latch_enable or data_in) 但这种形式会生成硬件锁存器 //data_out latch_enable?data_in:data_out; 但这种形式会生成硬件锁存器 endmodule例4下面的latch_if1模块是一个带有完整敏感列表但if语句不完整的周期性行为的描述if语句缺少else分支。如上所述综合结果就是硬件锁存器。module latch_if2 (data_out, data_in, latch_enable); output [3: 0] data_out; input [3: 0] data_in; input latch_enable; reg [3: 0] data_out; always (latch_enable or data_in) if (latch_enable) data_out data_in; endmodule三、更多示例关于锁存器综合的更多示例可以阅读下面的博客。数字IC前端学习笔记锁存器Latch的综合https://blog.csdn.net/weixin_45791458/article/details/147801585?ops_request_miscelastic_search_miscrequest_id9e811f830df10ecfb3a07d258a4c24ecbiz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~all~ElasticSearch~search_v2-1-147801585-null-null.541^v3^pc_search_result_blog8utm_term%E9%94%81%E5%AD%98%E5%99%A8spm1018.2226.3001.4450以上内容来源于《Verilog HDL高级数字设计》和《Verilog编程艺术》
延伸阅读

更多相关文章

2026/10/27 1:12:34

Linux:df、du容量查询命令

相关文章 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html 一、df 该指令能够列出文件系统的整体磁盘使用量。 用法:df [-ahikHTm] [dirname/filename] -a:列出所有的文件系统,包括系统特有的/proc等文件系统&#xff0…

2026/10/27 1:07:34

嵌入式驱动开发实战:从字符设备到设备树与并发控制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 1:07:34

香薰机语音控制芯片选型指南:离线方案与量产避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 2:17:38

ISOLATEGPT架构:LLM智能体的执行隔离与安全协同方案

1. 项目概述:ISOLATEGPT架构的核心价值在大型语言模型(LLM)驱动的智能体系统(Agentic Systems)中,执行隔离(Execution Isolation)正成为保障系统可靠性的关键技术瓶颈。ISOLATEGPT架…

2026/10/27 2:17:38

激光雷达SLAM技术:模块化学习与工程实践指南

1. SLAM技术概述与学习痛点激光雷达SLAM(Simultaneous Localization and Mapping)作为机器人自主导航的核心技术,已经广泛应用于自动驾驶、服务机器人等领域。但很多学习者在入门时会遇到一个典型困境:看了大量论文和教程后&#…

2026/10/27 2:17:38

GB/T 2260行政区划代码SQL表设计与省市区三级联动查询

简介:面向从事地理信息、人口统计、物流规划与数据库开发的人员,这份GB/T 2260全国行政区划代码数据集提供了一套标准化的四级区划编码参考,覆盖省/直辖市、市、县及乡镇街道等层级,可用于搭建行政区划表、做数据匹配与地域维度分…

2026/10/27 2:17:37

PMD规则集配置实战:从XML骨架到自定义规则与分层治理

简介:面向Java开发者与项目代码质量管理场景的PMD规则配置包,聚焦静态检查规则的定制与落地。包内共10个文件,以9个XML规则配置和1份TXT说明为主,XML承担规则集、规则、类别、参数及排除项等定义,TXT便于快速了解用法&…

2026/10/27 2:12:37

Hadoop伪分布式实验:Linux环境、HDFS与WordCount排错

简介:这份大数据实验一指导文档面向刚接触大数据课程的学生与自学者,围绕 Linux 虚拟机搭建、常用 Shell 命令和 Hadoop 伪分布式环境三条主线展开,帮助读者在单机上补齐后续实验所需的基础操作能力。压缩包仅含 1 个 docx 文件,约…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/27 0:59:21

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式19_“模式选错”的典型代价

“模式选错”的典型代价 摘要 在软件工程中,设计模式、架构模式、并发模式乃至团队协作模式的选择,往往在项目早期就决定了后续的开发效率和维护成本。本文通过多个真实场景,剖析“模式选错”带来的典型代价——包括返工成本、技术债务累积、…

2026/10/27 0:02:28

WorkBuddy_新建任务与工作模式20_新手推荐路径

新手推荐路径 摘要 在 AI 辅助开发工具快速普及的今天,新手面对最多的困惑往往不是"工具够不够强",而是"我该从哪一步开始用"。本文提出一条经过实践验证的三阶段学习路径:先从 Ask(问答式交互)起…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑