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 に接続されてしまったのでアンテナ違反が発生しているのだろう.このあたりはきちんとしたメモリがほしいものだ.

0 件のコメント:

コメントを投稿