在芯片的GDS數據里,使用Calibre對數據進行處理是非常常見的操作,但是GDS是一種和常規設計結構不太一樣的一種數據,這里,通過這個小小的科普文章,一起看看怎么樣在GDS里邊做數據漫游吧!閑言少敘,ICer GO!
Verilog-like 數據結構
在芯片設計的世界中常用的數據結構就是verilog類型的了,通常是由module(設計)和instance(例化)組成,這樣通過對module的不斷instance,就可以形成一個層次化(hierarchy)的完整設計,在EDA工具里邊,不同家對verilog有自己的獨特的命名定義
- S家
- module:design/ref_name
- instance:cell/leaf_cell
- C家
- module:cell/ref_lib_cell_name
- instance:insts/Hinsts
基本在工作中,用上述的名詞,就可以完成對verilog-like的數據進行準確的描述。
GDS-like 數據結構
對于GDS數據,由于其添加了很多的物理信息,所以這個數據結構和verilog-like相比,有其特殊性,基于常用的Calibre系列工具,它的數據命名大概類似如下:
基礎元素(base element)
- top-cell:當前GDS的頂層設計(top-design),類似verilog里的current_design
- cell:數據庫所有的設計,相當于verilog里的module,cell本層可以包含下列的實際結構,可以簡單的理解為leaf-instance
- poly/wire:指定cell下的metal 類型,可以是任何層的物理圖案,會出現在最后的wafer上,PS:需要mask的支持
- text:指定cell下的text,只是字符描述,不會出現在最后的wafer上,PS:常見的芯片logo等字符,其實是用某一層的polygon實現的
- Via:一個完整的VIA是包含cut、upper和lower layer的,這個不是單純的metal/text,所以在GDS里邊,這個被歸為cell*
- ref:指定cell所使用的設計,
- 如果只有名稱,那么可以理解為verilog里的module
- 如果具備了名稱和物理信息,那么可以理解為verilog里的instance。
- 支持嵌套調用
- 不支持hierarchy design(ref)
可以看到,整個GDS的主要結構還是仿效verilog-like,但是由于都是基于實際的物理設計,所以對于instance和hierarchy做了一些簡化處理。cell/ref可能靈活切換,取決于用戶看數據的層級/角度。
- Cell/ref
- Poly/text
具備了上述的數據定義知識,用戶就可以通過calibredrv里邊提供的命令完成數據的抽取和遍歷了。
注意:calibredrv命令默認返回的信息都是去重的(unique ),除非特殊聲明
GDS 數據遍歷
Calibre的家族可謂博大精深,根據用途,一般可以分為兩類
- 對GDS的查看(GUI)和數據遍歷:calibredrv系統,啟動命令:
calibredrv
- 對GDS的進行靜態規則檢查(DRC/LVS etc.):calibre系統,啟動命令:
calibre
這里,使用calibredrv -shell
命令,就可以啟動calibredrv的命令行模式了,這個時候并不會彈出calibre的GUI,只有一個提示符。
這個也是一個TCL命令接口(PS:這個TCL接口比較古早,不支持命令自動補全 auto-complete,可能對于用慣S家/C家的用戶,還是有一些不太習慣。)
加載一個GDS文件
set L [layout create BIST.gds -dt_expand]
這里的L是GDS創建后的文件句柄,后面所有的操作,都需要借助這個句柄。
- 獲取當前設計(top-cell)
$L topcell
這個GDS的頂層只有一個就是BIST,當然Calibre也支持多個top-cell的GDS數據,但是這個違背了層次化設計規則,建議所有的GDS都有且只有一個topcell
- 羅列出所有的cell(唯一化過的)
$L cells
這里的返回并沒有排序,也沒有上下級關系,有點類似于get_designs這類命令。
- 羅列出指定cell下的第一層引用(ref)
對所有當前層次(cell)下的所有leaf(包含ref)進行羅列,
結合下面的截圖,可以看到,只有第一層的高亮ref被返回,所以,類似verilog下的get_cells命令:
- 對于指定ref,查看在當前設計(top-cell)被引用了多少次
這個例子表明了nand_4p
在整個BIST設計下,被例化的16次,每次例化都有不同的物理坐標信息,盡管設計內容是一樣的:
所以類似的,在當前top-cell下,top-cell(BIST),并沒有被例化過任何一次,這個和verilog里的current_design的道理是類似的。
- 獲取指定cell下的所有和具體inst和inst數量
- 獲取指定cell下的具體inst
$L iterarot ref $cell
這里返回的是ref以及具體的坐標等信息,這個就是上文說GDS里邊例化(instance)了
具體的返回信息解釋如下:
-
獲取指定cell的所有inst數量
方法一:
$L refcount -parent nand_4p
? 方法二:llength [$L iterarot ref $cell]
這個命令是得到了指定cell下的所有子inst,這個和比children(只打印第一層)有如下區別:
? - Children只輸出第一層的ref,iterator則包含了所有層次的 ref
? - Children的輸出是uniq 后的ref信息
? - Iterator 則是inst的信息
- 獲取指定cell下的所有poly
$L iterator poly $cell $layer_list range 0 n
返回值的說明:
所以,可以看到,是一個水平走線的一段metal
- 獲取指定cell下的所有text
$L iterator text $cell $layer_list range 0 n
返回值的說明:
【敲黑板劃重點】
通過上述講解,用戶基本上可以通過命令模式,遍歷出GDS里邊的所有類型的數據,這個對于GDS的信息抓取或者數據比對有很好的參考作用,如果加以靈活運用,對于一些之前需要在APR里邊生成的信息,可以在完整的GDS里邊實現了,譬如:單孔的檢查,metal的面積/密度統計,layer信息的抽取等等,通過Calibre,可以給后端工程師提供更多維度的數據評判和比對。
參考資料
Mentor Calibre? DESIGNrev? Reference Manual