Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

OpenLaneを覗いてみた(その2)

はじめに

昨日は、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業界ぐらいだと思います。