編集履歴一覧に戻る
sanguisorbaのアイコン画像

sanguisorba が 2022年12月17日00時00分42秒 に編集

初版

タイトルの変更

+

Skywater 130nm用LSI開発ツールをUbuntu WSLに入れてみる

タグの変更

+

skywater

記事種類の変更

+

セットアップや使用方法

ライセンスの変更

+

(MIT) The MIT License

本文の変更

+

本記事は”慶應理工 Advent Calendar 2022” 17日目の記事です。 https://adventar.org/calendars/7773 2020年、Googleの後押しでSkywater社130nmプロセスのPDKが無償利用可能かつオープンソースで公開されました。 しかも条件はありますがefablessというサービスを利用すると無料でチップを作ってくれるらしいです。 しかもPDKで指定されたツールは有料のものではなく、どれも無料かつオープンソースのもので構成されています。 今回は最もハードルが高いであろう各種EDAツールの導入をUbuntu WSL上で全部やります。 ## インストール ### 入れるもの インストール用スクリプト+コンフィグデータをGithubに用意いたしました。 iic-osicというレポジトリをUbuntu WSL用にアレンジしたものです。 https://github.com/sanguisorba/iic-osic-wsl iic-osicというレポジトリでインストールされるツール * OpenLane * Icarus Verilog (`iverilog`) * Verilator (`verilator`) * GTKWave (`gtkwave`) * Xschem (`xschem`) * ngspice (`ngspice`; xschemから呼び出される) * gaw3 (`gaw`; xschemから呼び出される) * Magic (`magic`) * Netgen (`netgen`) に独自で * Docker (WSL用にセットアップを行う。OpenLaneで必要) * kLayout (`klayout`) * kLayoutの自分用コンフィグデータ を加えたものです。 ### 動作環境 WSL 2 + Ubuntu 22.04.01 LTS の組み合わせで動く事を確認しています。 それ以外のUbuntu環境(仮想環境や実機など)ではiic-osic-setup.shのDocker周りとxschem-gawのgettextバージョン指定を変える必要があります。 あと全部インストールするので最低でも16GBの空き容量とそれなりに快適な回線も必要です。 ### インストール方法 まずWSL 2とUbuntuをインストールしてください。これは外部サイトが詳しいです。 Ubuntuのアカウントセットアップ後、以下の3行を実行してください。 ``` git clone https://github.com/sanguisorba/iic-osic-wsl.git cd iic-osic-wsl ./iic-osic-setup.sh ``` 終わったらWSLを再起動していただければOKです。(wsl --shutdownではなく、ターミナルを閉じてもう一度開くだけで良いです) WSL2 + Ubuntu 22.04 LTS 以外で使用する場合はDocker周辺を別途セットアップしてください。(Openlaneを使用しない場合は不要) その後、iic-osic-setup.shを参考に手動でセットアップしてください。以下注意事項です。 * バージョン指定でpython3.10-venvが要る。執筆段階でpython3.11-venvはだめだった。 * ngspiceのバージョンは最新版にしないと古いアーカイブはダウンロードできなくなる。 * ↑klayoutも同様。 * xschem-gawはgettextのバージョンをpo/Makefile.in.inで指定する必要がある。 Ubuntu WSLの場合は執筆段階で0.20なのでsedで書き換えている。 ## 各種ツール起動方法 ### xschem 回路図エディタ netlist生成、ngspiceシミュレータ、gawプロッタをGUIから起動できます。 プロッタが起動しない場合は、~/src/xschem-gaw/po/Makefile.in.in のGETTEXT_MACRO_VERSIONを確認後、 READMEに沿ってmake , install してください。 ``` $ xschem ``` 執筆時点でRTL設計をインポートする部分(decred_hash_macroフォルダ)がインストールされない事を確認しています。 OpenlaneレポジトリであらかじめコンパイルされたPDKを導入しているのですが、この中にもともと入っていないようです。 気になるのであればこちらから手動でPDKのフォルダに入れてください。 https://github.com/StefanSchippers/xschem_sky130 手動でSkywater 130nmのPDKをコンパイルする事も可能ですが、Skywater 130nmの場合65GBくらい容量を食います。 https://github.com/RTimothyEdwards/open_pdks ### klayout レイアウトエディタ 本家iic-osicには無いのですが、個人的に使いたいので入れています。 私が普段使っているコンフィグも入れています。 不要な場合は~/.klayoutを全て削除してください。 ``` $ klayout ``` ### magic レイアウトエディタ あまり使わないのでよくわかりません。 ``` $ magic ``` ### Openlane デジタル設計フロー。 使ったことないのでわかりませんが、再起動後、make testが通る事まで確認してます。 ``` $ cd ~/OpenLane $ sudo service docker start ←サービスは自動で起動しないので手動で起動してください $ make test (ログが流れるが、最後に Basic test passed と出ればOK) $ klayout ~/OpenLane/designs/spm/runs/openlane_test/results/final/gds/spm.gds ``` ## ツールの使い方が書かれた参考リンク SkyWater 130 nm フルカスタム設計への道 https://note.com/akira_tsuchiya/m/m7877b0dd1dbe xschem, klayoutを使用したアナログ回路設計について書かれています。 OpenLane & SkyWater PDKで無料の半導体設計環境 https://take6shin-tech-diary.com/openlane-skywater/ Openlaneを使用したデジタル設計フローについて書かれています。 本当は各種ツールの使い方まで書きたかったのですが、忙しくて間に合いませんでした。 ## おまけ:xschemの使い方 書きかけです。 ### 主な操作方法 Esc - 選択解除 Shift + I - シンボルの配置 Q - プロパティ編集 W - 配線 F - 画面いっぱいにズーム ズームはマウスカーソルで行う C - コピー M - 移動 Ctrl + S - 上書き保存 Ctrl + Shift + S - 名前を付けて保存 ### 起動方法 ``` $ xschem ``` と打つとtop.schが表示されます。 ![キャプションを入力できます](https://camo.elchika.com/75feec96dcb818f01f3ce6863f305ac6879ae481/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f61396661356263392d336531372d343464652d613931362d663633363031613935633031/) top.schの右のタブの+をクリックすると新しい回路図を作成できます。 まず、Shift+Iキーを押してChoose Symbol画面を開きます ![キャプションを入力できます](https://camo.elchika.com/41345b0591e088070e869c5f138317a0ca4bec21/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f61393330323836322d633062332d346264642d616164392d623266633433356266346363/) それぞれ以下のものが入っています。 * `/usr/local/share/xschem/xschem_library/devices` - シミュレーションに必要なpinや電源シンボルなど * `/home/user` - 保存した回路図・シンボルを参照する際に便利 * `/home/user/pdk/sky130A/libs.tech/xschem/sky130_fd_pr` - トランジスタ、抵抗、キャパシタ * `/home/user/pdk/sky130A/libs.tech/xschem/sky130_stdcells` - デジタル設計で使用するスタンダードセル(製作済のNANDやインバータなど) * `/home/user/pdk/sky130A/libs.tech/xschem/stdcells` - 同上 * `/home/user/pdk/sky130A/libs.tech/xschem/sky130_tests` - 製作例、examples 今回は`/home/user/pdk/sky130A/libs.tech/xschem/sky130_fd_pr`の`nfet_01v8.sym`と`pfet_01v8.sym`を使ってインバータを製作します。とりあえずシンボルを選択して配置してみましょう。 ![配置をしてみた](https://camo.elchika.com/2bf1a894e1958dd9d4020521bb859e9b2d337bdd/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f33633965343930342d383037342d346264362d396233642d646336363338393531666636/) そしたら素子をクリックしてQキーを押します。するとEdit Propertiesの画面が開きます。 トランジスタの長さLと幅Wはここで記述します。とりあえずL=0.18, W=2にしてOKとします。これをPとN両方で適用します。 ![キャプションを入力できます](https://camo.elchika.com/c49b71f515ad54a69dc9fb7a54fe3eed687c22d6/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f66313765666636322d333132652d343833342d616564332d633830326261343736633631/) ![PのWはもっと大きくてもいい](https://camo.elchika.com/c55c2d65482e929101c11828b6821fde982c25dd/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f39343839333231352d306461312d343938362d623139382d303432336138333965306466/) 次に配線をします。配線は始点にカーソルを合わせてWキーを押すとできます。曲がる際は曲がる角でWキーを押し、終点でクリックをすると終わります。 移動は素子をクリック、またはドラッグで範囲指定した後にMキーを押すとできます。移動する場所にカーソルを持って行きクリックすればOKです。 ![キャプションを入力できます](https://camo.elchika.com/2090e13f5a53c105983912dbb3603e0755912ba0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f38373036656565632d313461382d343836302d383566312d356331303063393866373165/) 次にピンを配置します。Shift+IでChoose Symbol画面を開き、`/usr/local/share/xschem/xschem_library/devices`を開きます。 前のフォルダに戻る際はファイル一覧で`..`をクリックするか、左下のUpをクリックします。Homeを押して初期フォルダに戻る事でも選択可能です。 pinは入力の`ipin`, 出力の`opin`、入出力の`iopin`の3つを主に使います。面倒であれば全部`iopin`でも問題ありませんが、今回は`ipin`と`opin`1つを配置します。 電源ピンは`vdd`と`gnd`を配置します。`vdd`は`ipin`,`iopin`でも代用できますが、`gnd`はシミュレーションの際に特別な扱いをされるので必ずグラウンドは`gnd`で配置します。 配線するとこんな感じ。 ![キャプションを入力できます](https://camo.elchika.com/b96d620cc0c5ffb99c575c81a80bab042d402d28/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f32643166663365642d303765622d346234392d396664332d313563333636643834323137/) ピンの名前はピンを選択してQキーでEdit Properties画面を開き、`lab=`以降を編集することで指定できます。 ![キャプションを入力できます](https://camo.elchika.com/58a209bfb1260d250242421e6c3044b1add12219/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f35313233333362352d616366372d343535342d616561332d356262356332326636323837/) 次にシミュレーション用の電源を配置します。電源シンボルを配置する方法もありますが、今回はスクリプトで直接指定します。 まずShift+IキーでChoose Symbol画面を開き、code_shown.symを配置します。 ![キャプションを入力できます](https://camo.elchika.com/dd6fc891d09492dc6e1c8cc487022fdd26070911/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f37373130316638302d303832392d346462372d383337632d323162313030333439343236/) 配置された`blabla`を選択してQキーを押してEdit Properties画面を開きます。今回は以下のように書きます。 ![キャプションを入力できます](https://camo.elchika.com/6835012f8109586ea85b2f1faaad5b8727cb2d3b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f64353765313438392d323963312d346433342d383233352d326235356564303761306665/) ``` name=ngspice only_toplevel=false value="va a 0 pulse(0 1.8 5n 1p 1p 5n 10n) dc 0 vvdd VDD 0 dc 1.8 .control save all tran 1p 30n write "test_inv.raw" .endc" ``` 書式 ``` va a 0 pulse(0 1.8 5n 1p 1p 5n 10n) dc 0 vvdd VDD 0 dc 1.8 [電源の名前] [正極側のピン] [負極側のピン] [電源 (DCなら dc [電圧] みたいな感じで記述する) ] グラウンドはネットリストではGNDではなく数字の0で記述されます。 パルスや正弦波などの書式についてはngspiceのマニュアルをご参照ください。 .control save all tran 1p 30n write "test_inv.raw" .endc このブロックはシミュレータへのパラメータを指定しています。gawで読み込むためにデータを全部.rawを書くことと、トランジェント解析を行うという記述がされています。その他の解析 (AC解析など)はngspiceのマニュアルをご参照ください。 ``` 最後にシミュレーション用のモデルを配置します。top.schに戻り、TT_MODELSという表記のランチャーをクリックで選択します。選択した状態でCキーを押すとコピーできるので、これを自分の回路図の適当なところに配置します。 ![キャプションを入力できます](https://camo.elchika.com/033780a1eeeb7a04b6099e0f0dd4b74b2d765206/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f34376166626234652d613939622d343731622d623839662d373132373939346364653861/) 最終的にこんな回路図ができあがりました。 ![キャプションを入力できます](https://camo.elchika.com/bccf5e2e6103c6cc58613c3c425066b46d24f2ec/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f34623130646138662d633131612d346264302d386662662d663162303430393432383731/) 折角なので回路図を保存してみましょう。Escキーを押して何も選択していない状態にし、Ctrl+Shift+Sキーを押すと保存先を尋ねられます。スクリプトで書いた`test_inv.raw`と同じファイル名が望ましいので、ファイル名を`test_inv.sch`として保存します。 ![キャプションを入力できます](https://camo.elchika.com/df3296081c6cb549b775958cc3c26a7f6860b23a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f63313531663535622d316339302d346566372d386139612d646133613335613963363136/) そしたらシミュレーションしてみましょう。 まず右上のNetlistを押し(何もアクションがなければ正常に出力されてます。何か出てきた時はエラーが起きているのでスクリプトを見直してください)、Simulateを押してシミュレーションを実行します。`binary raw file`というメッセージで終了すれば正常にシミュレーションができているので`exit`と打って終わってください。 ![キャプションを入力できます](https://camo.elchika.com/63f3417e216495536d692d00ee39e0a726d77bda/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f64376232663831322d643962372d343334652d393132652d643864316231643336343234/) そしたらWavesをクリックしてgawを起動します。.rawと.schが同じファイル名であれば自動的に波形を選択する画面が出てきます。 対象の波形をプロットエリア (Panel)へドラッグで移動させると波形が表示されます。 ![キャプションを入力できます](https://camo.elchika.com/225ffff1ff7c75693fc57e0d2ad51fa6c8275b32/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f64666135333863392d653866652d346334362d393433622d653163666437616461613538/) ![キャプションを入力できます](https://camo.elchika.com/ec9941339238fcbc9531776e53831f00a4bf0b40/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f31333961353431392d353234642d343333332d393330372d643862363066376164306534/) ちなみに簡易的なプロッタであればngspiceでも表示できます。シミュレーション実行後、 ``` plot v(a) v(x) ``` と打つことで表示できます。 ![キャプションを入力できます](https://camo.elchika.com/bc3646d983b6addc42550ce2482ebbddb6e2ebfa/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38303034383535362d663062322d343030302d616334642d3266373330643761393339392f61373238343836382d623136342d343732642d623239662d643233316434636634343635/) 他にもシンボルを作成して回路図の階層化をしたりコーナーシミュレーションを行うことも可能ですが、とりあえずこんなもので。