1. 从RTL编码到综合优化:一个工程师的实战视角
做数字芯片设计,尤其是到了深亚微米工艺节点,我们常常会陷入一种“左右为难”的境地。前端工程师写完RTL代码,心里想的是功能正确、逻辑清晰;后端工程师拿到网表,满脑子都是时序收敛、面积和功耗。而到了芯片要流片量产的时候,测试工程师又会拿着DFT覆盖率报告来找你,问为什么某些故障测不出来。我自己在项目里就遇到过好几次,时序刚刚压下去,DFT扫描链一插进去,关键路径又崩了,或者面积超标了,不得不返工。这让我深刻意识到,芯片设计不是一场接力赛,而是一场需要多方协同的团体赛。数字逻辑综合,特别是从RTL编码风格开始,到综合优化策略,再到提前考虑DFT(可测性设计),这整个流程必须作为一个整体来规划和优化。
很多刚入行的朋友可能会觉得,RTL编码就是实现功能,综合是DC(Design Compiler)工具的事情,DFT是另一个团队的工作。这种割裂的认知正是项目后期痛苦的根源。实际上,你写下的每一行代码,每一个模块划分,甚至每一个运算符的括号,都在无形中决定了后续综合工具能发挥的空间,以及最终芯片的可测试性。我见过一些代码,功能仿真完全正确,但一上综合,时序惨不忍睹,或者面积大得离谱,根本原因就是编码时没有为后续流程“铺好路”。
这篇文章,我想从一个资深设计工程师的角度,分享一套连贯的实践思路。我们不空谈理论,就聊在面临时序收敛和测试覆盖率双重压力时,具体该怎么想、怎么做。我们会深入探讨如何通过优化RTL编码习惯,为综合工具创造更好的优化条件;如何合理运用DC的compile_ultra等高级命令和策略(比如set_optimize_registers);以及如何在前端设计阶段就前瞻性地为扫描链插入做好准备。目标只有一个:在性能(时序)、面积(成本)和可测试性(质量)这个“不可能三角”中,找到那个最优的平衡点。这不仅仅是工具的使用技巧,更是一种贯穿设计始终的协同优化思维。
2. RTL编码风格:为综合与DFT奠定基石
好的RTL代码是成功综合的一半。这里说的“好”,不仅仅是功能正确和可读性高,更重要的是它是否“综合友好”和“DFT友好”。很多时序问题,其实在代码层面就可以避免或缓解。
2.1 资源共享:是面积的朋友,也可能是时序的敌人
资源共享是减少面积最直接的手段之一。比如,一个模块里有两个条件需要用到同一个复杂的运算结果,很自然的想法是先算出结果,再用多路选择器(Mux)分配给不同路径。这在代码里通常体现为在always块外先计算一个中间信号,然后在case或if语句里使用它。
// 一种常见的资源共享写法
always @(*) begin
complex_calc = a * b + c - d; // 假设这是一个复杂的组合逻辑
case (sel)
2'b00: out = complex_calc + e;
2'b01: out = complex_calc - f;
default: out = complex_calc;
endcase
end
这种写法确实节省了一个a*b+c-d的计算单元,只实例化了一个。但是,它引入了一个潜在问题:从sel到out的路径上,现在多了一个Mux的延迟。如果complex_calc本身计算路径就很长,那么
404



被折叠的 条评论
为什么被折叠?



