はじめに
昨日は、make test で実行した結果を klayout で見るところまででした。
今日は、OpenLaneの出力を見ていきます。
OpenLane Output
OpenLane の出力は、ここ に説明があります。
説明のために、出力されたディレクトリ構造部分を引用します。
designs/<design_name> ├── config.tcl ├── runs │ ├── <tag> │ │ ├── config.tcl │ │ ├── {logs, reports, tmp} │ │ │ ├── cts │ │ │ ├── finishing │ │ │ ├── floorplan │ │ │ ├── placement │ │ │ ├── routing │ │ │ └── synthesis │ │ ├── results │ │ │ ├── final │ │ │ ├── cts │ │ │ ├── finishing │ │ │ ├── floorplan │ │ │ ├── placement │ │ │ ├── routing │ │ │ └── synthesis
spm の内容を見てみます。designs/spm の下です。runs ディレクトリは、make test を実行したことにより生成されたものです。"make clean_runs" で削除できます。
├── config.json ├── config.tcl ├── pin_order.cfg ├── runs │ ├── openlane_test │ │ ├── OPENLANE_VERSION │ │ ├── PDK_SOURCES │ │ ├── cmds.log │ │ ├── config.tcl │ │ ├── flow_summary.log │ │ ├── logs │ │ │ ├── cts │ │ │ ├── finishing │ │ │ ├── floorplan │ │ │ ├── placement │ │ │ ├── routing │ │ │ └── synthesis │ │ ├── reports │ │ │ ├── cts │ │ │ ├── final_summary_report.csv │ │ │ ├── finishing │ │ │ ├── floorplan │ │ │ ├── manufacturability_report.rpt │ │ │ ├── placement │ │ │ ├── routing │ │ │ └── synthesis │ │ ├── results │ │ │ ├── cts │ │ │ ├── final │ │ │ ├── finishing │ │ │ ├── floorplan │ │ │ ├── placement │ │ │ ├── routing │ │ │ └── synthesis │ │ ├── runtime.yaml │ │ ├── tmp │ │ │ ├── cts │ │ │ ├── finishing │ │ │ ├── floorplan │ │ │ ├── placement │ │ │ ├── routing │ │ │ └── synthesis ├── sky130A_sky130_fd_sc_hd_config.tcl ├── sky130A_sky130_fd_sc_hdll_config.tcl ├── sky130A_sky130_fd_sc_hs_config.tcl ├── sky130A_sky130_fd_sc_ls_config.tcl ├── sky130A_sky130_fd_sc_ms_config.tcl ├── src │ ├── spm.sdc │ ├── spm.v
Flow configuration
OpenLane には、Flow configuration というのがあって、
- PDK / technoogy specific
- Flow specific
- Design specific
の順で configuration を行うようです。
PDK / technology specific
PDK に関しては、
$PDK_ROOT/$PDK/config.tcl
で configuration を行っています。また、PDK の中では、
$PDK_ROOT/$PDK/$STD_CELL_LIBRARY/config.tcl
でも configuraion を行います。
Flow specific
./configuration ディレクトリの下にある各ファイル (拡張子 .tcl) の中で configuration を行っています。
Design specific
最後に、Design固有の configuration を
./design/<design>/config.tcl
で 行います。
詳細は、Designs, Their Configuration, useful utilties: に書いてあります。
上記の "make test" での spm の config.tcl は、下記のような内容になっています。
- DESIGN_NAME に デザイン名 : spm を設定している
- VERILOG_FILES に Verilog HDL のファイル名 : "./designs/spm/src/*.v" を設定している
- CLOCK_PERIOD に クロックの周期 :10.000 を設定している
- CLOCK_PORT にクロックのポート名 : clk を設定している
- CELL_PAD に 4 を設定している
最後に、PDK の STD_CELL_LIBRARY の config.tcl をsource にて読み込んでいます。
# Design set ::env(DESIGN_NAME) "spm" set ::env(VERILOG_FILES) [glob ./designs/spm/src/*.v] set ::env(CLOCK_PERIOD) "10.000" set ::env(CLOCK_PORT) "clk" set ::env(CELL_PAD) 4 # set ::env(FP_PIN_ORDER_CFG) $::env(OPENLANE_ROOT)/designs/spm/pin_order.cfg set filename ./designs/$::env(DESIGN_NAME)/$::env(PDK)_$::env(STD_CELL_LIBRARY)_config.tcl if { [file exists $filename] == 1} { source $filename }
上記のファイルの中から
- config.tcl
- pin_order.cfg
- src/spm.v
- sky130A_sky130_fd_sc_hd_config.tcl (PDKは、sky130A、STD_CELL_LIBRARY は、sky130_fd_sc_hd に設定されているので)
が使われているのがわかりました
- src/spm.sdc
は使われていませんが、中を覗いてみると、下記のようになっています。
set_units -time ns create_clock [get_ports clk] -name core_clock -period 10
これは、config.tcl 内の
set ::env(CLOCK_PERIOD) "10.000" set ::env(CLOCK_PORT) "clk"
に対応するのだと思います。
おわりに
やっぱり、tcl を使っているようですね。。。。今も tcl 使っているのって、EDA業界ぐらいだと思います。