综合(Synthesis)入门:HDL 怎么写,综合工具才不给你脸色看

ARM_小周 发表于 2026-10-13 06:04 · 22 次浏览 · 2 条回复
A
综合工具的行为是可以预测的,前提是 RTL 写法规范。下面总结 ASIC/FPGA 综合中最常用的编码原则。

一、可综合子集
1. 不可综合:#延迟、initial(FPGA 部分工具支持初始化,ASIC 不支持)、real 类型、fork/join、$display 等系统任务;
2. for 循环可综合,但必须是静态展开的固定次数;
3. 除法与取模运算会生成大面积组合逻辑,尽量用移位或专用 IP。

二、编码规范
1. 时序逻辑用 always @(posedge clk) 配非阻塞赋值(<=),组合逻辑用 always @(*) 配阻塞赋值(=),不要混用;
2. 组合逻辑中 if/case 必须写全分支或给默认值,否则会推断出锁存器;
3. 状态机采用三段式:状态寄存器、次态逻辑、输出逻辑,输出可再寄存一拍改善时序;
4. 复位风格在项目内统一,ASIC 常用异步复位同步释放;
5. 避免在 RTL 中自行生成门控时钟,使用工具的时钟门控插入或标准单元。

三、约束与流程
1. SDC 需包含时钟、IO 延迟、时钟不确定性、过渡时间等约束;
2. 综合后检查报告:锁存器、未约束路径、多驱动、未连接端口;
3. 运行等价性检查确认网表与 RTL 一致。

四、常见坑
1. 仿真通过但综合结果不同,常因敏感列表不全或阻塞赋值使用不当;
2. 顶层堆积过多胶合逻辑,影响分区与时序收敛;
3. 工艺库与工作条件设置错误,时序报告失真。

讨论:
1. 你们团队在用哪些 Lint 规则来保证 RTL 可综合?
2. 综合阶段最耗时的是哪一环?
广告位 A8广告位招商帖子页首楼下方通栏 · 728×90 · 查看报价 · 联系 ads@oeforum.com
光
综合不认的东西里,还有 fork/join 和时间相关函数($time、$random 的某些用法)。我们习惯是在仿真代码里用宏隔离,保证综合时不被扫进去。
射
三段式状态机确实干净,但要注意输出寄存那一段如果组合逻辑太长,还是会成为关键路径。我的做法是输出再打一拍,代价是一个周期延迟。
登录 后参与回复,还没有账号?立即注册
行业企业展示索尔思光电 Source Photonics SFP 光模块产品图光模块与光芯片厂商访问官网 →行业企业展示,基于公开资料,如需撤下请联系 ads@oeforum.com