在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: qfliuyang

[原创] 手把手教你独立做出《CMOS集成电路后端设计与实战》里的Lab

[复制链接]
发表于 2015-10-20 21:36:04 | 显示全部楼层
说了一堆废话
 楼主| 发表于 2015-10-20 21:48:19 | 显示全部楼层
1020第四更
今天我们来说说fpu后端lab中的第0步——synthesis

由于咱们的重点是用dc吐一个可用的.v或者ddc给icc用,所以这里就不介绍那些fancy的dc技巧和高级设置了

小白们最不喜欢的就是从零开始,好在opensparc和synopsys给我们打了一个地基
如果这时候你还没有找到“Synopsys_90nm_lib_course-OpenSPARC_labs_final_041509”,我建议你把书烧掉然后回家睡觉

进入了这个文件夹之后,正常的反应应该是去看一下readme和lab doc。这个时候,没装过虚拟机和软件的小白傻乎乎的按照readme里面所说的一步步的做下来,而装过虚拟机核软件的同学会在10秒钟把readme关掉,因为他们一眼就明白这个文件是在干嘛。所以说,不要以为瞎折腾浪费了你的时间,实际上早点折腾的话以后会省掉你不少的时间,生命在于折腾。

然后我们就来看一下lab doc。如果你之前折腾过DC的lab,那你肯定会大呼坑爹,说“这也好意思叫lab?”,这时候我才你会直奔各lab下面找找有没有tcl和sdc,当然是可以找到了,lab2里面有两个差不多的tcl,lab1里面有个fpu_2ns.con。打开之后你会发现你又被坑了,了了几行这是在骗钱吗?没关系,咱们要求不高。

首先看一下lab2_area0.tcl,current_design fpu之前的就是我们的地基,前面几行设置好就可以跑了,如果你还不知道前面几行应该怎么设置,还是先去学习一下DC的lab吧。不过我个人还是喜欢.synopsys_dc.setup+common_setup.tcl的方法,把该设置的都写进去,dc和icc启动时就读进去,节省很多繁琐的步骤。

我们按部就班的把各.v读进来,这里就是上一更里提到的第一个moment of truth,如果那个regfile的.v没有写对,这里会报一个error,如果有错的话修改正确,current design设到fpu,然后link一下,不出意外的话你会发现regfile成功link到了macro上

然后我们需要准备一个sdc文件,就是时序约束。这时你想起了之前有个fpu_2ns.con,打开一看居然只定义了一个时钟,哎,真是偷工减料。不怕,咱们可以自己写一个
4.jpg


然后我们就可以愉快的去compile_ultra -no_autoungroup了!(不加-no_autoungroup看看会发生什么)

timing不要约的太紧了,让dc轻松的把fpu综合出来,change_name然后把ddc和.v写出来,我们就算完成了

不过。。。我个人还是喜欢直接用dct。如果有同学折腾过SAED90这个烂库的话,会发现这个烂库的wire load model离谱的令人发指。所以说我的脚本看起来是这个熊样的

5.jpg

6.jpg

7.jpg


如果不能轻轻松松看懂的话,建议你回去看我上一更的内容,然后去恶补基础知识,补完再回来

这里安利一下synopsys reference methodology里面的一些比较好的习惯,比如多用些变量,使得script的可维护性大大加强


突然感觉没什么好写的,毕竟稍微折腾过些dc的这一步都不是什么障碍,大家可以题问啊,我尽量回答

明天说说icc的data prep、dc topo和floorplan吧
 楼主| 发表于 2015-10-20 21:49:06 | 显示全部楼层
回复 41# muyu8780


   是的,都是废话
发表于 2015-10-20 22:34:56 | 显示全部楼层
回复 43# qfliuyang


   急死人了
发表于 2015-10-20 22:44:53 | 显示全部楼层
回复 43# qfliuyang


楼主辛苦了,看来他是着急看apr部分.
不过,现在这些铺垫对新手确实是很重要的!
发表于 2015-10-20 22:51:54 | 显示全部楼层
回复 44# muyu8780


目测楼主经验和自学能力都是很强的.虚心向他请教吧,说不定他一高兴,你会有意外的惊喜
发表于 2015-10-21 19:01:34 | 显示全部楼层
跟了
发表于 2015-10-21 21:04:35 | 显示全部楼层
顶一个
 楼主| 发表于 2015-10-21 21:16:44 | 显示全部楼层
本帖最后由 qfliuyang 于 2015-10-21 21:25 编辑

1021第五更
终于步入正题了,看来大多数小伙伴都有synthesis的基础,今天说说icc的data prep、floorplan和与dct的交互问题

昨天那一更大家也看出来了,虽然我不会吧脚本玩玩整整的贴上去,但是关键部分都有,所以只要有点基础就完全搞得定。

首先,icc的第一部是要给设计建一个库,为设计导入做准备

8.jpg


我的习惯,在开头的时候定义好当前的PHASE变量和pre_PHASE变量,这样各个步骤之间可以相互之间有个明确的区分,并且前面这二十几行代码基本可以通用,以后打开milkyway library的时候直接用pre_PHASE这个变量就可以了,否则要填很多次名字,当设计的版本很多时非常不方便。如果你还主要用gui的话我无话可说。。。
另一个良好的习惯就是全面的check,icc提供了很完善的check命令,这一点icc的lab上有比较好的介绍。新手多看看check出的这些report挺有收获的。

前面这几行没什么问题的话我们就可以把design import进来,非常简单

9.jpg

这里就用到了pre_PHASE变量。当然我在common setup里面把dc的results文件夹加到了search path里面

后面的就很轻松了,create一下floorplan,我们的utilization就先从70%起跳。唯一需要手动完成的就是两个macro的摆放

这里就涉及到了整个后端设计中最最精华的floorplan,好在我们这个设计非常简单,把两个macro摆在角落里就行了。注意有些先进工艺的memory是禁止旋转的,按照工艺要求来。这些东西ces的lab都有介绍,就不再啰嗦了

这里大家可能就发现了,这fpu的port太多了,而且好多都是什么都没有连的端口,白白占地方啊。这里和刘峰老师的书中情况不一样,我猜刘峰老师为了示范对设计做了一些处理,否则port不会那么少。保留全部连了内部cell的port的话绝对是pad limit的,所以这里只能当做一个模块来做了。那这些多余的端口该怎么删掉呢?

很简单,找到一个没有连的port,然后remove_port不就完了嘛,不过icc是不能直接remove bus中的一个port的。这时候一批人开始到eetop发帖、到各大群众求助问这种port该怎么去掉,另外一批人会man一下错误信息,根据提示以及相关命令,或者help *bus*找到undefine_bus这个命令。差距就是这样产生的。新手学习阶段,不要遇到一点问题就去问,看似省了时间,实际上你失去了一次自我提高的机会。好了,我们把三个bus undefine掉,下面就是要删掉所有没有连接的port了。这时又有一批人任劳任怨的打开飞线,然后用鼠标不厌其烦的选中、删除。。。这说明你对tcl还不熟悉,eetop中以及百度盘中都有tcl的全套lab,还有视频讲解,刷一两遍回来之后,相信你能写出下面的东西

10.jpg


怎么remove就不用说了吧。

再摆macro的时候我自己喜欢对的整整齐齐的,并别macro与core边界的距离是个整数也开心,可能是强迫症吧。这时候多用一下右边的工具

11.jpg


别上来就问这些工具是干什么的,自己话几分钟试一下一辈子也忘不了。macro该align的align,pin可以用create_fp_placement先摆一个大致的样子,然后微调一下。咱们这个lab也没要求port的摆放,自己看着弄吧,摆的漂亮一点,用上面的命令均匀的spread开

然后应该差不多是这个样子的

12.jpg


为了防止standard cell乱入,我们还要设一下keepout和placement blockage。placemen blockage就不要傻乎乎的自己话了,直接derive_placement_blockage,具体怎么使用自己man。

13.jpg


那些虚线是啥?那是tap cell,macro两侧以及core的边缘还有endcap cell。关于这两个cell的功能去百度一下就知道了,我这里用的工艺并不是之前跟大家推荐的那个0.18um的工艺,大家去看看那个工艺需不需要加tap。虽然没有正式的文档,但是大家看一下library的文档就能看出需不需要加tap和endcap。加之前derive一下pg,避免不必要的错误

14.jpg


macro周边的tapcell和endcap可能插入的不是很理想,man一下命令研究一下选项看看如何能比较理想的插这些东西。

下面就是出macro、pin的摆放之外的一个重头戏了——powerplan

powerplan之前,大家要有一个概念,standard cell 的power rail一般都是横向的M1,而powerplan中供电的金属层都是最上面几层金属,如何保证所有standard cell都能连到顶层的power strap上呢?注意,power rail只有两种方向:水平和竖直。最下面一层power strap应该是横着的还是竖着的呢?想清楚了这个问题下面的一些设置就好理解了。

假设我们这里取6789四层金属来做power strap。首先给我们这个模块做一个ring

15.jpg


然后给两个macro做power strap。注意,这里我用的库中memory的power grid是竖着的M4,所以上面要在memory尽量密的打上横着的M5。smic018的库里面应该只需要给macro周围打一圈power ring就可以了。这里我们如何使得power strap只在macro上打呢?tcl又上场了

16.jpg


如何在macro 周围做power ring大家用gui看一下有关power strap和power ring的命令就能找到


大家是不是感觉回了tcl简直是如虎添翼啊。不过上面这些有关创建power strap和power ring的命令选项很多,而且有时候其意义不太好理解,如pitch within group与group什么的,这里只有多多实践了,不要懒。

macro的搞定了,我们来做整个模块的power strap,很简单

17.jpg


一共有四个create_power_strap的语句,后面怎么调整其参数大家也多试一下,既要尽量密级的打power strap,又不能耗费太多的routing资源,开动脑筋,想想办法

然后我们把standard cell连上

18.jpg


下面又到了一个moment of truth,究竟这样的power能不能把所有的cell都连上呢?用下面几条命令看一下。注意用这条命令之前先create_fp_placement,防止有illegal 的placement导致不能verify。

19.jpg


应该是0 error,如果有error,仔细看看问题出在哪里?怎么调整能规避这些问题,不要怕麻烦啦,此时正是修行时

然后我么吧dct的synopsys placement guide 恢复,然后保存milkyway cell

20.jpg


spg又是什么鬼?这里就要提一下dct了。

dc的topographic模式大家应该都清楚,用过的都说好,而且dct能够根据用户提供的floorplan信息对placement做一个指导,实际上就是做一个initial的placement。那floorplan信息哪里来呢?上面我们讲的都是floorplan的信息啊,我们只需要把这些信息写出来就行了,如何写,怎么写,dct能认到那些floorplan信息,大家去看dct的lab,这个在eetop里也有哦。不过这一要提醒大家几点
1、tcl形式的floorplan信息对keepout、move bound的传递不是很好,建议在dct中再设置一次
2、tcl形式中floorplan信息的某些语句dct中会报错,一般没问题,但是如果source floorplan.tcl位于if语句中,报错会造成脚本的执行从if语句中跳出来,导致意想不到的错误。只需要把下面两句注释掉就可以了

21.jpg

全部都完成之后应该是这个样子的

22.jpg


注意里面的standard cell只做了initial的placement的哦,就是dct的spg数据(ddc或者.v+DEF),是没有legalize的


23.jpg


今天的东西绝对是干货吧,明天继续placement!
发表于 2015-10-21 21:45:04 | 显示全部楼层
步骤超详细,赞!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-19 17:28 , Processed in 0.031888 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表