从九月持续到十二月,大概花了三个月时间主导了研究生期间的第一次流片,时间紧任务重,也得到了不少人的助力,这个过程中自己也学到了很多的东西,这里对这次流片经历做个简单的总结,分享给大家。
首先整个流片过程可以大致分为几个阶段:
- 架构设计
- 设计实现
- 设计验证
- 物理实现
- 交付厂商
其中1,2可以算作前端环节,4,5可以算作后端环节,而3始终贯穿全流程。
接下来一个一个介绍每个环节都做了些什么事情。
1. 架构设计
这是最重要,也是我最迷茫的一个阶段,因为这次的芯片设计虽然部分参考了师兄们去年做的一个老设计,但是上一次的设计存在各种各样的问题,而且留下来的资料也残缺不全,最后几乎是完全颠覆了他们的设计,改动了非常多的东西,其中一些核心技术点都是推翻重做的。由于这次的芯片涉及的面很广,我一时之间颇有些混乱,不知道从何处下手,所以先抽了些时间阅读资料并思考了一下芯片的设计方法学。
最终我通过一个自顶向下的设计方法,首先规划了芯片的功能需求,然后构思出整体应该具有的数字、模拟模块,并根据每个模块的功能规划,大概对其应该有哪些端口,每个端口的功能,时序,电压/电流......等等进行了初步的设计约束,同时对于一些大的模块,我还将其更进一步细拆成了子模块,并对子模块的端口也进行了约束,随后以这些约束作为指导进行了文档的编写,然后交付给了负责各个设计模块的人,用于指导他们的设计实现,并根据他们的设计反馈不断地对规划和文档进行更新调整。
这个设计过程初期是及其缓慢的,因为最开始我也处于一个只见树叶不见树林的情况,对于各个模块的功能及其边界抓的并不是特别清楚,有的时候产生了一个想法写了一天后又把它推翻了,中间一些没有把握的东西还需要大量的阅读前人的技术文档以及论文资料,但是在逐步完成这个设计规划的过程中,也渐渐的能够看清楚这个芯片到底该如何构成。
初期交付给各个模块设计者的文档并不能完全决定他们最终设计出来的模块的样子,因为他们在实际设计的过程中就会发现一些规划时不合理的地方,这时就需要去相应的调整整体的规划,并将关联的模块的约束一并更新,如此更新几次后基本上架构设计就能够收敛了,也就是处于一个相对稳定的状态,除非出现功能需求上的再更新,否则不会有太多的变动。
2. 设计实现
具体的设计实现可以分成数字和模拟两端,我们这次使用的是一个180nm的老节点,使用foundry提供的模拟pdk和数字pdk,分别进行模拟和数字的设计flow。
在拿到了设计规划的文档之后,设计者也需要再经历一边模块的架构设计过程,也就是到底有哪些子模块,每个子模块的设计边界,设计约束这些东西,一直到胸有成竹具体该如何实现为止。
模拟的flow主要就是使用cadence工具链(IC61+spectre)进行原理图绘制,仿真检验,再修改原理图,直到符合设计要求。具体来说,模拟pdk里面提供了mos,bjt,电阻,电容等等的symbol,用这些基本元件去搭建schematic,然后spice做仿真,仿真出来的结果有问题则再对schematic做修改。这个flow做过模拟设计或者看过我前面博客的人应该都清楚。对于模拟设计而言,自顶向下设计到子模块级别时,选定一下具体要使用的子模块的电路拓扑,然后重心就主要围绕在管子上面了,根据具体的子模块的需求去调节管子的长宽比,从而达成设计需求。这些经典拓扑,譬如差分对,电流镜,运放,参考源,LDO,ADC......都是教科书上有的东西,结合实践经验去做出满足自己需求的电路即可。
数字的flow在前端的阶段其实和pdk关系不大,我们用的是synopsys的工具链(vcs+verdi),其实这次之后挺想去学一下cadence的数字工具链。前端部分就是写verilog代码实现设计,然后仿真看一下波形对不对,不对就改。具体的flow也是做过数字设计或者看过我前面博客的都知道。对于数字设计而言,我总结出来的方法是对于复杂的模块,首先用matlab或者c去写一个bench,高级语言去实现复杂逻辑或者算法比verilog要容易很多,但是在写bench的过程中能够整理出自己的实现思路来,我更喜欢用c写,因为c在实现的过程中只要注意一下可以语法上和verilog很贴近,最后实现时甚至可以直接对着c bench去做。另外采用状态机+数据路径的思维去写verilog,通过状态机把控制部分给拆出来,数据路径上有一些控制信号和受控信号,他们如何通过状态机去产生,从这个角度去切入做实现会有效率很多。一些涉及性能的部分可以用pipeline之类的设计方法再去做,也都是教科书上面都有的东西,结合实践经验发挥即可。
所以其实数模设计本质上是差不多的东西,脑子里面清楚自己要做的电路是啥,然后采用画图或者编写代码的方式实现,仅此而已,只是数字的流程因为走的是编写代码,相对而言自动化程度高一些,当然定制化程度也会相应的下降,也就是最后电路具体怎么实现并不完全可控,得看综合器的发挥。
3. 设计验证
前面说了,这是一个贯穿始终的过程,从弄清楚电路具体怎么设计,动手开始的那一瞬间,基本上就等于设计验证要同步开始了,除了设计阶段的一些对功能的仿真以外,这次流片过程中还接触到了一些其他的东西。
在模拟的验证上,除了针对原理图的spice仿真以外,还要包括工艺角仿真,蒙特卡洛仿真,后仿真等。因为一般都存在pvt偏差,得要通过工艺角仿真和蒙特卡洛仿真来确定自己的设计在有variation的情况下依然能够满足设计需求,后仿真是版图之后考虑寄生参数,互联延迟等再对电路功能进行进一步的校验。具体的做法网上资料也很多,这里不做赘述。
在数字的验证上,首先是前面提到的matlab或者c的bench,来确保算法的正确性。这次的设计验证仍然是用写testbench的方式搞一些固定的测试向量的方法去验证,等到下次有机会了学习一下UVM的设计方法学,从而更科学的验证设计。同时还用fpga验证的方式,把verilog设计搞到fpga上面进一步的验证功能,这样能够查出一些仅仅通过仿真并不能看出来的设计问题。另外数字也区分前仿真和后仿真,做完版图实现后一样可以导出来做后仿。
最后是数模混合仿真,我们通过cadence的ams仿真器实现了这一步骤,具体方法网络上都有,通过这个步骤主要是检查数模边界上面的一些信号的功能问题,因为这方面是设计约束时最容易出问题的,而且不去混仿的话,大家自己做自己的设计时并不能cover到,双方一旦对信号理解上面有偏差就有可能搞出驴头不对马嘴的东西,而且也可能包含一些隐坑,所以这一步是非常有必要的。
设计实现和设计验证一起,也是一个自底向上实现的过程,每一个子模块被check过是ok了以后,再和其他的子模块合并成一个更大的模块进一步验证,再check是否ok,这样一步一步的合并,直到最顶层的电路。
4. 物理实现
这部分工作量比较大,我们一部分会自己做,但也会找外面的团队外包。
模拟的物理实现就是版图layout了,纯手工活。这方面其实我也没有多少的心得,只能说是一个很吃经验的事情,做layout前就得根据原理图估算好面积,大概如何布局,各个出线怎么弄等等,实际做的时候考虑一些诸如对称性,布局是否过于狭窄,好不好走线之类的问题,避免复杂的绕线,一些特殊的线比如电源线之类的得相应的加宽度。
数字的物理实现得用一大堆工具,我们这次用的是synopsys工具链,所以就是design compiler做综合,ic compiler做布局布线,然后formality做一致性检验,primetime做静态时序分析这些东西,也是前面的博客介绍过了的事情,里面吃经验的主要是时序约束那边,具体怎么设计约束,怎么把违例给改好,然后ic compiler那边的floorplan部分,我们这次没有macro要摆,所以省了很多事,大概规划好长宽后,主要是电源网络那边的ring和strap要一点经验,可能要看一下ir drop的问题,还有布线会不会出congestion,但是最麻烦的还是cts那边的东西,修时序真的很烦人。
总的来说这个部分挺花时间的,而且进入后端以后前端的东西有大的修改会非常的麻烦,所以最好是把前端的设计弄完,验证也基本都做完后再处理这个环节。流片最怕的就是前端做太久,时间留的不够最后物理实现得要冲刺会很恶心,那真的是得整夜整夜的熬了。
对于数模混合芯片来说,merge是个重要的环节,主要就是把数字和模拟的版图(gds)给拼到一块去,有两个渠道,一个是把数字做好的gds给导入到IC61里头去手动连线拼。另一个是把模拟的gds给打成macro到数字工具(ICC)里头去拼,最后还得把io pad也给加上。当然这次的情况是foundry只给fram view不给cel view,反正说啥不给io的gds,那么这样的话就只能让io保持在fram的状态送到foundry手上再merge了。
5. 交付厂商
这部分每个组有自己的type-out list,目标就是为了防止辛辛苦苦设计的芯片送回来发现就是块死石头,很多内容也包含在了前面设计验证环节和物理实现环节里面,所以这里不说太多,我们是calibre工具做DRC,Antenna 和LVS的全套,这部分没有什么太多好说的,用foundry提供的rule file跑就完事了,一般前面物理实现的时候根据foundry的layout guide来一般不会有太离谱的DRC问题,Antenna同理,LVS对于模拟来说属于不画错就行,对于数字来说得看看是不是有text打的有问题或者是有一些没有device的instance比如filler之类的。对于前面说的只给fram view的问题,只能把这部分给block掉然后跑。
6. 总结
这次做的过程中也算是感觉到了自己作为一个芯片工程师还有很多欠缺的地方吧,还有很多技能和知识要去学习,而且芯片流出去了只是个开始,只有回片测试了确定功能都是ok的才是真正意义上的成功,否则就是纯纯的浪费钱,抓紧时间再多学一些东西,希望下次能够做的更好。
标签:仿真,数字,流片,验证,芯片,实现,数模,模块,设计 From: https://www.cnblogs.com/sasasatori/p/16984109.html