HDL Compiler:hdlin_preserve_sequential变量和preserve_sequential综合指令的使用

发布时间:2026/9/25 1:42:39

HDL Compiler:hdlin_preserve_sequential变量和preserve_sequential综合指令的使用 相关阅读HDL Compilerhttps://blog.csdn.net/weixin_45791458/category_12893238.html?spm1001.2014.3001.5482综合指令(Synthesis Directives)是一些特殊注释用于影响综合工具如何处理RTL代码这些注释会被综合工具识别但会被其他工具如仿真器忽略。关于综合指令相关概念的更多介绍可以参考下面的博客。HDL Compiler综合指令https://chenzhang.blog.csdn.net/article/details/148695750首先回顾一下不可读的概念不可读是一种状态单元触发器、组合逻辑门都可能位于这种状态简单来说不可读就是单元直接或间接没有驱动任何输出端口。当RTL代码中包含不可读或无驱动触发器/组合逻辑门时HDL Compiler会把它们删除因此并不会有不可读或无驱动触发器的推断报告例1展示了不可读触发器的删除。// 例1 module unread(input a, b, c, clk, output z); reg a_r1, a_r2; wire d; assign z a_r1; assign d a_r2 c; always(posedge clk) begin a_r1 a; a_r2 a b; end endmodule下面为HDL Compiler读取例1时产生的触发器推断报告可以看出其中并未识别出不可读触发器a_r2_reg。 | Register Name | Type | Width | Bus | MB | Set | Reset | ST | Line | | a_r1_reg | Flip-flop | 1 | N | N | None | None | N | 6 | 图1为此时的GTECH网表可以看出一个触发器和两个与门都因为被认定为是直接/间接不可读状态而删除只有触发器a_r1_reg以通用时序单元SEQGEN的形式存在。图1 例1的GETCH网表可以通过设置hdlin_preserve_sequential变量默认值为none控制是否保留不可读或无驱动触发器如果将该变量设置为all或者true触发器推断报告如下所示。 | Register Name | Type | Width | Bus | MB | Set | Reset | ST | Line | | a_r1_reg | Flip-flop | 1 | N | N | None | None | N | 6 | | a_r2_reg | Flip-flop | 1 | N | N | None | None | N | 6 | 图2为此时的GTECH网表可以看出只有不可读触发器a_r2_reg后面的与门都因为被认定为是直接不可读状态而删除不可读触发器a_r2_reg和其前面的与门间接都得到了保留。图2 例1的GETCH网表例1展示了不可读触发器的保留如果无驱动触发器使用该方法保留下来了会将无驱动引脚连接到常量0。hdlin_preserve_sequential变量当该变量被设置为all或者true时保留所有不可读时序单元不包括仅作为循环变量使用的不可读时序单元当该变量被设置为allloop_variables或者trueloop_variables时保留所有不可读时序单元包括仅作为循环变量使用的不可读时序单元当该变量被设置为ff时仅保留所有不可读触发器不包括仅作为循环变量使用的不可读触发器当该变量被设置为ffloop_variables时仅保留所有不可读触发器包括仅作为循环变量使用的不可读触发器当该变量被设置为latch时仅保留所有不可读锁存器不包括仅作为循环变量使用的不可读锁存器当该变量被设置为latchloop_variables时仅保留所有不可读触发器包括仅作为循环变量使用的不可读锁存器例2展示了仅作为循环变量使用的不可读触发器其中i信号作为integer类型的变量作为for循环内的索引变量默认不会被推断为触发器。// 例2 module test (input clk, rst, error); parameter N 4; reg [N-1:0] fail; integer i, j; always (posedge clk or posedge rst) if (rst) fail {N-1{1b0}}; else for ( i 0; i N; i i 1 ) fail[i] fail[i] | error; endmodule当hdlin_preserve_sequential变量被设置为none时所有不可读触发器fail_reg[i]都被删除了当hdlin_preserve_sequential变量被设置为all时触发器推断报告如下所示GETCH网表如图3所示 | Register Name | Type | Width | Bus | MB | Set | Reset | ST | Line | | fail_reg | Flip-flop | 4 | Y | N | None | Async | N | 7 | 图3 例2的GETCH网表当hdlin_preserve_sequential变量被设置为allloop_variables时触发器推断报告如下所示GETCH网表如图4所示。 | Register Name | Type | Width | Bus | MB | Set | Reset | ST | Line | | fail_reg | Flip-flop | 4 | Y | N | None | Async | N | 7 | | i_reg | Flip-flop | 32 | Y | N | None | None | N | 7 | 图4 例2的GETCH网表preserve_sequential综合指令hdlin_preserve_sequential变量只能进行粗粒度的控制如果想要更细粒度的控制可以使用preserve_sequential综合指令。需要强调preserve_sequential综合指令只能用于保留有可能被推断出的时序单元对于组合逻辑的保留是间接的。例3展示了该综合指令的使用方法。// 例3 module mydesign (input in1, in2, in3, input clk, output out); reg sum1; reg sum2 /* synopsys preserve_sequential */; wire save; always (posedge clk) begin sum1 in1 | in2; sum2 in1 in2 in3; // 该组合逻辑会被保留间接 end assign out ~sum1; assign save sum1 sum2; // 该组合逻辑不会被保留因为它位于被保留触发器sum2_reg后面 endmodule此时的触发器推断报告如下所示GETCH网表如图5所示。 | Register Name | Type | Width | Bus | MB | Set | Reset | ST | Line | | sum1_reg | Flip-flop | 1 | N | N | None | None | N | 6 | | sum2_reg | Flip-flop | 1 | N | N | None | None | N | 6 | 图5 例3的GETCH网表例4展示了该综合指令的使用方法。// 例4 module mydesign (input in1, in2, in3, input clk, output out); reg sum1; reg sum2, save /* synopsys preserve_sequential */; always (posedge clk) begin sum1 in1 | in2; sum2 in1 in2 in3; // 该组合逻辑会被保留间接 end assign out ~sum1; always (posedge clk) begin save sum1 sum2; // 该组合逻辑也会被保留间接因为save信号被定义为reg类型且添加了综合指令 end endmodule此时的触发器推断报告如下所示GETCH网表如图6所示。 | Register Name | Type | Width | Bus | MB | Set | Reset | ST | Line | | sum1_reg | Flip-flop | 1 | N | N | None | None | N | 6 | | sum2_reg | Flip-flop | 1 | N | N | None | None | N | 6 | | save_reg | Flip-flop | 1 | N | N | None | None | N | 13 | 图6 例4的GETCH网表Design Compiler NXT在2022版本推出了report_transformed_registers命令该命令可以报告工具在优化过程中对寄存器包括触发器和锁存器进行的所有变换详细内容可以参考下面的博客。SDC命令详解使用report_transformed_registers命令进行报告https://blog.csdn.net/weixin_45791458/article/details/158101563?sharetypeblogdetailsharerId158101563sharereferPCsharesourceweixin_45791458spm1011.2480.3001.8118不管是使用hdlin_preserve_sequential变量还是preserve_sequential综合指令它只能影响HDL Compiler在读取RTL代码时的行为对于Design Compiler在综合时对于不可读触发器的优化可以参考下面的博客。Design Compiler不可读单元的移除https://blog.csdn.net/weixin_45791458/article/details/157099538?ops_request_misc%257B%2522request%255Fid%2522%253A%252227bdd50e3fb6d8469484e6eb17894502%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_id27bdd50e3fb6d8469484e6eb17894502biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-157099538-null-null.nonecaseutm_termDesign%20Compiler%EF%BC%9A%E4%B8%8D%E5%8F%AF%E8%AF%BBspm1018.2226.3001.4450
延伸阅读

更多相关文章

2026/9/25 1:37:38

电涡流传感器位移测量中的材料影响机制与工程补偿

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

2026/9/25 1:37:38

32位Oracle 11gR2客户端部署与排障全攻略

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

2026/9/25 1:37:38

STM32通过DMA与IDLE中断高效解析SBUS遥控信号

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

2026/9/25 2:47:41

Codex 401 unauthorized 报错排查指南:认证链路拆解与一步修复

1. 先搞清楚 401 到底卡在哪一环Codex 报401 unauthorized这件事,我前前后后帮人排查过不下几十次,说实话它本身一点都不复杂,复杂的是大家一看到 401 就慌,然后开始乱改配置,把本来能跑的环境改得更乱。401 的本质只有…

2026/9/25 2:47:41

以中国为中心的世界地图制作:中央经线原理与Cartopy/QGIS实战

简介:这是一份以中国为中心的世界地图可视化Demo,基于ECharts实现,配套国家中文名与英文名两套JSON数据,适合前端开发者、地理数据可视化初学者,以及需要在课件、活动页面或数据看板中突出中国视角的展示场景。压缩包共…

2026/9/25 2:47:41

MiniMax H3全参考模式提示词改写指南:六段结构与保留分析实战

1. 全参考模式到底在解决什么问题第一次接触 MiniMax H3 的全参考模式(Ref2VA)时,我下意识把它当成了普通的图生视频来用,结果折腾了大半天,出来的片子跟参考图完全是两回事。后来才搞明白,Ref2VA 的核心逻…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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