2026年3月3日火曜日

IIC-OSIC環境を使ってLibreLaneを実行する:RISC-Vを動かしてみよう (2026年2月版)

前回まではチュートリアルだったので,今回は応用編として RISC-V コアを実装してみよう.使う題材は Harris&Harris の RISC-V コア,これは SystemVerilog で書かれているので,Verilog に実装しなおしてみる.

RISC-V コアの準備


主な変更点は,
・RISC-V コアとテストベンチを分離,命名ルールを simulate.sh に合わせる([回路].v,[回路]_tb.v)
・入出力ポートの定義を Verilog に変更
・logic を適切に wire に
・always_comb,always_ff を適切に変更
・一部 case 文を always から function に
・メモリのアラインメントが不親切だったので明示的にした.具体的には
rd = RAM[a[31:2]];
rd = RAM[{2'b0,a[31:2]}];
へ MSB側 をゼロ埋め.

はまったのはジャンプ命令が正しく動かなかったり,always 文で書いた組み合わせ回路のセンシティブビットの指定が不十分だったり,という点であった.Verilog 素人なので2~3日ぐらいかかった.こんなやつが授業で Verilog 教えるってマジ?

シミュレーションが正しく動くと,テストベンチでは DataAdr = 100 の時に WriteData が 25 であるか判定し,正しければ "Simulation succeeded",正しく終了しない場合は "Simulation failed" と表示される.

$ cd kvic_226007_ws25-main/verilog/tb
$ sh simulate.sh riscv_top


Yosysによる合成


src ディレクトリに移動し,yosys_stats.sh を実行してみる.
$ cd ../src
$ ln -s ../tb/riscv_top.txt # 命令メモリの中身をリンク
$ sh yosys_stats.sh riscv_top

実行するとログが出てくる.

 

まあまあな数のセルが使われている.一番大きいのはDFFベースのメモリだろう.

LibreLaneによる配置配線


実行前に変更すべきなのは config.json と pin_order.cfg.それぞれ config.json は次の通り,
 
 pin_order.cfg は次の通り変更する.
 
この地点で試しに実行してみたら,合成の地点で

 
と規定のサイズ (160 um x 100 um = 16000 um^2)を超えてしまい,

 
Utilizationでかすぎ,と失敗してしまう.なので config.json 中の面積を
0 0 160 100
から
0 0 320 300
として,合成時の Utilization が 40% 程度にしてみた.そのほかの制約は変えず,Sky130 対象に合成制約 20 ns = 50 MHz とし LibreLane を実行してみる.

$ ./run_librelane.sh

しばらく待つと処理が終わり,OpenROAD での配置配線結果が出力される.


レイアウトを見るとポートは East と West に固めたはずが他にも配置されてしまっている.DRC/LVS はパスしたが,Antenna 違反が発生していた.

 

使われたセルの統計データは次の通りであった.

 
DFF (dfxtp_1,dfrtp_1,dfrtp_2) が820個しかないのは,命令メモリが ROM になって最適化されてしまったためと思われる.おそらくゲートがVDD/VSS に接続されてしまったのでアンテナ違反が発生しているのだろう.このあたりはきちんとしたメモリがほしいものだ.

2026年3月2日月曜日

IIC-OSIC環境を使ってLibreLaneを実行する:チュートリアルを動かしてみよう (2026年2月版)

IIC-OSIC の環境を使って LibreLane による配置配線を試みる.

IIC-OSIC のインストール

基本的には土谷先生の方法でよい.

IIC-OSIC ツールの実行

基本的には公式ビデオを参考にすればよいのだが,いろいろ不完全なので補足を入れていく.

まずは Tutorial ファイルをダウンロードする.動画のスライド p17 のファイルをダウンロードする.


このとき Docker 内に最終的にファイルを置かないといけないので,Docker 内の Ubuntu でFireFox などでダウンロードするか,
C:\Users\[ユーザー名]\eda\designs
に Explorer からアクセスすると Ubuntu の起動時のディレクトリにアクセスできる.

Verilog シミュレーションと yosys による合成

verilog ディレクトリに移動する
$ cd /foss/designs/kvic_336007_ws25-main/verilog

シミュレーションは tb ディレクトリで実行する.
$ cd tb
$ sh ./simulate.sh counter

simulate.sh の引数である [回路名] に対し,verilog/src/[回路名].v,verilog/tb/[回路名]_tb.vを探し,verilator で LINT,iverilog で Verilog シミュレーション,波形ファイル生成([回路名]_tb.vcd),gtkwave で波形を表示できる.



3 bit カウンターとして動いている事を確認する.

次に合成する.src ディレクトリの yosys_stats.sh を実行する.
$ cd ../src
$ sh ./yosys_stats.sh counter

実行すると,yosys にょって
read_verilog 
proc (process をnetlistに変換)
opt (簡単な最適化)
flatten (階層展開)
techmap (テクノロジマッピング)
stat (回路の統計情報表示)
が実行される.ただしここでのテクノロジマッピングは特定のプロセスライブラリではなくyosys の持つ仮想ライブラリで合成されるようだ.

LibreLaneによる配置配線

次に LibreLane で配置配線を行う.
$ cd ../../librelane

run_librelane.sh に実行権限を与えて実行してみる.
$ chmod +x run_librelane.sh
$ ./run_librelane.sh

run_librelane.sh では,テクノロジライブラリを指定 (sky130A),LibreLane による実行,LibreLane の実行結果を OpenROAD で開く.


LibreLane の全体設定ファイルは config.json で,回路名,Verilog 記述の場所,シリコン面積,SDC などの設定,IO ピンの順番などを指定できる.
(逆に言うと,この程度しかカスタマイズの余地はないのか)

実行結果は runs/RUN_[日付]_[時間]/ 内部に処理ステップに沿って以下のように格納される.
 

最終的に出力されるものは final に格納される.
例えば最終的なGDSを見たければ runs/RUN_[日付]_[時間]/final/klayout_gds にアクセスするとよい.
$ klayout runs/RUN_2026-01-30_08-00-21/final/klayout_gds/tt_um_counter_top.klayout.gds


回路のPPA,QoR,DRC/LVSなどの統計は  runs/RUN_[日付]_[時間]/final/metrics.csv に書かれている.
$ cat runs/RUN_2026-01-30_08-00-21/final/metrics.csv