“ 本篇文章转自知乎专栏“恒芯闪耀”,由香山处理器后端物理实现专家陈子皓老师供稿。欢迎大家一起探讨优化香山系列物理设计!”
工艺节点
综合性能、成熟度、成本考虑,我们选择了 28nm 节点的工艺,金属层次选择的是 1P9M
关键指标
“雁栖湖”物理设计关键指标
Floorplan Guide
一般来说,前端设计是保障功能的实现与否,后端的物理设计则是尽可能的提高相关功能的实际性能,所以只有理解设计,以设计为指导,才能最大程度的提升后端物理设计的 PPA 指标(performance、power、area),如果一上来就进行盲目的跑流程脚本,往往会浪费时间适得其反。所以首先我们需要和设计人员进行充分的交流沟通来完成后端设计人员可以理解的数据流图,在画数据流图的时候应尽可能用网表级别的模块层级名称来描述数据流,以方便后端物理实现的时候能够将相关的模块和数据流一一对应起来。然后我们再根据数据流图,做一个初步的 floorplan 规划,能够更直观便捷的指导后续的真实 floorplan 设计。由于该处理器规模较大,设计较复杂,我们先将处理器分成几个大模块,先确定整体的 floorplan 形状大小,以及大模块之间的摆放位置,再来详细的规划各个大模块内部的 floorplan 以及 place 的摆放:
1、CPU 顶层
首先我们将 CPU 分成如下几个大模块:L1 Plus Cache、Frontend、CtrlBlock、IntegerBlock、FloatBlock、MemBlock。以这些大模块为基础可以画出如下数据流图:CPU 整体数据流大致框架
根据数据流图我们可以做一个初步的 floorplan 规划,首先从 L1 到 Frontend 再到 CtrlBlock 这三个模块需要串行的摆放,但是 CtrlBlock、MemBlock、IntegerBlock、FloatBlock 这四个模块之间的交互比较频繁,所以我们尽可能的将这四个模块整体呈正方形摆放,让彼此之间尽可能相邻。这样便有了如下的 floorplan 规划图:CPU整体 paper floorplan
根据如上的 floorplan 规划图,最终得出了一个较优的实际的整体 floorplan 结果,如下图:
有了整体的 floorplan 规划,接下来我们可以具体到各个模块内部进行更加详细的子模块的 floorplan 规划
2、Frontend
首先我们画出 Frontend 内部的数据流图如下:根据上图的数据流图我们可以做一个初步的 floorplan 规划。首先,由于指令缓存 Icache 会涉及到和 L1 的直接交互,我们需要把指令缓存 Icache 摆放到离一级缓存 L1 的附近;由于所有的预测器都会和取指单元有交互,所以需要把预测器围绕着取指单元摆放;由于指令缓存 iBuffer 会直接将指令传入 CtrlBlock,所以需要把该模块尽量摆在 CtrlBlock 附近。这样,无论是 Frontend 与其他模块之间的时序,还是 Frontend 内部的时序,都会得到有效的收敛。这样我们可以画出一个接近实际 floorplan 的规划图。后续的 floorplan 摆放将会参考此规划图来做。规划图如下:Frontend paper floorplan
Frontend 实际物理实现
3、CtrlBlock
首先我们画出 CtrlBlock 内部的数据流图如下:
CtrlBlock内部数据流
根据上图的数据流图我们可以做一个初步的 floorplan 规划。首先 ctrlBlock 里所有的 sram 均在 ftq 这个模块里,所以我们需要把 ftq 的 memory 都摆在一起,并且将整个 ftq 模块摆在和 Frontend 相邻的位置。接下来要确保译码单元、重命名单元、指令分发单元的模块分布基本是按照数据流来摆放的即可。由于重排序队列模块(Roq)涉及到多个内部模块的交互,我们尽量让 Roq 模块分布在 ctrlBlock 的中间位置,方便其与各个模块之间的时序收敛。由于指令分发模块会和 memBock、floatBlock、IntegerBlock 等外部模块的交互,可能会导致该模块的物理分布不会太集中在某个区域,会根据时序情况被一定程度的拆散和牵扯,后续做物理实现的时候需要通过多次 place 的迭代,找到一个最佳的,即利于指令分发模块与外部模块时序的收敛,也利于其与内部模块时序收敛的,place 分布结果。规划图如下:CtrlBlock paper floorplan
根据上面的 floorplan 规划图,最终我们得出一版较优的物理实现结果如下图:
CtrlBlock 实际物理实现
4、FloatBlock
首先我们画出 CtrlBlock 内部的数据流图如下:FloatBlock 内部数据流
根据如上数据流图,可以大致给出一个 floorplan 规划图如下:
FloatBlock paper floorplan
如上图,由于模块内部的结构相对简单,又没有 SRAM,所以为了方便时序收敛和缓解绕线拥塞,我们应当避免子模块的 place 分布为窄条状,应让其呈团块状,同时让关系紧密的模块(比如 FPR、RS 转存站、运算单元)呈彼此相邻的摆放,同时可以引入适量的物理 guide 约束应尽量防止不相关的模块穿插在相邻模块的边界处,这样可以减少绕线的 congestion。由于 RS 和运算单元涉及到多个外部模块的交互(memblock,integerblock,ctrlblock),应尽量使得该模块的物理位置到相关的外部模块的距离相近,以利于和多个外部模块边界的时序收敛。最终我们得出一版较优的物理实现结果如下图:
FloatBlock 实际物理实现
5、IntegerBlock
首先我们画出 integerBlock 的数据流图如下:
IntegerBlock内部数据流
可以看到 IntegerBlock 的数据流图整体上和 FloatBlock 很相似,但是 IntegerBlock 多出了一个跳转模块(Jmp),所以 IntegerBlock 的整体规模会大于 FloatBlock,同时也要考虑跳转模块对整体 floorplan 的影响。我们可以按下图所示规划 floorplan:
IntegerBlock paper floorplan
由于 regfile 和其他子模块交互的最为频繁,所以我们采取将 regfile 放置在模块的中间,保留站和运算单元放在四周的策略;由于跳转模块到其他外部模块的时序路径是可以加拍处理,所以时序上较其他两个运算单元会更松一些,所以我们把除了 Jmp 模块之外的运算单元放在离 memBlock 和 floatBlcok 较近的位置,jmp 模块可以摆放的稍微远一些。最终实际的 place结果如下图:
IntegerBlock 实际 place 结果
6. MemBlock
首先我们画出 memBlock 的数据流如下图:
memBlock 内部数据流
根据数据流图可以给出一个 floorplan 的初步规划如下图:
memBlock paper floorplan
我们可以从网表里看出数据缓存(dcache)中 SRAM 数量很多,为了利于 memory 相关的时序收敛,我们将 memory 尽量围着组合逻辑来摆;保留站模块由于涉及到多个外部模块的交互,要通过不断的 place 迭代找到一个较优的位置使得其到三个外部模块的延时相当。 最终的 place 结果如下图:
memBlock 实际 place 结果
小结
以上就是我们对于香山处理器的从顶层到子模块的 floorplan 规划指导,当 floorplan 规划好之后,便可以开始后续的 CTS(时钟树综合),绕线,时序收敛,物理验证等工作,如下附件是 place 到 route 阶段的一些参数设置,供参考;如果大家对之后的环节也感兴趣,欢迎随时线上沟通和探讨,同时也欢迎各路专业人士加入我们的团队,和我们一起打造新一代香山处理器。
附件
place 到 route 阶段的参数设置
点击下方阅读原文直达物理设计大牛知乎文章!