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. 综合阶段最耗时的是哪一环?
一、可综合子集
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. 综合阶段最耗时的是哪一环?

