FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LiteXによるSoC環境構築を試行する (15. Litescopeによるデバッグを試行する)

LiteXでどのように波形をダンプしてデバッグすればよいかを調査していたのだが、LiteXはブリッジを通じてホストに対して情報をダンプする機能が多く備わっているらしい。 これは便利だ。 まずは、RTLシミュレーション環境:litex_simで試してみる。

各種情報を出力するために、litex_simに以下のオプションをつけてシミュレーションを開始する。

litex_sim --with-etherbone --with-analyzer --sim-debug --csr-csv csr.csv

--with-ethrboneはEthernet経由でのデバッグ用ブリッジを設定する。 --with-analyzerによって、ILA(Integrated Logic Analyzer)のような指定の波形を取得できるようになる。 --sim-debugはILA向けのCSV情報を出力するのに必要。 --csr-csvは、取得可能なCSRレジスタの一覧を出力する。

これにより、シミュレーションを行っているディレクトリに、`analyzer

次に、DUTとホストを接続するためのlitex_serverを立ち上げる。

litex_server --udp --udp-ip=192.168.1.51 --debug
[CommUDP] ip: 192.168.1.51 / port: 1234 / tcp port: 1234

--udp-ipは正直よくわからない。とりあえずマニュアルに書いてあったのでこれをつかう。

では、まずはレジスタダンプをしてみよう。litex_cliコマンドで、レジスタをダンプしてみよう。

$ litex_cli --regs
0xf0000000 : 0x00000000 analyzer_mux_value
0xf0000004 : 0x00000000 analyzer_trigger_enable
...
0xf000400c : 0x00000001 uart_ev_status
0xf0004010 : 0x00000000 uart_ev_pending
0xf0004014 : 0x00000003 uart_ev_enable
0xf0004018 : 0x00000001 uart_txempty
0xf000401c : 0x00000000 uart_rxfull

波形を取得することもできる。litescope_cliを使用してみよう。

$ litescope_cli
No trigger, immediate capture.
[running]...
[uploading]...
[====================>] 100%
[writing to dump.vcd]...

一応これでVCDファイルが取得できる。GTKWaveにインポートすれば、こんな感じで、波形として表示できる。

トリガもできるようなので、cycにトリガをかけて波形を取得してみたいと思う。

$ litescope_cli -r simsoc_ibus_cyc # Rising Edge のCYC信号をトリガにして波形を取得する。

LiteXコンソール側で、何か文字を打ち込むと波形取得が始まる。

Exact: simsoc_ibus_cyc
Rising edge: simsoc_ibus_cyc
[running]...
[uploading]...
[====================>] 100%
[writing to dump.vcd]...

これはなかなか便利だ。自作CPU環境でも使えるようにしていきたい。

LiteXによるSoC環境構築を試行する (14. 自作CPUのLiteXのインテグレーション試行)

LiteXはオープンソースのSoC構成環境なのだが、これに対して自作CPUのインテグレーションを試行してみる。

既存のシミュレーション環境に対して、以下の定義を追加して、LiteX用に改造してみる。

  • CLINT / PLICのメモリマップを定義する。
    {
        "base": "0x0200_0000",
        "size": "0x0001_0000",
        "attr": {"R": 1, "W": 1, "A": 1, "X": 0, "C": 0},
        "comment":"CLINT"
    },
    {
        "base": "0x0c00_0000",
        "size": "0x0400_0000",
        "attr": {"R": 1, "W": 1, "A": 1, "X": 0, "C": 0},
        "comment":"PLIC"
    },
diff --git a/src/litex_defines.svh b/src/litex_defines.svh
index d863281b..11461bea 100644
--- a/src/litex_defines.svh
+++ b/src/litex_defines.svh
@@ -1 +1,5 @@
 `define RV64
+`define RV_AMO (1)
+`define SIMULATION
+`define SUBSYSTEM_TOP sim.scariv_subsystem_axi_wrapper.u_scariv_subsystem
+`define NATIVE_DUMP

問題は、uart_write()の部分で引っかかっているようだ。 書き込みをした後、割り込みが発生するようにしてほしい、という訳だ。 どうもこれが動作していない。

RISC-Vの高性能アウト・オブ・オーダCPU XiangShanについての資料を読む (7. KunmingHuのビルドと試行)

HPCA2024で開催された、RISC-Vのアウト・オブ・オーダCPU XiangShanについての資料が公開されていたので、読んでみることにした。 じっくり読みたいので、1ページずつ要点を抑えていく。

実際のGitHubリポジトリをダウンロードして、いろいろ試してみようと思う。

xiangshan-doc.readthedocs.io


  • Gitリポジトリのダウンロード:

以下で、build/XSTop.vにChiselから生成されたVerilogが生成される。

git clone https://github.com/OpenXiangShan/XiangShan.git --recurse-submodules
cd XiangShan
make verilog

ちなみに、ドキュメントに書いてある通りの以下のコマンドだと落ちてしまった。

make emu CONFIG=MinimalConfig MFC=1 -j$(nproc)
[warn]       intrGenRegs(randomPosition(5)) := intrReg(randomPosition(5)) | UIntToOH(randomPosition(4, 0))
[warn]                  ^
[warn] There were 63 warning(s) during hardware elaboration.
Exception in thread "main" java.util.NoSuchElementException: NOOP_HOME
        at ... ()
...
        at logger.Logger$.$anonfun$makeScope$4(Logger.scala:148)
        at scala.util.DynamicVariable.withValue(DynamicVariable.scala:59)
        at logger.Logger$.makeScope(Logger.scala:146)
        at logger.Logger$.makeScope(Logger.scala:133)
        at ... ()
        at ... (Stack trace trimmed to user code only. Rerun with --full-stacktrace to see the full stack trace)
1 targets failed
xiangshan[chisel].test.runMain subprocess failed
make: *** [Makefile:133: build/rtl/SimTop.v] Error 1

ブランチをkunminghuに変更してみたが、それでもだめだった。

git checkout kunminghu
git submodule update --init --recursive
make emu CONFIG=MinimalConfig MFC=1 -j$(nproc)

一応、MFC=1だけ(MLIRを使用する)では、ビルドしてVerilogファイルを生成できるようだ。

make MFC=1 -j$(nproc) 

もうちょっとマニュアルをまじめに見ながらやってみる。

git clone https://github.com/OpenXiangShan/NEMU.git
cd NEMU
export NEMU_HOME=${PWD}
cd ..
git clone https://github.com/OpenXiangShan/nexus-am.git
cd nexus-am
export AM_HOME=${PWD}
cd XiangShan
export NOOP_HOME=${PWD}
make emu CONFIG=MinimalConfig MFC=1 -j$(nproc)

パッケージのインストールが必要だ:

make[3]: Entering directory '/home/msyksphinz/work/riscv/xiangshan/XiangShan/build/emu-compile'   
In file included from /home/msyksphinz/work/riscv/xiangshan/XiangShan/build/chisel_db.cpp:2:                                                                                                     
/home/msyksphinz/work/riscv/xiangshan/XiangShan/build/chisel_db.h:12:10: fatal error: sqlite3.h: No such file or directory
   12 | #include <sqlite3.h>                                                                  
      |          ^~~~~~~~~~~                                                                                                                                                                 
compilation terminated.                                                                                                                                                                      
make[3]: *** [VSimTop.mk:94: chisel_db.o] Error 1                                                                                                                                            
make[3]: *** Waiting for unfinished jobs....                                                                                                                                                 
In file included from /home/msyksphinz/work/riscv/xiangshan/XiangShan/difftest/src/test/csrc/common/compress.cpp:17:                                                                             
/home/msyksphinz/work/riscv/xiangshan/XiangShan/difftest/src/test/csrc/common/compress.h:26:10: fatal error: zstd.h: No such file or directory                                                   
   26 | #include <zstd.h>                                                                                                                                                                    
      |          ^~~~~~~~                                                                                                                                                                    
compilation terminated.                                                                       
make[3]: *** [VSimTop.mk:104: compress.o] Error 1                                                                                                                                            
In file included from /home/msyksphinz/work/riscv/xiangshan/XiangShan/difftest/src/test/csrc/common/ram.cpp:22:
/home/msyksphinz/work/riscv/xiangshan/XiangShan/difftest/src/test/csrc/common/compress.h:26:10: fatal error: zstd.h: No such file or directory                                                   
   26 | #include <zstd.h>                                                                                                                                                                    
      |          ^~~~~~~~                                                                     
compilation terminated.                                                                       
make[3]: *** [VSimTop.mk:124: ram.o] Error 1                                                                                                                                                 
make[3]: Leaving directory '/home/msyksphinz/work/riscv/xiangshan/XiangShan/build/emu-compile'    
make[2]: *** [verilator.mk:140: build_emu_local] Error 2                                      
make[2]: Leaving directory '/home/msyksphinz/work/riscv/xiangshan/XiangShan/difftest'                                                                                                            
make[1]: *** [verilator.mk:144: /home/msyksphinz/work/riscv/xiangshan/XiangShan/build/emu] Error 2                                                                                               
make[1]: Leaving directory '/home/msyksphinz/work/riscv/xiangshan/XiangShan/difftest'             
make: *** [Makefile:179: emu] Error 2                                                                                                                                                        
sudo apt install libsqlite3-dev libzstd-dev

で、やり直し。すると、うまくいったようだ。なにやらVerilatorのビルドが走り始めた。結構時間がかかるようだ。

Coremarkも試してみる。

The image is /home/msyksphinz/work/riscv/xiangshan/nexus-am/apps/coremark/build/coremark-riscv64-xs.bin
Running CoreMark for 10 iterations
2K performance run parameters for coremark.
CoreMark Size    : 666
Total time (ms)  : 21663
Iterations       : 10
Compiler version : GCC13.1.0
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0xfcaf
Finished in 21663 ms.
==================================================
CoreMark Iterations/Sec 461

RISC-Vの高性能アウト・オブ・オーダCPU XiangShanについての資料を読む (6. Kuminghuのマイクロアーキテクチャ続き)

HPCA2024で開催された、RISC-Vのアウト・オブ・オーダCPU XiangShanについての資料が公開されていたので、読んでみることにした。 じっくり読みたいので、1ページずつ要点を抑えていく。

次は、マイクロアーキテクチャのトピックについて。続き。

xiangshan-doc.readthedocs.io


  • フロントエンドのアップデート
    • フェッチ・予測の幅を増強
    • ミス率の低減
    • 高周波数化
  • TAGEの予測器の性能向上
    • Branch Historyのハッシュ化
    • テーブルと履歴長の調整
  • L2 Fetch Target Buffer (FTB)のアップデート
    • FTBは要するにBTBのこと。
    • 4KBのL2 FTBを実装。
    • FTBP というのは L1 & L2 の中間バッファのこと。
  • 命令キャッシュのプリフェッチャのアップデート
    • フロントエンドが分離されたので、FDIPのプリフェッチアルゴリズムを実装。
    • PFキューからプリフェッチリクエストを選択
    • プリフェッチバッファにリフィルデータを書き込む。
    • 命令キャッシュとプリフェッチバッファの検索を並列に行う。
  • バックエンドパイプラインの改良
    • 発行後にレジスタを読み込むように変更
      • リザベーションステーションの回路量を削減するという目的がある。
      • レジスタファイルを読み込むための効率的なアービタを実装する。
      • 投機的なウェイクアップとキャンセルを実装する。
    • uopのコミットとリダイレクトを高速化
      • リネームバッファ(RAB)を実装し、レジスタファイルの変更履歴を記録する。
        • リネームバッファにレジスタファイルのマッピング情報を記録する。
        • 命令がコミット・リダイレクトすると、RABをウェイクアップする
        • RABはリネームテーブルをアップデートする責任を持つ
      • 利点
        • ROBのリリースを高速化する
        • タイミングを最適化する
        • Vector命令のuopへの分割をサポートする
        • ROBを圧縮する
    • ベクトルパイプラインを実装
      • VLEN=128のベクトル命令をサポート
      • デコード・ディスパッチ・アウトオブオーダ実行を共有
  • ロードステアユニットのアップデート
    • L1D SRAMの消費電力を削減するため、ウェイ予測を導入する
    • ロードストアのバンド幅を向上させるため、ハイブリッド・ロード・ストアユニットを導入する
    • L1Dプリフェッチを導入する
      • StreamプリフェッチャとStrideプリフェッチャを導入する
    • ロードキューのタイミングを向上させるため、ロードキューを分割する
      • ロードキューを状況に応じて分割して割り当てる
        • ライトバック後に仮想ロードキューから順番にリタイアすることができる
    • TLBのタイミング向上のため、L1/L2 TLBを再デザインする

RISC-Vの高性能アウト・オブ・オーダCPU XiangShanについての資料を読む (5. Kuminghuのマイクロアーキテクチャ)

HPCA2024で開催された、RISC-Vのアウト・オブ・オーダCPU XiangShanについての資料が公開されていたので、読んでみることにした。 じっくり読みたいので、1ページずつ要点を抑えていく。

次は、マイクロアーキテクチャのトピックについて。続き。

xiangshan-doc.readthedocs.io


  • 実装はハードウェア記述言語Chiselで行っている。
    • いくつかの高性能ユーティリティを実装した。
  • 性能カウンタを搭載し、性能を簡単に測定できるようにする。
  • KunmingHu : 第3世代のマイクロアーキテクチャ
    • Beijing Institute of Open Source Chip (BOSC) と共同で開発
    • RISC-V Vector Extension 1.0をサポート
    • RISC-V ハイパーバイザをサポート
    • ループ予測器、ループバッファをサポート
    • 命令キュー・実行ユニット・ロードストアユニットをリファクタリング
    • L1Dプリフェッチャを実装
    • AMBA CHI互換
  • KunmingHu の性能見積もり
    • Simpointによりチェックポイントを測定。
    • 3GHzで44.98のスコアを想定。

RISC-Vの高性能アウト・オブ・オーダCPU XiangShanについての資料を読む (4. Microarchitecture Design and Implementation)

HPCA2024で開催された、RISC-Vのアウト・オブ・オーダCPU XiangShanについての資料が公開されていたので、読んでみることにした。 じっくり読みたいので、1ページずつ要点を抑えていく。

次は、マイクロアーキテクチャのトピックについて。続き。

xiangshan-doc.readthedocs.io


  • バックエンドの構成
  • 命令フュージョン
    • 隣接しているuOPsを結合する。
    • RV64GCとRV64GC-Fusedで4%の命令削減、RV64GCBからRV64GCB-Fusedで2%の命令削減。
  • Rename & Move Elimination
    • 単純なmove命令は、リネームマップの差し替えにより実現する。
  • Reservation Stationの構成
    • 2-input & 2-output / 1-input & 1-outputの構成
    • Age Matrixベースの命令選択
  • FPUの構成
    • IEEE 754互換の浮動小数点実行ハードウェア
  • FPUはCascade FMAを実装。
    • FADDのDelayは5サイクルから3サイクルに削減。
  • MMUの構成
    • STLB向けにNext Line Prefetcherを実装
    • Page Table Walkを並列実行
    • PMP / PMAをサポート
  • メモリ・アクセスのブロック
    • ロードパイプラインは2本用意
    • LDヒットレイテンシ:4サイクル
    • ストアアドレスパイプライン:2
    • ストアデータパイプライン:2
    • ストアデータのバンド幅 : 2x8B/cycle
    • マージバッファ:16キャッシュライン
  • ロード・パイプライン
    • 4ステージ構成
  • L1 Dキャッシュ
    • ライトバック・キューはどういう仕組みだろう?
  • L1 Dキャッシュ
    • バンクを分割し、複数リードポートを持っている。

RISC-Vの高性能アウト・オブ・オーダCPU XiangShanについての資料を読む (3. Microarchitecture Design and Implemenation)

HPCA2024で開催された、RISC-Vのアウト・オブ・オーダCPU XiangShanについての資料が公開されていたので、読んでみることにした。 じっくり読みたいので、1ページずつ要点を抑えていく。

次は、マイクロアーキテクチャのトピックについて。

xiangshan-doc.readthedocs.io


XiangShanには3つの世代がある。

  • YQH : 28nm でテープアウトし1.3GHz。性能的にはSPEC CPU2006 7.01 @1GHz
  • NH : 14nmでテープアウトし2.0GHz。性能的にはSPEC CPU2006 20 @2GHz
  • KMH : Vector拡張とハイパーバイザー拡張を実装。
  • まずは第1世代のYQHについて。
    • 11ステージの6命令デコード・リネーム
    • TAGE-SC-Lの分岐予測器を実装
    • 整数物理レジスタ160エントリ、浮動小数点物理レジスタ160エントリ
    • 192エントリのROB、64エントリのLQ、48エントリのSQ
    • 各機能ユニットには16エントリのRS
    • 16KBのL1命令キャッシュ、128KBのL1plus命令キャッシュ
    • 32KBのL1データキャッシュ
    • 32エントリのITLB / DTLB, 4KエントリのSTLB
    • 1MBのインクルーシブ・L2キャッシュ
  • YQHのマイクロアーキテクチャ(パイプライン)
    • ディスパッチするときにレジスタを読むスタイル。14Read / 8Write
    • 最大コミット数は6命令/1サイクル
  • 第2世代、NHのアーキテクチャ
    • 整数物理レジスタ196エントリ、浮動小数点物理レジスタ192エントリに増強
    • ROBは256エントリに増強、80エントリのLQ、64エントリのSQに増強
    • 算術演算ユニットは各32エントリのRS
    • 64KBのL1命令キャッシュ
    • 64KBのL1データキャッシュ
    • 80エントリのDTLB、32エントリのITLB、2KエントリのSTLB
    • 1MBのノン・インクルーシブL2キャッシュ
    • 6MBのノン・インクルーシブL3キャッシュ
  • NHのフロントエンド
    • フロントエンドをProducerとConsumerに分離。
      • Producer : 分岐予測ユニット
      • Consumer : 命令フェッチユニット
  • 分岐予測について
    • 3ステージの分岐予測
      • ステージ1: uBTB
      • ステージ2: FTB + TAGE (FTB : Fetch Target Bufferのこと)
      • ステージ3: SC + ITAGE + RAS (SCは良く分からないが、Statistical Correctorのこと?)
  • 命令キャッシュ
    • 64KBの4-way VIPTブロッキングキャッシュ
    • TileLinkをサポート
    • PLRUのリプレースメント