后端在floorplan阶段,如何摆放macro是一个很重要的问题,如果采用层次化设计,对于每一个block来说都需要在block内部把锁分配的macro摆好,如果某一个block里的macro很多,而且又很大,std cell再多一些,这样的话每个block的面积就会很大,相应的这个block的floorplan就比较难做,而其他的block的面积很小,这样的design就不太好,我们总是希望所有的block都能有差不多的面积,平均且充分的利用芯片的每一块面积,这就需要在block划分初期就做好预估。
这个问题需要前端和后端协调配合,block的划分是需要前端提供带有hierarchical结构的netlist,然而前端在做herarchical的综合的时候,并不会过多考虑后端物理层面的信息,因此可能综合出来的netlist各个block物理上不是那么均衡,当然,这种netlist也是可以物理实现的,知识对于有些要求比较高的design来说,最后出来的性能可能会有所不足,这个时候后端工程师就可以反馈,比如说,把某个block的某个macro综合到另一个block里面去,或者两个block就直接merge变为综合成一个block,收到反馈后,前端工程师就可以重新综合,再给我们新的netlist来做block的划分。
以上这个过程可能需要迭代几次才能达到最佳效果,但是这样会花费很多时间,导致芯片设计周期变长,一种更快的方案是,前端首先综合出打平的netlist,就是不带任何hierarchical信息的,出这种netlist的速度应该会相对快一些,后端拿到打平后的netlist,就知道macro以及有关std cell的面积了,这样后端就可以直接通过这些物理信息和逻辑信息来划分harden block,再把分配好的结果给前端,前端就可以参考这样的分配来做hierarachical层级,不管是打平的综合还是hierarchical的综合,出来的cell count或者面积是差不多的,因此后端在拿到hierarchical的netlist之后,做出来的block物理情况应该也与之前用打平 netlist的预估差不多。
有一个可能疑惑的地方是,这里前端给的netlist永远是总的芯片的所有的netlist,不管是flatten还是带有hieracrchical结构的netlist都是一个file,后端也会做netlist的划分,不过是根据前端给的那份netlist切割成好多个netlist给不同的block来用,相当于把一个设计文件变成多个文件,每一个block拿一个,分割的依据是总的netlist的hierarchical结构(即若干个子系统)。
有的时候资本家觉得上面的方法还是慢,并且还想追求比较好的芯片性能,就有人想出了更为讨巧的办法,这个方法牺牲了一定的准确度,但大大提高了速度,就是说前端在综合之前就把IP和所有macro的信息提供给后端,而后端专门有工程师来利用大数据机器学习的方法预估出每个IP相关的std cell count和面积,没错,机器学习也应用到芯片领域了,一哥ip在之前的芯片中用的越多,样本越大,学习的效果就越好,后端就可以根据这一份预估的结果来进行block的划分,然后把划分的结果反馈给前端,前端就可以直接按照这个方案综合,综合次数最少只需要一次,芯片设计周期大大缩短,但是相应的划分的准确度也比较难以保证。