28nm工艺下,自动生成管脚排列文件,给设计加PAD,并在PAD上面打Label的流程(含Tcl脚本)
本文转自:自己的微信公众号《数字集成电路设计及EDA教程》
里面主要讲解数字IC前端、后端、DFT、低功耗设计以及验证等相关知识,并且讲解了其中用到的各种EDA工具的教程。
考虑到微信公众平台上面发布的很多推文百度搜索不到,所以以后的推文也会在这里进行转载。
图:
黑洞:卡冈都亚

《28nm工艺下,自动生成管脚排列文件,给设计加PAD,并在PAD上面打Label的流程(含Tcl脚本)》
在后端设计中编写管脚排列文件(.tdf文件)是一个非常繁琐的过程,其实只要SPEC写好,完全可以用脚本的方式来自动生成该文件,从而减少工作量并防止产生语法问题;且如果要在.tdf文件中指定IO的坐标,当坐标位置有一定的规律时,也可以用Tcl脚本来计算得到,不用靠手工计算来完成。当IO数目上百之后,可想该工作量该有多大,所以能用脚本就尽量用脚本来完成。
此外,在一些IO多的设计中经常用到一些Stagger摆放的PAD,他们的摆放也不容易,在PAD数目非常少的情况下手工摆放还有可能,但是数目增多之后难道非常大。尤其是一些特殊的库中IO和PAD的FRAM View的宽度还不一样。
另外,在ICC中给Port或者PAD打Label也是一个比较繁琐的过程,不像之前的Astro直接用一个命令就搞定了,这里也需要用脚本来批量执行。
这里给出一个自己开发的流程,只要按照这个流程来做就能完美解决上述问题,且设计出错的概率也会非常小。
放置PAD可以在Floorplan之后也可以在布线、DFM等完成之后。不过根据28 nm后端设计时的一些经验,因为PAD是Stagger放置的,所以在内侧PAD的金属和芯片Core内部金属连线存在一些金属间距的违反,所以有两种选择:1、PAD在Floorplan结束之后马上放置;2、PAD在布局布线、DFM之后放置,放置完毕后再检查一下是否有DRC的违反,如果有,修复一下。
之后开始介绍详细的生成.tdf文件以及放置PAD并为其打Label的流程:
1、首先要按照下面的格式写一个SPEC文件来说明IO的名称(这个也是将来打Label要用的),IO例化调用的cell,IO的放置方向(左、右、上、下)、顺序(ORDER)、输入输出属性(INOUT,这个不是必须的,不过为了使得整个设计更加清晰,所以加上了这一项),也可以加上坐标等信息。

2、之后编写一个Tcl文件,内容如下,然后用Tcl执行即可生成Floorplan的管脚排列文件(.tdf):
set fida [open ../../data/io_spec.csv r]
set fidb [open ../../data/create_io.tdf w]
gets $fida
while {[gets $fida data_in]>0} {
set side_sym [lindex $data_in 4]
switch $side_sym {
LEFT {set side_num 1}
TOP {set side_num 2}
RIGHT {set side_num 3}
BOTTOM {set side_num 4}
default {}
}
puts $fidb "set_pad_physical_constraints -pad_name [lindex$data_in 2] -side $side_num -order [lindex $data_in 5]"
}
puts $fidb "set_pad_physical_constraints -pad_name CORNER1-side 1 -offset 0"
puts $fidb "set_pad_physical_constraints -pad_name CORNER2-side 2 -offset 0"
puts $fidb "set_pad_physical_constraints -pad_name CORNER3-side 3 -offset 0"
puts $fidb "set_pad_physical_constraints -pad_name CORNER4-side 4 -offset 0"
close $fida
close $fidb
生成的tdf文件如下:

3、之后根据SPEC来查找IO所在位置,分内侧和外侧用Stagger方式插入PAD,并在PAD中心打相应的Label。其实SMIC 28 nm工艺和40 nm工艺的IO和PAD有一个非常大的不同之处是,它的IO不是等宽的,有细微的差距,有的是30 μm,有的是33 μm,可是PAD宽度是固定的30。本想摆放PAD的时候让PAD和IO中心对齐,但是计算太麻烦了,感觉没有必要,就让所有的PAD都摆放在IO的一边而非中心,因为这样也能接触良好,且不存在DRC、LVS的违反。另外,其实Label也没有必要打在中心,打在左下角也是可以的,不过为了美观,这里放在了中心。接下来是脚本:
#设定IO的长度和宽度:
set io_length 155
#IO的宽度有两种,一种是33,一种是30,没有必要将PAD放置在IO的中心,所以指定一个小的宽度:
set io_width 30;#33
set padio_width 30
#Stagger的PAD有两种,一种是内侧的PADI,一种是外侧的PADO,
#指定PADI和PADO的长度:
set padi_length 155
set pado_length 67.07
#指定Label的偏移量:
set txt_x_org 15
set txt_y1_org 30
set txt_y2_org 114
#对PAD进行计数,同时对PAD进行命名,PAD0、PAD1…:
set num 0
#用out来指定PAD是摆放在内侧还是外侧,out=1则创建PADO,将其放在外侧;否则的话创建PADI,并将其放在内侧。Out交替变换实现Stagger。
set out 1
set fid [open ../../data/io_spec.csv r]
set data_in [gets $fid]
while {[gets $fid data_in]>0} {
global out
if {$out == 0} {
create_cell"PADI$num" PADI30RN ;#cannot use {PAD$num}
set padname"PADI$num"
} else {
create_cell"PADO$num" PADO30RN
set padname"PADO$num"
}
set io_location [get_location [lindex $data_in 2]]
set io_x_location [lindex $io_location 0]
set io_y_location [lindex $io_location 1]
#如果IO位于Bottom,那么坐标计算非常方便,直接让PAD的左下角坐标和IO完全一样就行了:
if {[lindex $data_in 4] == "BOTTOM"} {
set_attribute [get_cells-all $padname] orientation {N}
set pad_x_location$io_x_location
set pad_y_location$io_y_location
set txt_x_location [expr$pad_x_location+$txt_x_org]
if {$out == 0} {
settxt_y_location [expr $pad_y_location+$txt_y2_org]
} else {
settxt_y_location [expr $pad_y_location+$txt_y1_org]
}
#如果IO位于Right,那么计算会稍微复杂一点,PADO要贴近右侧边缘放置,而get_location只能得到IO左下角的坐标,所以坐标需要加上IO的长度再减去PAD的长度,如下图所示,从图中还能看出PAD的宽度和IO不一样,因为没有必要将PAD摆放到IO中心,所以也就没有这样做。

在Virtuoso中摆放出来是这样的:

} elseif {[lindex $data_in 4] == "RIGHT"} {
set_attribute [get_cells-all $padname] orientation {W}
if {$out == 0} {
setpad_x_location [expr $io_x_location+$io_length-$padi_length]
} else {
setpad_x_location [expr $io_x_location+$io_length-$pado_length]
}
set pad_y_location$io_y_location
set txt_y_location [expr$pad_y_location+$txt_x_org]
set txt_x_location [expr$pad_x_location+$txt_y1_org]
} elseif {[lindex $data_in 4] == "TOP"} {
set_attribute [get_cells-all $padname] orientation {S}
set pad_x_location$io_x_location
if {$out == 0} {
setpad_y_location [expr $io_y_location+$io_length-$padi_length]
} else {
setpad_y_location [expr $io_y_location+$io_length-$pado_length]
}
set txt_x_location [expr$pad_x_location+$txt_x_org]
set txt_y_location [expr$pad_y_location+$txt_y1_org]
} elseif {[lindex $data_in 4] == "LEFT"} {
set_attribute [get_cells-all $padname] orientation {E}
set pad_x_location$io_x_location
set pad_y_location$io_y_location
set txt_y_location [expr$pad_y_location+$txt_x_org]
if {$out == 0} {
settxt_x_location [expr $pad_x_location+$txt_y2_org]
} else {
settxt_x_location [expr $pad_x_location+$txt_y1_org]
}
}
set_cell_location -coordinates "$pad_x_location$pad_y_location" $padname
create_text -origin [list [expr $txt_x_location] [expr$txt_y_location]] \
-height 1 \
-layer 83 \
-orient N [lindex$data_in 1]
if {$out == 0} {
set out 1
} else {
set out 0
}
incr num
}
close $fid
给出插入PAD之后的效果,注:IO在PAD下边(DUP)

Label所在位置如下:

如果喜欢本公众号也请多多分享哟,谢谢您的关注

28nm工艺下,自动生成管脚排列文件,给设计加PAD,并在PAD上面打Label的流程(含Tcl脚本)的更多相关文章
- 微信被动回复用户消息-文本消息-springmvc环境下自动生成xml
微信被动回复用户消息-文本消息-springmvc环境下自动生成xml springmvc - 大牛! private Object subscribeMessage(Scan scan) { Sca ...
- Eclipse+Axis自动生成Web Service WSDL文件
JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) 首先创建一个web工程,创建过程如下: 如果选择Apache Tomcat v5.5, ...
- mybatis自动生成mapper,dao映射文件
利用Mybatis-Generator来帮我们自动生成mapper.xml文件,dao文件,model文件. 1.所需文件 关于Mybatis-Generator的下载可以到这个地址:https:// ...
- 自动生成项目的Makefile文件
自动生成项目的Makefile文件 理论基础 跟我一起写 Makefile: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4 ...
- 自动生成Mybatis的Mapper文件
自动生成Mybatis的Mapper文件 工作中使用mybatis时我们需要根据数据表字段创建pojo类.mapper文件以及dao类,并且需要配置它们之间的依赖关系,这样的工作很琐碎和重复,myba ...
- IntelliJ IDEA下自动生成Hibernate映射文件以及实体类
来自:https://blog.csdn.net/chenyunqiang/article/details/81026823 1.构建项目并添加项目结构配置以及配置初始参数 1.1.如图将基本的架子搭 ...
- 【转】IntelliJ IDEA下自动生成Hibernate映射文件以及实体类
1.构建项目并添加项目结构配置以及配置初始参数 1.1.如图将基本的架子搭建好 1.2.点击File,弹出的菜单中点击Project Structure: 1.3.点击左侧的Modul ...
- SpringBoot使用logback自定义配置时遇到的坑 --- 在 /tmp目录下自动生成spring.log文件
问题描述 SpringBoot项目使用logback自定义配置后,会在/tmp/ 目录下生成 spring.log的文件(如下图所示). 解决方案 通过各种资料的搜索,最终发现问题的所在(logbac ...
- Hibernate Tools 自动生成hibernate的hbm文件
本文有待商榷 当我们在新增插件的时候发现会出现duplicate location,意思是所选的anchive所包含的zip路径已经复用,现象如下: 如上图所示黄色标记部分“Duplicate loc ...
随机推荐
- IDEA 问题 & 解决
# 问题 Error: java: Compilation failed: internal java compiler error # 解决 http://blog.csdn.net/u011275 ...
- Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789 _NOTIFY ...
- Win8Metro(C#)数字图像处理--2.18图像平移变换
原文:Win8Metro(C#)数字图像处理--2.18图像平移变换 [函数名称] 图像平移变换函数TranslationProcess(WriteableBitmap src,int x,in ...
- PySide——Python图形化界面入门教程(一)
PySide——Python图形化界面入门教程(一) ——基本部件和HelloWorld 翻译自:http://pythoncentral.io/intro-to-pysidepyqt-basic-w ...
- 微信小程序把玩(二十八)image组件
原文:微信小程序把玩(二十八)image组件 image组件也是一个程序不可缺少的,可以这样说一个app中image组件随处可以看到,一般 image有两种加载方式第一种是网络图片第二种是本地图片资源 ...
- 利用shell脚本实现计划任务功能 V1.2
2013.05.10 mytask 1.2 主程序休眠时间分成若干小的时间片断分段休眠,避免长时间的休眠不能及时响应系统信号. 2013.05.07 mytask 1.1 昨天发布了mytask1. ...
- 【Windows10 IoT开发系列】配置篇
原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...
- DLL里面socket(Delphi的代码)
http://hi.baidu.com/game_base/item/f617e4136414148889a956ed 本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发 ...
- Qt加载百度离线地图
1.下载百度地图离线API 1.3 下载链接:http://download.csdn.NET/detail/caoshangpa/9476608,网上虽然出现了2.0版本离线API,但是经试用,存在 ...
- 适配DirectFB到qt4.8.5(嵌入式Linux)
适配DirectFB到qt4.8.5 1.编译qt4.8.5 这部在qt官网上其实已经有较详细的说明,了解更多,请点击链接进入. 首先是配置选项,如下是我的配置选项: ./configure \ -p ...