====== UPFを用いたPG設計 ======
* Unified Power Formatによる記述とDesign Compiler、IC Compiler上で使用する際のメモ
* シフタを実装例に取る 高速ライブラリ:CS203SN
* 無理矢理多電力ドメインにするため、以下のように意味のないwrapperを設ける
==== shift_unit.v ====
…
input sleepCon;
output [`BitBus] shift_out;
m_shift_unit m_shift_unit( .shift_out(shift_out), .shift_a(shift_a), .shift_b(shift_b), .aluop(aluop) );
…
===== shift_unit.upf =====
* Low Power ~ Methodという本にある記述をそのまま書いてもなぜかエラー吐きまくった
create_power_domain PD_TOP -include_scope
create_power_domain PD_SHI -elements {m_shift_unit}
create_supply_net VDD -domain PD_TOP
create_supply_net VDD -domain PD_SHI -reuse
create_supply_net VSS -domain PD_TOP
create_supply_net VSSV -domain PD_TOP
create_supply_net VSSV -domain PD_SHI -reuse
set_domain_supply_net PD_TOP -primary_power_net VDD -primary_ground_net VSS
set_domain_supply_net PD_SHI -primary_power_net VDD -primary_ground_net VSSV
create_supply_port VSS -domain PD_TOP -direction in
create_supply_port VDD -domain PD_TOP -direction in
connect_supply_net VDD -ports {VDD}
connect_supply_net VSS -ports {VSS}
create_power_switch SHI_SW -domain PD_TOP \
-output_supply_port {SW_OUT VSSV} \
-input_supply_port {SW_IN VSS} \
-control_port {SW_CTRL sleepCon} \
-on_state {PW_ON SW_IN {SW_CTRL == 1}}
set_isolation SHI_ISO -domain PD_SHI \
-isolation_power_net VDD -isolation_ground_net VSS \
-clamp_value 0 \
-applies_to outputs
set_isolation_control SHI_ISO -domain PD_SHI \
-isolation_signal sleepCon \
-isolation_sense low \
-location parent
add_port_state VDD \
-state {VDD_NORM 0.90000}
add_port_state SHI_SW/SW_OUT \
-state {VSSV_NORM 0.00000}
add_port_state SHI_SW/SW_OUT \
-state {VSSV_OFF off}
add_port_state VSS \
-state {VSS_NORM 0.00000}
create_pst TOP_PST -supplies [list SHI_SW/SW_OUT VDD VSS]
add_pst_state SHI_ON -pst TOP_PST -state {VSSV_NORM VDD_NORM VSS_NORM}
add_pst_state SHI_OFF -pst TOP_PST -state {VSSV_OFF VDD_NORM VSS_NORM}
* 以下簡単な説明
==== 電力ドメインの作成 ====
* PD_TOP 通常の電力ドメイン、-include_scopeですべての要素が含まれる
* PD_SHI PG対象の電力ドメイン、m_shift_unitの階層を指定
create_power_domain PD_TOP -include_scope
create_power_domain PD_SHI -elements {m_shift_unit}
==== 供給ネットの作成と設定 ====
* VDD,GND,VGNDを作る
* 2つ以上のドメインに跨る場合は -reuse
* 各ドメインの電源、グラウンドの供給ネットを指定
create_supply_net VDD -domain PD_TOP
create_supply_net VDD -domain PD_SHI -reuse
create_supply_net VSS -domain PD_TOP
create_supply_net VSSV -domain PD_TOP
create_supply_net VSSV -domain PD_SHI -reuse
set_domain_supply_net PD_TOP -primary_power_net VDD -primary_ground_net VSS
set_domain_supply_net PD_SHI -primary_power_net VDD -primary_ground_net VSSV
==== 供給ポートの作成と接続 ====
* TOPのドメインに供給ポートを作成し、前で作成したネットと接続
create_supply_port VSS -domain PD_TOP -direction in
create_supply_port VDD -domain PD_TOP -direction in
connect_supply_net VDD -ports {VDD}
connect_supply_net VSS -ports {VSS}
==== Power Switchの設定 ====
* パワースイッチがどの電力ドメインか、inputとoutputのネット(順番注意)を指定
* 制御信号を指定し、power-on時の条件を書く
create_power_switch SHI_SW -domain PD_TOP \
-output_supply_port {SW_OUT VSSV} \
-input_supply_port {SW_IN VSS} \
-control_port {SW_CTRL sleepCon} \
-on_state {PW_ON SW_IN {SW_CTRL == 1}}
==== Isolation Cellの設定 ====
* set_isolationで固定する値(0か1)、inputかoutputのどっちで固定するか指定.
* set_isolation_controlで制御信号など
* この場合、m_shift_unitの出力に対してPD_SHIの親階層であるPD_TOPでISOセルを挿入する. sleepCon信号がlowの時、値を0に固定するようになっている
* 上記の条件のISOセルをライブラリから勝手に見つけてくれる(自分で指定も可能)
set_isolation SHI_ISO -domain PD_SHI \
-isolation_power_net VDD -isolation_ground_net VSS \
-clamp_value 0 \
-applies_to outputs
set_isolation_control SHI_ISO -domain PD_SHI \
-isolation_signal sleepCon \
-isolation_sense low \
-location parent
==== Power State Tableの作成 ====
* pstとは設計を実行する場合に取りうる状態の組み合わせを定義. 合成や最適化に使われる
* まず存在するポートの取りうる状態をすべて書く(VDD、VSS、PSのoutput). PGなのでPSのoutputはON/OFFの2状態
* pstを作成し、取りうる状態の組み合わせを全部追加していく
add_port_state VDD \
-state {VDD_NORM 0.90000}
add_port_state SHI_SW/SW_OUT \
-state {VSSV_NORM 0.00000}
add_port_state SHI_SW/SW_OUT \
-state {VSSV_OFF off}
add_port_state VSS \
-state {VSS_NORM 0.00000}
create_pst TOP_PST -supplies [list SHI_SW/SW_OUT VDD VSS]
add_pst_state SHI_ON -pst TOP_PST -state {VSSV_NORM VDD_NORM VSS_NORM}
add_pst_state SHI_OFF -pst TOP_PST -state {VSSV_OFF VDD_NORM VSS_NORM}
* dcにはupfのview modeがある(誰も使わないでしょうけど)
{{:tapeout_enter:view_upf.png|}}
===== 論理合成 =====
* compile前に以下のコマンドを加える
load_upf shift_unit.upf
set_voltage 0 -min 0 -object_list VSS
set_voltage 0 -min 0 -object_list VSSV
set_voltage 0.9 -min 0.9 -object_list VDD
* UPFの場合、complieというコマンドは使えない. かわりにcompile_ultraを. オプションがcompileと違ったりするので自分の環境に応じてmanで確認
compile_ultra -オプション
* 最後に電力評価ツールやICC用のupfファイルを吐き出す
save_upf SHIFT_UNIT.upf
===== 配置配線 =====
==== 前準備 ====
* ICCでUPF使う場合、論理ライブラリ(*.db)に電源ピンの情報を追加する必要がある. milkywayを逆利用
* dc_shellかicc_shellのどっちかで次を実行. core、 nscanあたり. isoはできなかった(特別セルだから?後で問題になる)
add_pg_pin_to_db cs203sn_uc_core_*.db -mw_library_name CS203SN -output pgpin_cs203sn_uc_core_*.db
add_pg_pin_to_db cs203sn_uc_nscan_*.db -mw_library_name CS203SN -output pgpin_cs203sn_uc_nscan_*.db
==== Place & Route ====
* 以下普通のフローと違うところだけ述べる
* read_sdcの前にupfを読み込む
load_upf SHIFT_UNIT.upf
* 電源グラウンドの接続は簡単だが、ISOセルは論理セルにピンを付けれなかったので指定する
* 配置配線後とかもderive_pg_connection -reconnectだけやればいい
derive_pg_connection -create_nets
derive_pg_connection -reconnect
derive_pg_connection -power_net {VDD} -power_pin {VDD} -cells {*ISO}
derive_pg_connection -ground_net {VSS} -ground_pin {VSS} -cells {*ISO}
* 電力の位置を決める. 今回PD_TOPとPD_SHIしかないのでPD_SHIのみ指定すればよく、この範囲の中にPD_SHIのセルが、この外にISOセルが配置される
* -guard_band_x(y)は電力ドメインの周りにblockageみたいなものを作れる
create_voltage_area -power_domain PD_SHI -coordinate {10.5 8.1 55 58.5} -guard_band_x 0 -guard_band_y 0 -is_fixed
* 使用するスイッチセルを指定. 何個でも可能
* 配置するとき一番最初のものが選ばれるが、のちのち最適化の際この中のセルでリサイズされる
map_power_switch SHI_SW -domain PD_TOP -lib_cells {SC27RFPSTAPXH1 SC27RFPSTAPXA1 SC27RFPSTAPXB1 SC27RFPSTAPXC1 SC27RFPSTAPXD1 SC27RFPSTAPXF1}
* スイッチを入れる. create_power_switch_arrayやcreate_power_switch_ringを使う
* arrayの場合、以下のように入れられる. 詳しくはman(ry
create_power_switch_array -lib_cell {SHI_SW} \
-x_increment 40 -y_increment 1.8 \
-start_row 0 \
-start_column 0 \
-bounding_box {3.5 8.1 6.9 58.5} \
-prefix "RINGL" \
-snap_to_row_and_tile \
-orientation FS \
-respect hard_blockage
* スイッチのポートとSLEEPCONを結びつける
* connect_power_switchのほうは-modeでdaisy-chainかhigh-fanoutか指定できるが、PSセルによっては使えない
connect_power_switch -mode hfn -source {SLEEPCON} -port_name {MTE} -voltage_area PD_TOP -verbose
または
connect_pin -from {SLEEPCON} -to {RING*/MTE}
* 配置後にPSセルの最適化
* map_power_switchで指定したセルの抵抗を指定してから、基準となるIR Dropを決めておく