2022年7月21日 星期四

如何使 Virtuoso 產生的 netlist pin order 符合 library 中的順序

 

做完 Automatic Placement & Routing (APR) 後,要產生 netlist 進行 LVS。

如果 IC 內部有 analog macro,analog macro 中也有用到 standard cell 的話,可能會發現 virtuoso 轉出的 netlist 中的 pin order 和 standard cell library 中的定義不一致。 

解決方式為:

1. 在執行 virtuoso 的目錄下建立一個名為 .simrc 的檔案

2. 在檔案中加入以下文字 auCdlCDFPinCntrl=t


2021年10月31日 星期日

登山紀錄

 小百岳

[新北] 基隆山 588m

[桃園] 大棟山 405m

[桃園] 石門山 551m

[新竹] 十八尖山 130m

[新竹] 飛鳳山 423m

[新竹] 鵝公髻山 1,579m

[苗栗] 火炎山 596m

[苗栗] 哈堪尼山加里山縱走 2,220m

[高雄] 大社觀音山 177m

其它

[新竹] 觀霧國家森林遊樂區

        榛山步道

        雲霧步道

        觀霧瀑布步道

        檜山巨木群步道

[新竹] 九芎湖步道

[新竹] 五指山橫向登山步道 856m

[新竹] 獅山古道 492m

[台中] 鳶嘴山 2,180m

[台南] 糖子恩山 642m

[高雄] 半屏山 181m


2021年7月31日 星期六

開源IC設計工具

 

Verilog Simulation

安裝 Icarus:         sudo apt-get install iverilog

安裝 GTKWave: sudo apt-get install gtkwave

使用方式:

1. 編譯:                           iverilog -o out test.v

                                           iverilog -o out -s top_module -c file_list.txt

                                           iverilog -o out test.v -Dmacro=value

2. 模擬與產生波形檔:   vvp -n out -lxt2

3. 開啟波形檔:               gtkwave wave.vcd &

testbench 中需加入以下指令以產生波形檔

initial begin

    $dumpfile("wave.vcd");

    $dumpvars;

end



2021年7月22日 星期四

如何針對不同的 net 設置不同的 routing rule

 由於我的晶片內部有 0.9V 和 3.3V 不同的電壓區域,在使用 ICC 進行 routing 時,預設的 minimum spacing 是針對兩條線都是同電壓的情況,假如兩條線不同電壓,他們的 minimum spacing 會稍微大一點。為了避免不同電壓的繞線發生 DRC error,需要針對不同的線設置 routing rule。以下程式先定義一個稱為 MVDD 的 routing rule,將 M1~M5 的 minimum spacing 設定為 0.1um。接下來將此 routing rule 套用到所有連接至 macroA 的 net 上。

define_routing_rule -default_reference_rule -spacings {M1 {0.1} M2 {0.1} M3 {0.1} M4 {0.1} M5 {0.1}} {MVDD}
set_net_routing_rule -rule MVDD [get_nets -of_objects macroA]

如何避免 tap cell 距離 macro 太近

在 ICC 加入 tap cell 時,有時會發生 tap cell 距離 macro 太近,產生 DRC error 的問題。可能是 tap cell 的 nwell 和 macro 內部的 nwell 距離太近。也有可能是 tap cell 的 metal 和 macro 內的 metal 距離太近等。我們可以用 create_placement_blockage 在 macro 周圍設置一個禁止 placement 的區域,就可以避免 tap cell 離 macro 太近。以下的指令是在 macro 周圍 1um 的範圍內設置 placement blockage。

foreach_in_collection z $MACRO_LIST {
    set px1 [expr [lindex [lindex [get_attribute $z bbox] 0] 0]-1]
    set py1 [expr [lindex [lindex [get_attribute $z bbox] 0] 1]-1]
    set px2 [expr [lindex [lindex [get_attribute $z bbox] 1] 0]+1]
    set py2 [expr [lindex [lindex [get_attribute $z bbox] 1] 1]+1]
    create_placement_blockage -type hard -bbox [list $px1 $py1 $px2 $py2]
}

2021年7月9日 星期五

如何避免 ICC 對 power/ground PAD 加入 tie cell

 在 standard IO library中,一般用來送 core power 的 PAD,常見名稱為 PVDD1DGZ、PVSS1DGZ。他們的 pin 在libray 中有被定義為 power pin,因此 ICC 可以辨認出來他們是 power pin。

但是 PVDD1DGZ 只能用來送 core VDD,一般電壓比較低,假如我們需要從外部送進一個比較高的電壓,就需要使用能夠承受較高電壓的 analog PAD,但是有些 PAD 的 pin 在 library 中是被定義為 signal pin,可能原先並非被設計用來送 power 的。

當我們用這種 PAD 來送 power 時,會遇到一些問題。

1. derive_pg_connection 無法將 power net 連接到 power pad 上,會顯示 PAD pin 無效的訊息。原因就是因為 PAD pin 在 library 中並未被定義成 power pin。解決方法是改用 connect_net VDD33A [get_pin VDD33A_*/AVDD] 其中 VDD33A 是 power net 的名稱,VDD33A_* 是 power pad 的名稱,AVDD 是他的 pin name。

2. 當我們用以上的方法將 power net 和 power pad 連起來以後,會遇到第二個問題。由於 power net 是我們在 ICC 中創造出來的,ICC 可以辨認出他是 power,但 power pad 的 pin 卻無法被辨認為 power pin。因此當我們進行 connect_tie_cells 時,ICC 會認為 VDD33A_*/AVDD 是一個 signal pin,但是他被連接到 power,因此 ICC 會將所有的 VDD33A_*/AVDD 連接 tie cell。解決方法是在 connect_tie_cells 時,用 -objects [remove_from_collection [get_cells -hier *] [get_cells VDD33A_*]] 將所有的VDD33A_* pad 排除。


create_power_straps 在局部區域

在 ICC 中可用以下指令創造垂直的 power strap,範圍是從 Y=$LOW_Y 到 Y=$HIGH_Y。加入-extend_low_end off 選項代表在 low end 端不延伸往外,也可以改成 -extend_high_end off,或者兩者都有。

 create_power_straps  \
-direction vertical  \
-start_at $px  \
-pitch_within_group 5.5  \
-nets  $ring_names  \
-layer $V_LAYER \
-width 4  \
-do_not_route_over_macros \
-start_low_ends coordinate \
-start_low_ends_coordinate $LOW_Y \
-start_high_ends coordinate \
-start_high_ends_coordinate $HIGH_Y \
-extend_low_ends off \
-extend_for_multiple_connections \
-extension_gap 80