====== UX8Lのためのサンプルスクリプトを用いたレイアウトの手順 ====== ===== -1. はじめに ===== 以下のレポートは, /home/vdec/lib/ux8l/DesignFlow/Place_Rout_SampleScript_WEB-00465513-01.pdf を参照して記述されている.ってか,ほとんどパクリである. また,本レポートの作業ディレクトリは, /home/hlab/masayuki/wasmii3/ux8l/ である. ===== 0. 準備 ===== ==== A. 作業ファイルのコピー ==== 論理合成によって生成したファイルを,(作業ディレクトリ)/pr/database以下にコピーする. * (作業ディレクトリ)/design_compiler/MARIMOR2/gate/MARIMOR2_CHIP-compile.v を,(作業ディレクトリ)/pr/database/netlist/にコピー(リンク)する. * ピン配置で生成したcsvファイルを,(作業ディレクトリ)/pr/database/pin_assign/にコピー(リンク)する. * (作業ディレクトリ)/design_compiler/MARIMOR2/sdc_dc/MARIMOR2_CHIP.sdc を,(作業ディレクトリ)/pr/database/sdcにコピー(リンク)する. //**以降,マニュアルを基本的に参照してほしい.独自に改変する必要がある場合のみ記述する.**// ==== B. lefファイルの作成 ==== SOC Encounterを動作させるには,lefファイルというものを作成し,読み込ませなければならない. (作業ディレクトリ)/pr/database/lef にて,run_ace_lefcatを改変する. ### env set path = ( $path \ /home/vdec/lib/ux8l/bin \ ) setenv OPC_PATH /home/vdec/lib/ux8l setenv OPC_ADD /home/vdec/lib/ux8l/IO/OPC_ADD2 setenv OPC_PLL /home/vdec/lib/ux8l/PLL/linux # setenv OPC_MEM メモリのパスを消し,ベースとなるパスを変更する. その後,本スクリプトを実行し,lefファイルを生成する. ==== C. VDEC_soce.confの作成 ==== CONFIGファイルという,SOC Encounterを利用する際の必須ファイルを作成する. (作業ディレクトリ)/pr/database/conf/VDEC_soce.confを改変する. # ============================================================================ # # --- Data preparation --- # # ============================================================================ # global DESIGN # Please change variables below set DESIGN MARIMOR2_CHIP # トップモジュール名 set OPC_PATH /home/vdec/lib/ux8l set OPC_ADD /home/vdec/lib/ux8l/IO/OPC_ADD2 set OPC_PLL /home/vdec/lib/ux8l/PLL/linux ===== 1. フロアプラン ===== 配置場所の定義を行う. ==== A. ile/fe_ini.tcl ==== set I_CNF ../../database/conf/VDEC_soce.conf # CONFIGファイルを指定 set I_LEF ../../database/lef/lef # lefファイルを指定 set I_NET ../../database/netlist/MARIMOR2_CHIP-compile.v # 論理合成後のネットリストを指定 set I_DEF ./io.def.gz set O_DEF ./floorplan.def.gz set O_NET ./floorplan.v.gz # set chipsize 2.5 # set chipsize 5.0 set chipsize 5025 # 5.0mm x 2.5mm のチップを利用 ==== B. file/mkdef.tcl ==== set design MARIMOR2_CHIP # トップモジュール名 set pinassign_list ../../database/pin_assign/PAD_ASSIGN_MARIMOR2_UX8L_V03.csv # ピン配置ファイル set pad_file ../../database/pad_file/chip_5000x2500_FPBGA_pad.list # 5.0mm x 2.5mm のパッケージを利用 set output_def io.def.gz # set chipsize 2.5 # set chipsize 5.0 set chipsize 5025 # 5.0mm x 2.5mm のパッケージを利用 set iocell C0S8L0STARCIO_FE_TWF1IC33AS set plliocell C0S8L0STARCIO_FE_ACPLIO38V10 # set pllcell "C0S8L0STARCIO_FE_ACPLMPHH38V10 pll" # このセルはないので下記セルに変更 set pllcell "ACPLSCHL38V10 pll" ==== C. run_fec_floor ==== encounterを呼び出すためのスクリプトである.ふんが研では,SOC Encounterのパスは, $ which encounter /home/vdec/cadence/SOC-8.1/tools/bin/encounter なので, ############################################################# # set FEC = /eda_tools/cadence/soce_limited/08.10-e273_1/tools/bin/encounter set FEC = /home/vdec/cadence/SOC-8.1/tools/bin/encounter ############################################################# に改変する.//**以下,起動スクリプトは常にこのパスに書き換えること!!**// ==== スクリプト実行 ==== 普通にrun_fec_floorを実行する.floorplan.logにログが出力されるので,エラーが無いか確認すること. ===== 2. 電源配線 ===== 省略.電源配線省略とか,死んでしまう。。。 ===== 3. 配置 ===== ==== A. file/place.tcl ==== あまり修正する部分はない. # ============================================================================ # # --- Data preparation --- # # ============================================================================ # set inputConfig ../../database/conf/VDEC_soce.conf set inputVerilog ../01_floorplan/floorplan.v.gz # set inputDef ../02_proute/power.def.gz set inputDef ../01_floorplan/floorplan.def.gz set inputLef ../../database/lef/lef # set inputSDC ../../database/sdc/cpu8top_clock_200MHz.tcl set inputSDC ../../database/sdc/MARIMOR2_CHIP.sdc # Design-Compilerで出力したSDCファイルを指定 set outputVerilog ./place.v.gz set outputDef ./place.def.gz set dontuse ./file/dont_use.tcl ==== B. 配置実行 ==== ./run_placeを実行. ==== C. 配置結果 ==== {{:tapeout_enter:ux8l_soc:ux8l_mips_03_place.jpg| 配置結果}} ===== 4. CTS(Clock Tree Synthesis) ===== クロックツリーを張る. ==== A. file/cts_spec ==== クロックの制約を記述したスクリプト. ### clock net name CLK # AutoCTSRootPin pll/CLKOUT AutoCTSRootPin IBUF_CLK_IN/Y # クロックのソースを指定 MaxDelay 8.0ns # 遅延制約を設定 # MaxDelay 4.0ns MinDelay 0.1ns MaxSkew 250ps NoGating NO Obstruction NO #LevelBalanced YES ForceMaxCap YES # MaxFanout 100 # ファンアウト制約を満たせなかったので,100->110に設定したが,いいのだろうか。。。 MaxFanout 110 # 100 -> 110 DetailReport YES #RootInputTran 0.2ns BufMaxTran 0.5ns SinkMaxTran 0.5ns RouteType clk_upper LeafRouteType clk_leaf #PostOpt YES #OptAddBuffer YES #OptAddBufferLimit 200 Buffer LDH_BUF_S_10 #LeafBuffer INVXP MaxCap + LDH_BUF_S_10 0.14pf #+ INVXP 0.11pf #+ GTDCLXP 0.11pf DefaultMaxCap 0.14pf CellHalo + LDH_BUF_S_10 6.666 0.550 #LeafPin #+ AAA/CCC/BE rising #+ BBB/CCC/BE rising #ExcludedPin #+ U_APLL_TOP/U360/B1 #+ U_APLL_TOP/U293/A #PreservePin #+ AAA/CCC/A #+ BBB/CCC/A #ThroughPin #+ BBB/DDD/CLK #PinMaxCap #+ AAA/BBB/Y 0.5pf #GatingGrpInstances #+ cg1/an cg1/i_0 #+ cg2/an cg2/i_0 #GatingGrpModule #+ grp_module1 #+ grp_a* End ==== B. cts.tcl ==== クロックツリーを生成するためのスクリプトである. ####################################################### #---------- Required setting by user ----------------- set inputConfig ../../database/conf/VDEC_soce.conf set inputDef ../03_place/place.def.gz set inputVerilog ../03_place/place.v.gz set inputLef ../../database/lef/lef # set inputSDC ../../database/sdc/cpu8top_clock_200MHz.tcl set inputSDC ../../database/sdc/MARIMOR2_CHIP.sdc # 論理合成時のsdcを指定する. set outputDef ./cts.def.gz set outputVerilog ./cts.v.gz #set ShieldNetList ./file/shield_net.list set clkSpec ./file/cts_spec set maxLayerNumber 7 #### replace root cell FCTS -> BUF setOptMode -rPlace set_dont_touch LDH_CTS false # set_dont_touch core/clk_blk/cts_clk1/CTS_ROOT false # set_dont_touch core/clk_blk/cts_clk2/CTS_ROOT false # set_dont_touch core/cts_reset/CTS_ROOT false set_dont_touch IBUF_CLK_IN false # クロックのdont_touch制約を解除 set_dont_touch IBUF_RESET_IN false # リセットのdont_touch制約を解除 # dbSetInstPlacementStatus [dbGetInstByName "core/clk_blk/cts_clk1/CTS_ROOT"] dbcPlaced # ecoChangeCell -inst "core/clk_blk/cts_clk1/CTS_ROOT" -cell "LDH_BUF_S_10" # dbSetInstPlacementStatus [dbGetInstByName "core/clk_blk/cts_clk2/CTS_ROOT"] dbcPlaced # ecoChangeCell -inst "core/clk_blk/cts_clk2/CTS_ROOT" -cell "LDH_BUF_S_10" # dbSetInstPlacementStatus [dbGetInstByName "core/cts_reset/CTS_ROOT"] dbcPlaced # ecoChangeCell -inst "core/cts_reset/CTS_ROOT" -cell "LDH_BUF_S_10" dbSetInstPlacementStatus [dbGetInstByName "IBUF_RESET_IN"] dbcPlaced ecoChangeCell -inst "IBUF_RESET_IN" -cell "LDH_BUF_S_10" # set_dont_touch core/clk_blk/cts_clk1/CTS_ROOT true # set_dont_touch core/clk_blk/cts_clk2/CTS_ROOT true # set_dont_touch core/cts_reset/CTS_ROOT true set_dont_touch IBUF_CLK_IN true # クロックのdont_touch制約を設定 set_dont_touch IBUF_RESET_IN true # リセットのdont_touch制約を設定 ==== C. cts実行後の確認 ==== cts実行後に,以下のファイルを確認する. * cts.log : エラーが無いか確認すること * cts.ctsrpt : クロックスキュー,およびViolationが存在しないことを確認すること. * halo_check.rpt : "Failed : 0"となっていることを確認すること. なお,cts.ctsrptでは,Violationが存在しない場合,CLK, RESETについて以下のようなレポートが出力されているはずである. ***** NO Max Transition Time Violation ***** ***** NO Min Transition Time Violation ***** ***** NO Max Capacitance Violation ***** ***** NO Max_Fanout Violation ***** ***** NO AC Irms Limit Violation ***** CTS実行後の結果. {{:tapeout_enter:ux8l_soc:ux8l_04_cts.jpg|}} ===== 5. 配線 ===== ここで変更する部分はほとんどない. 今回はEncounterを起動せず,nanorouteというツールを用いてルーティングを行う. そのため,起動スクリプト./run_routeは次のようになっている. if ( ! -f .routing_guide.rgf ) ln -s ../04_cts/.routing_guide.rgf . ############################################################# # set NANO = /eda_tools/cadence/nano/8.1.e027/bin/nanoroute set NANO = /home/vdec/cadence/SOC-8.1/tools/bin/nanoroute ############################################################# ${NANO} -64 -batch -init ./file/nanoroute_ux8l.tcl -log route.log 配線結果.ここではINDATA_27とINDATA_28にViolation Errorが出てしまっている. {{:tapeout_enter:ux8l_soc:ux8l_mips_04_cts.jpg|}} Errorが発見された場合,MARIMOR2_CHIP_init_antenna.rptおよびMARIMOR2_CHIP_init_vialation.rptにエラーメッセージが出てくるはずである.今回はこのようになっている. * MARIMOR2_CHIP_init_antenna.rpt Total number of net violated process antenna rule = 0. * MARIMOR2_CHIP_init_violation.rpt Begin violation report: Design Rule VIOLATION: NET (W_IDATA_IN_27_), LAYER (M1L) location (160.710000 -917.796000), type (VERTICAL) Design Rule VIOLATION: NET (W_IDATA_IN_28_), LAYER (M1L) location (190.806000 -917.796000), type (VERTICAL) End violation report どうやったら消せるの... ===== 6. シールド配線 ===== クロック配線に対して,シールドを行う. 基本的に,tclには変更する部分は無し. * ./run_shield_attribute * ./run_shield のふたつを実行する. ===== 7. メタル埋め ===== メタル密度基準を満足するためにメタルを埋める. ==== A. file/metal_fill_ux8l.tcl ==== いくつかのコード修正を行う. set inputConfig ../../database/conf/VDEC_soce.conf set inputLef ../../database/lef/lef set inputDef ../06_shield/shield.def.gz set inputVerilog ../04_cts/cts.v.gz # set chipsize 2.5 #set chipsize 5.0 set chipsize 50.25 # チップサイズに応じてオプションを変更する. #set inputECOFile さらに注意すべき点として,addMetalFillの修正を行う.:!::!:無効なオプションが入っているので,これを消去する.これを行わないとメタルが入らないので,注意!! # modified by Masayuki KIMURA # useNonDefaultSpacing is not defined in addMetalFill addMetalFill -iterationNameList { step1 step2 } -extraConfig cont.conf \ -layer { 1 2 3 4 5 6 7 } -area $X1 $Y1 $X2 $Y2 \ -timingAware on -snap -onCells -stagger off # addMetalFill -iterationNameList { step1 step2 } -extraConfig cont.conf \ # -layer { 1 2 3 4 5 6 7 } -area $X1 $Y1 $X2 $Y2 \ # -timingAware on -snap -onCells -stagger off \ # -useNonDefaultSpacing 実行結果. {{:tapeout_enter:ux8l_soc:ux8l_07_metal_fill.jpg|}} ==== 実行結果の確認 ==== 実行後,以下のファイルの内容を確認し,全てにおいて"No density violations were found."と記述されていることを確認する. - metal_density_final1_max.rpt - metal_density_final1_min.rpt - metal_density_final2_max.rpt - metal_density_final2_min.rpt - metal_density_final3.rpt ===== 8. デカップリング容量セル埋め ===== デカップリング容量セルの挿入.これも変更点は少ないが,一点ほど,制約ファイルの変更がある. ==== A. file/cdfill_soce.tcl ==== set ENCOUNTER_VERSION 8.1 set SOCE_VER 08.10-e296 set TECHNOLOGY UX8L #set DESIGN ; # Specify in the config file set inputConfig ../../database/conf/VDEC_soce.conf set inputVerilog ../04_cts/cts.v.gz set inputDef ../07_metal_fill/metalfill.def.gz set inputLef ../../database/lef/lef set inputSDC ../../database/sdc/MARIMOR2_CHIP.sdc # sdcファイルを論理合成時に出力したものに置き換える ===== 9. フィルセル埋め ===== デカップリング容量セルが挿入できなかった場所を,フィルセルで埋める. スクリプトは,変更を行う場所は無し. ===== 10. Verify ===== SOC Encounterを用いて,デザインのベリファイを行う. これもスクリプトに変更点は無し. ところが,Verify実行後に,大量のGeometry Errorが出る. 例えばこんなの. SHORT: Pin of Cell FILL_F__impl4_900865 & Blockage of Cell NECTLBUFF ( M1 ) Bounds : ( -2181.828, 904.563 ) ( -2181.795, 904.629 ) 原因不明.なんじゃこりゃ.