热度 50| |
混合信号(Mixed Signal)芯片,尤其是AoT(Analog on Top)风格,数字部分版图在Innovus里实现,需要把Innovus的版图导入到virtuoso中。方法有几种。
- Innovus DEF out, Virtuoso DEF in。 这个方法最古老。现在用得很少了。
- Innovus stream out, 生成 GDS, Virtuoso XStream in。 这个方法很常用,尤其是不支持 OA 的 PDK。本文主要讲这个方法。
- Innovus oaOut 存成 OA, Virtuoso cds.lib 里加上 Innovus 生成的 OA library,Virtuoso 就可以直接读了。 这个方法尤其简单,适用于支持OA并有标准元的OA库的PDK。
GDS 本身是个标准。 GDS 里用数字代表层(layer)。 GDS里用 dataType给layer附加一些信息。dataType也是数字。
Encounter/Innovus用字符串代表层,如M1代表金属层1。为了把Innovus里的层信息对应到GDS的层,需要用到一个映射文件,通常文件名为streamOut.map。有的PDK提供这个映射文件,很多不提供,需要自己生成,下面会介绍自己生成streamOut.map的方法。
Virtuoso 也用字符串代表层,为了和GDS的层对应起来,也需要一个映射文件,通常称为 cds2gds map,文件名通常为 <process>.layermap。 这个文件的格式和 Innovus 的 streamOut.map 相似,但实际语法是不同的,千万不要混淆。通常PDK应该有这个 <process>.layermap。
Innovus streamOut.map 可以自己生成。
1. 生成 streamOut.map 模板
在 Innovus 里,运行 streamOut 命令,不加 -mapFile 选项,Innovus 会自动写出一个streamOut.map 模板。修改这个模板可以生成自己所需的 streamOut.map。
streamOut EXPORT/clksw.gdsii \
-attachInstanceName 127 \
-libName DesignLib \
-merge { \
<path to standard cell library>/<standard cell>.gds \
} \
-mode ALL \
-units 1000 \
-dieAreaAsBoundary
2. 修改模板生成 streamOut.map
Innovus streamOut.map 格式是4列,第一列是Innvous 中layerObjName,第二列是layerObjType,第三列是layerNumber,第四列是dataType。
下面是Innovus 自动生成的streamOut.map模板例子,格式是对的,但是第三列layerNumber显然不对,实际的层序号不是从1开始递增的。第三列肯定需要改。
第四列dataType中数字的含义需要查<process>.layermap确认一下。例如,模板里第四列所有数字都是0,通常0代表drawing,意思是版图里必须画出来。在<process>.layermap里可以看到类似下面这样的信息。由此可以判断0对于大多数层应该是对的。最终的版图中我们希望看到这些层被画出来。
但是,不是所有的层都需要画出来的。有的层只是提供一些文字信息,帮助顶层版图工程师了解一些net,pin,帮助顶层连线。例如,模板里的第一列是 NAME的那些行,只是提供辅助文字信息,并不是实际芯片的层。对于这样的文字信息,通常放到一个对应文字的层上。查询<process>.layermap,可以看到127层是专门给文字的。这个PDK还对文字有进一步的细分。例如,M1 层的文字,放到127层,加上dataType 属性 31。细分的好处是更灵活一点,在版图工具可以选择性的显示127层某个细分的文字。
回到模板。现在我们知道大致分两类层。一类是必须要画出来的drawing类层,一类是文字信息text层。下面要做的就是查询<process>.layermap,修改模板里的第三第四列。例如,模板里所有M1层,经过查询修改后,就成了下面这样。 可以看到,M1有关的文字都放到了‘127:31’层。
3. 从Innovus stream out 导出合并GDS
有了正确的streamOut.map文件后,就可以生成GDS了。Innovus里只对金属,VIA层进行操作,并不修改标准元内部。默认导出的GDS只有金属,VIA层。很多时候,顶层版图希望看到一个合并了标准元版图的完整的GDS。这时,streamOut命令就要加上标准元GDS文件,通常在标准元库里可以找到。
streamOut EXPORT/clksw.gdsii \
-attachInstanceName 127 \
-libName DesignLib \
-mapFile ./streamOut.map \
-merge { \
<path to standard cell library>/<standard cell>.gds \
} \
-mode ALL \
-units 1000 \
-dieAreaAsBoundary
上面命令例子里加了-attachInstanceName 127 选项,意思时把instance 的名字放到127层。
4. Virtuoso XStream In
最后就是 Virtuoso 导入上面生成的 GDS文件了。
导入后跑一下DRC。streamOut.map 有错的话,会丢掉一些层,或是放错了层。DRC 可以很快找到这样的错。
好了,流程大致这样,需要耐心。
补充1 – Virtuoso 导入XStream In 时如何避免重新生成标准元的layout
XStream In默认情况下导入时会在target library里生成所有GDS里用到的标准元的layout view。 很多时候这是不必要的。 如果Cadence Virtuoso环境中已经有了标准元库,导入GDS 时只需要reference 已有的标准元库,不必重新产生设计中使用到的标准元的layout。
在XStream In 菜单里点下方的More Options。
点Mapping,点Ref Lib File Name 最右边的编辑键。
加完reference lib之后点Save As and Exit,保存。
随后再导入就可以了。可以看到strmIn.log中有这样的INFO。
INFO (XSTRM-287): The STRUCTURE 'IND2D2' in the input GDSII/Stream file will not be translated. This is because either the refLibList option is used and the cellview is available in the reference library 'tcbn55hv' or the STRUCTURE is not mapped to the target library using the cell map file/piCellMap SKILL function.
在Cadence里打开生成的layout view。 默认下只能看到金属和VIA层,看不到标准元的layout。按SHIFT+F,把reference library 中标准元的layout也转进来,显示所有的层,就可以看到完整的laytout了。
补充2 – 如何解决字体过大的问题
有两个办法。
1)在Innovus里用命令改字体太小。这里0.2意思是改成默认字体的20%。视力好的朋友用0.1也是可以的。
setStreamOutMode -textSize 0.2
2)在Virtuoso XStream In 的时候改。 与补充1相同,在XStream In 菜单里点下方的More Options。
点Geometry,修改 Scale Text Height.
补充3 – Innovus 默认streamOut.map里的COMP 层
Innovus 生成的默认streamOut.map 模板里会有一个COMP层。
NAME COMP 127 0
COMP ALL 128 0
COMP 是一个 Innovus 专有的层,用来在标准元周围画一个长方形的框。这是一个虚拟的层,在<process>.layermap中通常没有对应的层,可以在 streamOut.map 里把上面这两行都删掉。
这里还有一个小技巧。 如果在默认streamOut.map模板里碰到一个层,不确定对应<process>.layermap里哪个层,可以暂时把这个层放到一个用不到的层上。例如,上面提到默认模板里的COMP可以暂时在streamOut.map里放到258层。
COMP ALL 256 0
从Innovus导出GDS后,用GDS工具打开看一下258层上画了些什么。一般看一下就能很快判断层的实际用途。还不确定的话在Cadence 里打开一个标准元的版图,看看有没有对应的层。如果有对应的层,回过去再修改streamOut.map再走一遍。
Cadence PVS 里有一个名为QuickView的工具,命令是k2_viewer,可以打开GDS,很好用的。
补充4
最近一个项目,top level layout 希望把M1 PIN, M2 LEFPIN 当成drawing和M1 NET 放到一起,把 PIN 的 label 放到 pin layer 上,成了下面这个样子。
仁黎冰: 想問假如在innovus bus pin的名字是out[0:7],在streamout的過程如何自動生成virtuoso、spectre習慣的out<0:7>這種形式的lable pin呢 ...