FPGA開発日記

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

2022-01-01から1年間の記事一覧

サイクル精度シミュレータSniperにRISC-Vのベクトル命令の情報を追加する

サイクル精度シミュレータSniperは、トレースファイルをベースとしたサイクル精度解析シミュレータだ。 RISC-Vのサポートにおいては、SpikeからSIFTファイルを生成し、それをSniperに加えることでサイクル計算を行う。 これだけだとSniper側にRISC-Vのデコー…

RISC-VのLinuxブート環境をbuildrootで構築する (8. カーネル用メモリ領域の結合)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 Spikeのシミュレーション環境を見ると、OpenSBIによってブート処理が始まった後、Linuxカーネルを0x8020_0000に展開してからブート処理がスタートするようだ。 カーネルイメージ…

riscv-isa-simに外部デバイスプラグインを導入する方法 (2. 外部プログラムでlibriscv.aを活用する方法)

前回、Spikeシミュレータで外部デバイスのライブラリを動的ロードする方法が分かったので、これを自作CPUのシミュレーション環境に導入することを考える。 自分はSpikeを取り込んだ単体でELFファイルをシミュレーションする環境を作っているのだが、これに対…

RISC-VのLinuxブート環境をbuildrootで構築する (7. シリアルデバイスの結合)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 Buildrootで必要なシリアルデバイスを用意して、Spikeシミュレーションで一致検証ができるようにした。 C++側のシリアルデバイスのモデルを作成して、Spikeに動的ライブラリとし…

riscv-isa-simに外部デバイスプラグインを導入する方法

riscv-isa-sim(いわゆるspikeシミュレータ)は便利なツールだが、例えば外部デバイスとして任意の場所に自作のデバイスを追加することができる。 例えば、自分の場合だと0x5400_0000に自作のシリアルデバイスを追加したい場合はどうするか。いろいろ情報は少…

Sniperの動作原理をトレースする (5. SpikeによるSIFTデータ生成のデバッグ)

SniperにRISC-Vのベンチマークを実行させたくて、マイクロベンチマークをSpike上でシミュレーションしSIFTを生成する試行をしている。 SIFTの生成時にどうもSpikeがハングしてしまうか、予期しない動作をしてしまい様子がおかしい。 どうもみてみると、SIFT…

自作RISC-V CPUコアで構成を変えながら性能を測定していく (5. Coremarkの試行)

自作RISC-V CPUコアの方は、いくつかの実装の変更を行って性能がかなり伸びるようになった。 Coremarkの環境を構築して測定できるようにしておく。最大構成ではコンパイルに時間がかかるので、4種類の構成で性能を測定した。 あとはRV64に限定している。ITER…

rvv-intrinsic-docのテストケースをコンパイルして、シミュレーションする環境を構築する

RISC-Vのベクトルテストケースを試したくて、簡単なテストを探している。rvv-intrinsic-doc をチェックしている。 https://github.com/riscv-non-isa/rvv-intrinsic-doc テストケースを試すためには、intrinsicをサポートしたGNU Toolchainを構築しなければ…

自作RISC-V CPUコアで構成を変えながら性能を測定していく (4. Dhrystone再測定)

自作RISC-V CPUコアの方は、いくつかの実装の変更を行って性能がかなり伸びるようになった。 GShareの実装 LDQ/STQのスケジューリングの調整 フラッシュ信号の最適化 Dhrystoneのコンパイルオプション最適化 いろいろ頑張った結果、Standardコンフィグレーシ…

Sniperの動作原理をトレースする (4. RISC-V Decoderの解析)

SniperでRISC-Vのベクトル命令をサポートするために、RISC-Vデコーダについて解析する。 SniperのRISC-Vデコーダは、RV8をベースとしている。RV8のデコーダに情報を追加していく。 https://github.com/michaeljclark/rv8 命令の追加 (meta/opcodes) # RVV (a…

RISC-VのLinuxブート環境をbuildrootで構築する (6. Read Modify Writeの修正とブートシーケンスデバッグ)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 Read Modify Writeについていくつかの修正を加えたのと、LR/SCについて簡単な実装を行った。 LR/SCはどちらも最も古い命令になってから実行する、投機的実行をしない方式で実行し…

RISC-VのLinuxブート環境をbuildrootで構築する (5. ブートシーケンスデバッグ)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 いくつかの基本的な機能が整ったので、Linuxの起動を試行しながらデバッグをしている。 Spikeとの実装を合わせるために、TIME CSRレジスタの実装を削除した。これはメモリマップ…

Sniperの動作原理をトレースする (3. Performance Modelの解析)

Sniperのログを見ながら、Sniperのサイクル計算モデルを検証してみようと思う。 ROBは1サイクル毎に更新されるので、その状態を観察する。 Outstanding loads: 1 stores: 0 [ 0] DONE@+37 3 LOAD 100c: ld t0, 24(t0) {0x1018} [ 1] READY@+36 4 EXEC ( 1) 1…

RISC-VのLinuxブート環境をbuildrootで構築する (4. ブート用HEXファイルの作り方)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 ChipyardやSpikeの環境では、BootROMに、最初のブートシーケンス及びDevice Treeの情報がバイナリ形式で格納されている。 これをどのように作成するのかについてまとめておく。 …

RISC-VのLinuxブート環境をbuildrootで構築する (3. RTLでブートローダを実行する)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行してみようと思う。 まずは、ブートローダをロードする前のBootROMを作成する必要がある。 SpikeやChipyardでは、BootROMが定義されており、CPUは最初にそこから命令をロードして実行する。 …

RISC-VのLinuxブート環境をbuildrootで構築する (2.RTLによるシミュレーション試行)

RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行してみようと思う。 まずは簡単にブートローダから。これはELF形式で格納されているので簡単に実行することができる。 しかし、ロード直後に落ちてしまった。あれえ、なんでこんなところで落…

RISC-VのLinuxブート環境をbuildrootで構築する

RISC-V向けLinuxのビルド環境として、buildrootを使用したいのだがどうも安定してビルドできる環境の資料がないので、自分で環境を作ることにした。 自分はWSL上で作業しているのだが、環境変数の設定など少し厄介なところがあるので、せっかくなのでDockerf…

RISC-VのコンプライアンステストフレームワークRISCOFを試す (1. インストールとサンプル試行)

RISCOFというのは、RISC-V Compilance Flameworkの略で、RISC-Vアーキテクチャアセンブリテストを使用して、標準のRISC-Vリファレンスモデルに対するハードウェア・ソフトウェアのテストを行うためのPythonベースのフレームワークとなっている。 https://git…

Sniperの動作原理をトレースする (2. Performance Modelの概要)

PerformanceModel::queueInstruction()はひたすらm_instruction_queueに命令をPushしていく。ENABLE_PERF_MODEL_OWN_THREADは定義されていない気がする。 void PerformanceModel::queueInstruction(DynamicInstruction *ins) { if (m_fastforward || !m_enab…

Sniperの動作原理をトレースする (1. 動作を追いかける)

Sniperの動作について、一度まとめてみることにした。シミュレーションをもとにトレースを作成してみる。 main() : standalone.cc - Simulatorをインスタンス化する - getTraceManager()->init() -getTraceManager()->run() - TraceThread::start() - TraceT…

自作RISC-VコアにおけるRMW命令の実装 (4. RMW命令のデバッグ)

RISC-VのRMW(Read Modify Write)命令を自作OoOコアに実装しようとしている。 基本的な機能の実装は完了したので、今度は依存する命令に対する発行制限などの機能を追加する。 実行中のRMW命令よりも若い命令は実行してはいけない。このためにパイプライン中…

"iota"ベクトルとは何なのか

きっかけは、RISC-Vのベクトル命令一覧で、viota.m命令が存在していることからだった。 命令の説明文によると、 The viota.m instruction reads a source vector mask register and writes to each element of the destination vector register group the su…

自作RISC-VコアにおけるRMW命令の実装 (3. RMW命令のデバッグ)

RISC-VのRMW(Read Modify Write)命令を自作OoOコアに実装しようとしている。 AMOADDの実装は完了した。次に、RMW命令を追い越そうとする命令を検出して止める機能を実装する。 パイプライン中でSTQを参照し、自分よりも古いRMW命令が存在している場合にそれ…

自作RISC-V CPUコアにおけるGShare分岐予測器の実装

自作RISC-V CPUコアの方は、いくつか構成を改善してGShare分岐予測器が正しく動くようになった。 GShareの厄介なところは、複数の命令をフェッチした際に同時に分岐予測をするのがかなり難しい。 実際問題かなり複雑な論理になってしまい、おそらくこのまま…

自作RISC-VコアにおけるRMW命令の実装 (2. 最も基本的なRMWの実装)

RISC-VのRMW(Read Modify Write)命令を自作OoOコアに実装しようとしている。 まずはAMOADD.W命令の実装から初めて見ている。 RMW命令は基本的にSTQからパイプラインに流すようにしている。 ただしストア命令のようにL1Dに最後に書くだけではないので、L1Dに…

サイクルベースシミュレータSniperについて調査する (SniperにRISC-Vベクトルの命令を解析させてみる)

Sniperの解析の続き。RISC-Vのベクトル命令のサイクル解析を行えるようになりたい。 前回の結果では、まだまだ想定したサイクル数になっていない。16個のメモリリクエストを発生させるとして、16サイクルくらいかかってほしいのだがそうもいっていない。引き…

自作RISC-VコアにおけるRMW命令の実装検討

RISC-VのRMW(Read Modify Write)命令を自作OoOコアに実装しようとしている。 いくつか実装の方法がありそうだが、基本的なAtomic命令の形式をどのように作りこむのか考えてみる。 まず、RISC-VのAMOADD命令は以下のように構成されている。 amoadd.w rd,rs2,(…

サイクルベースシミュレータSniperについて調査する (SniperにRISC-Vベクトルの命令を解析させてみる)

Sniperは現在のところ、1命令につき最大2つしかメモリアクセスをトレースできるようになっておらず、まずはこれを変更する必要がある。 SniperのSIFTトレースフォーマットのうち、MAX_DYNAMIC_ADDRESSESを変更してより多くのメモリアクセスを受け入れること…

NaxRISCVの試行 (コンパイルとシミュレーション)

ちょっといろいろ試行したくて、NaxRISCVを実行してみる。 github.com # Get the repo git clone https://github.com/SpinalHDL/SpinalHDL.git --recursive git clone https://github.com/SpinalHDL/NaxRiscv.git --recursive cd NaxRiscv export NAXRISCV=$…

自作RISC-V CPUコアで構成を変えながら性能を測定していく (3. RAS性能改善後のDhrystone測定)

自作RISC-V CPUコアの方は、いくつかの構成を変更してRASの改造を行った。 RASのレイテンシは大きくなったが安定して予測できるようになったので、Dhrystoneを測定してみる。 前の計測結果がこのような感じだ。 Configuration IPC tiny 0.56 small 0.84 stan…