====== 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を決めておく