
芯片设计在逻辑设计阶段(通常指从RTL编写到逻辑综合生成门级网表的过程)可以采取的面积优化手段。
这个阶段的优化主要作用于代码风格、微架构以及逻辑结构层面。与后端物理实现相比,逻辑设计阶段的优化往往能带来数量级的面积节省,因为它是从功能实现的根本方式上入手。
以下是逻辑设计阶段主流的面积优化手段详解:
1. RTL代码风格优化
这是成本最低、见效最快的优化手段。不同的代码描述方式,综合出的电路结构可能天差地别。
资源共享
– 原理:避免在代码中实例化多个功能相同的运算单元(如加法器、乘法器)。通过多路选择器(MUX)让多个操作数分时共享同一个运算单元。 – 举例:如果两个不同的算术运算在逻辑上永远不会同时发生,可以使用一个ALU(算术逻辑单元)加控制逻辑来代替两个独立的ALU。 – 效果:显著减少算术单元的实例数量,尤其对乘法器、除法器等面积大户效果明显。
状态机优化
– 独热码 vs. 二进制编码:在FPGA设计中,由于寄存器资源丰富,独热码(One-Hot)可以减少译码逻辑,但对面积不一定友好。在ASIC中,对于状态数较多的状态机,采用二进制编码或格雷码能显著减少触发器的使用数量。 – 状态化简:去除状态图中的冗余或等价状态,直接减少状态寄存器的位数。
避免不必要的锁存器
– 原理:在组合逻辑进程中,如果条件分支覆盖不完整,综合工具会推断出锁存器(Latch)。锁存器虽然本身面积可能略小于触发器,但它们会引入复杂的时序问题和额外的毛刺过滤逻辑,通常应尽量避免。 – 操作:确保所有的 `if` 和 `case` 语句都有完整的 `else` 分支或默认赋值。
逻辑结构优化
– 原理:利用卡诺图或真值表简化逻辑等式,减少信号的重复调用。
2. 微架构选择与优化
在确定了算法之后,如何用硬件电路来实现该算法(即微架构)对面积有决定性影响。
串行化架构
– 原理:这是面积与吞吐率的经典权衡。将原本并行执行的多个处理单元,改为单个处理单元分时复用。 – 举例:在图像处理中,如果需要计算 8×8 像素块的和,可以做一个加法器连续累加64次,而不是做64个加法器并联。 – 效果:面积可能缩小数倍甚至数十倍,代价是处理延迟增加、吞吐率下降。
资源共享
– 针对存储器:对于大的SRAM,考虑是否能拆分成多个小的Bank,只在需要时激活特定的Bank,虽然总存储位宽可能增加,但可以避免使用一个极大的高密度单块RAM(有时大RAM的面积效率低于小RAM的组合)。FPGA上有BRAM资源,可以调用RAM资源来替代寄存器搭建的memory。 – 针对数据路径:如果多个模块需要访问不同的数据子集,通过合理的地址解码和数据分发,可以共用同一组数据总线。
3. 数据位宽的精准裁剪
这是逻辑设计中最容易被忽视但又极其有效的手段。
– 原理:很多设计初期为了安全起见,会预留很大的位宽(如32位)。但在实际数据流分析中,某些中间变量的有效位宽可能远小于32位。 – 操作:通过静态代码分析或仿真,确定变量永远不会用到的最高有效位(MSB),将其移除,并相应地优化所有与之相连的运算单元。 – 效果:位宽的缩减会直接减少寄存器数量和运算单元(加法器、乘法器)的晶体管数量。例如,将一个16位乘法器改为8位,面积可以减少约75%(因为乘法器面积与位宽的平方成正比)。
4. 逻辑综合阶段的约束与优化
这一步是将RTL代码交给EDA工具进行逻辑推导和门级映射,工具的配置策略至关重要。
设置合理的面积约束
– 原理:在综合脚本中,除了时序约束,必须设置 `set_max_area 0` 或类似的强面积约束。这指示工具在满足时序要求的前提下,尽可能地优化面积。 – 操作:通常设为0,意味着“越小越好”,让工具尽力压缩。
逻辑结构优化指令
– 结构级优化:允许工具改变RTL中隐含的加法器树或乘法器树的拓扑结构。例如,将多个加法器组成的链式结构重新平衡为树形结构,以减少关键路径上的逻辑级数,有时也能通过逻辑共享减少总面积。 – 布尔优化:启用工具的“布尔优化”选项。工具会分析真值表,进行逻辑恒等式化简。例如,将 `(A & B) \\| (A & !B)` 自动优化为 `A`。
消除不必要的层次结构
– 原理:设计中如果模块划分过细(Flatten不够),可能会阻碍工具跨模块边界进行优化。 – 操作:在综合时,对顶层的子模块执行 `ungroup` 或 `flatten` 操作,让工具能看到跨越原始模块边界的逻辑,从而有机会合并冗余逻辑。
技术映射优化
– 选择最佳单元:工具在将布尔函数映射到具体工艺库单元时,会从库中选择驱动强度最小、面积最小的单元,只要它能满足扇出和时序要求。 – 多阈值电压利用:虽然主要用于漏电功耗优化,但通常低阈值(Low Vt)单元速度快但漏电大,高阈值(High Vt)单元速度慢但漏电小且面积有时略有不同。综合工具可以在非关键路径上自动使用面积更优的高阈值单元。
这些手段通常需要结合使用:先通过良好的代码风格和微架构设计(如串行化)奠定面积优化的基础,然后通过精细的综合约束和位宽裁剪来榨干最后一寸面积。



