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



2021年7月7日 星期三

一些 IC 設計的注意事項

 

Macro 設計注意事項

1. schematic 完成後測量電流,得到各區域所需電流大小,決定電源網路所使用的金屬層以及寬度,盡量將電源網路做成 grid,並且水平與垂直方向所使用金屬層需考量到後續使用 EDA 軟體進行 place and route 的走線問題。

2. 垂直方向 power/ground 金屬層盡量低於水平方向金屬層,因為 standard cell 的 power/ground rail 是水平的,若垂直方向的 power/ground 高於水平方向,在水平方向的 strap下方的 rail 會被擋住,無法換層連接到 strap 或 ring 上。

3. 無論 power/ground 或 signal,出 pin 時盡量不用 M1。由於 rail 使用M1, macro 的 power/ground 若也從 M1 出 pin,將造成 power/ground 連上 ring 的一路上都無法鋪設 rail,將造成空間的浪費,也常在此發生 DRC error。signal pin 若從 M1 出 pin 容易被 rail 阻擋,造成後續無法繞線。

4. 用來做為 power/ground ring 和 strap 的金屬層,盡量就不用來出 signal pin,比方說,水平 M6 垂直 M5 若為 power/ground ring,從 macro 出 pin 時避免使用 M6 和 M5。第一個原因是在 place and route 時 power strap 規劃會很複雜,垂直 M5 power strap 很容易不小心撞到 macro 上下側的 M5 signal pin。第二個原因是,上下側的 M6 signal pin 連出來時會撞上水平 M6 power/ground,左右側的 M5 signal pin 出來時會撞上垂直 M5 power/ground,必須打 VIA 換層,容易造成 macro 邊緣發生壅塞。

5. 後續進行 place and route 時,由於走線較長會有比較大的負載,Macro 的輸出要用 buffer 將訊號推力加大,避免訊號 delay 和 transition time 太長。

IO Pad 順序

1. 放在靠近 corner 的 power/ground 可能無法接到 core power/ground ring 上,或是連接會不完全,建議在靠近 corner 的地方放給 IO pad 供電用的 VDDPST / VSSPST,或是擺放 signal IO pad。


create_custom_wire

 

在使用 IC Compiler 進行 place and route 時,有些 timing 或 load 比較在意的繞線,可以在進行 route 之前,使用 create_custom_wire 指令進行連接。

start_gui   # 開啟 GUI 介面
set_preroute_drc_strategy -no_design_rule -min_layer M1 -max_layer M6   # 暫時關閉 DRC 檢查
create_custom_wire -start_command           # 開始進行繞線
create_custom_wire -snap_to_track false     # 關閉自動對齊 routing track
create_custom_wire -vertical_layer M6       # 指定垂直連線金屬層
create_custom_wire -vertical_width 0.4      # 指定垂直連線寬度
create_custom_wire -horizontal_layer M5     # 指定水平連線金屬層
create_custom_wire -horizontal_width 0.4    # 指定水平連線寬度
create_custom_wire -nets net_name           # 指定 net 名稱,必須是真實存在的一條 net
create_custom_wire -add_point [list $START_X $START_Y]     # 起點座標
create_custom_wire -add_point [list $POINT1_X $POINT1_Y]   # 中間點座標
create_custom_wire -add_point [list $POINT2_X $POINT2_Y]   # 中間點座標
create_custom_wire -add_point [list $END_X $END_Y]         # 終點座標
create_custom_wire -end_points                             # 結束此條 net
create_custom_wire -end_command                            # 結束繞線
set_preroute_drc_strategy -min_layer M1 -max_layer M6      # 重新開啟 DRC 檢查

由於 create_custom_wire 需要有 GUI 介面才能進行,因此在一開始必須開啟 GUI。在繞線的過程中,ICC 會自動在轉折處打上VIA。


2021年7月2日 星期五

Abstract Generation

將 Full-Custom Design Layout 進行 abstract generation,抽取 pin metal layer、pin 位置等訊息後,得到的 lef 檔經過轉檔後可以給 IC Compiler 使用,進行 place and route。

Abstract Generation 流程

  1. 用 virtuoso 建立一個 library,並 import GDS
  2. 開啟 abstract &
  3. Open library
  4. Move top cell to block:Cells -> Move -> Block
  5. Import logic:加入 verilog module,須包含 in/out pins 定義
  6. Pin definition
  7. Extraction:所包含的 metal、via 會決定抽取出的資訊多少,太多可能會失敗
  8. Abstract
  9. Export LEF
  10. Convert LEF to CEL and FRAM





注意事項

  • Pin 的金屬要畫到 layout 的邊界
  • 出 signal pin 不要用 metal 1,會被 standard cells 的 power rail 擋住
  • 出 power pin 避免用 metal 1,容易與 standard cells 的 power rail 發生DRC error
  • 出 power pin 要遵守水平與垂直方向的金屬層定義 (HVH 或 VHV)
  • APR 進行時需設置 placement blockage 在 macro 四周,避免 standard cell 或 core filler 擺放時太靠近 macro 內部的 device,造成 DRC error





2021年5月18日 星期二

Virtuoso Layout 備忘錄

  • 顯示/隱藏 instance 內容
          Shift + f / Ctrl + f
  • 取消尺規自動貼齊
          k -> 滑鼠右鍵 -> smart snapping off
  • 畫斜的 path
          Create -> Shape -> Path (p) -> 按下F3
  • 在 LVS 時忽略 Dummy 電晶體 

          Setup -> LVS Options


  • Pin 用特定金屬的 pin layer (pn) 來標示
          Pin 不要打在尺規上,否則清除尺規時 pin 會一起消失