FPGA開発日記

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

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…

サイクルベースシミュレータSniperについて調査する (SniperのトレースログをO3Pipeviewに変換してみる)

Sniperの実行結果をO3Pipeviewに変換するための試行 もう少し変更して、いろんな情報を取り込んでみよう。 Tracerのtimes情報を使用してみよう。 fetch / decode / rename は dispatchから1サイクルずつ前になっているという前提にしよう。 diff --git a/co…

サイクルベースシミュレータSniperについて調査する (SniperのトレースログをO3Pipeviewに変換してみる)

Sniperの実行結果をO3Pipeviewに変換するための試行 以下のようにして、LoopTracer::traceInstruction() に出力を追加してみた。コミットの時間だけが本物で、それ以外は全部適当。パイプラインも全部1サイクルずつ進むように適当に改変しているだけ diff --…

サイクルベースシミュレータSniperについて調査する (Sniperが生成するSQLiteのコマンドをダンプする)

Sniperが生成するSQLiteのコマンドをダンプする。 ROI : Region of Interest というのは測定範囲のことを意味するらしい。とりあえずこれは無視して全体的な状態を観察する。 今回はSQLiteの情報を取り出して、単純にPythonのpprintを使って階層化して出力し…

サイクルベースシミュレータSniperについて調査する (SniperのRISC-V対応を最新のSpikeに対応させるための確認)

サイクル精度シミュレータSniperはRISC-Vバイナリの実行に対して基本的な対応が行われているが、Spikeのバージョンが古くてベクトル命令が実行できなかったりと問題がある。 そこで、Sniperに付属しているspikeシミュレータをアップデートして、どのような変…

「作って学ぶコンピュータアーキテクチャ」の作業リポジトリをLLVM15に移行するための作業確認

LLVM15がリリースされたので、「RISC-V+LLVM本」の開発リポジトリをLLVM15系に移行するための試行を行った。 詳細については、以下のサポートページに書いている。 github.com git clone https://github.com/msyksphinz-self/llvm-project.git -b llvm-myri…

Gem5のインストール試行とベンチマーク実行 (RISC-V命令にベクトル新規命令を追加する3)

前回のRVVLoadの定義に対して、いくつかデバッグをしていた。ドキュメントが数少ないので調べるのが大変なのだが、GDBで一つ一つコードの動きを読んでいく。 seanzw.github.io 命令の定義には大きく分けて3ステップが必要そうだ。 Fault execute(ExecContext…

Gem5のインストール試行とベンチマーク実行 (RISC-V命令にベクトル新規命令を追加する2)

Gem5に命令を追加する試行続き。ベクトル命令を定義するためにどんなことが必要なのかを試行錯誤していた。 まず、ベクトル命令全体を定義するためにRVVLoadというクラスを定義する。 riscv/isa/formats/rvv_mem.isa def format RVVLoad(memacc_code, base_r…

Gem5のISAパーサについて勉強する

といってもひたすらISA Parserのページを翻訳して読んだだけ。一応メモのために残しておく。 www.gem5.org ISAパーサ gem5 ISA 記述言語は、gem5 が必要とするクラス定義とデコーダ関数を生成するために特別に設計されたカスタム言語です。このセクションで…

「作って学ぶコンピュータアーキテクチャ」の環境を再現するためのDockerイメージをリリースします

「作って学ぶコンピュータアーキテクチャ」(いわゆるRISC-V + LLVM本)は書籍執筆時の状況と出版時のツールチェインの状況がかなり変わってしまっており、各所で迷惑をかけてしまっています。 確実にLLVMビルド + シミュレーションを行うために、ツールチェイ…

AArch64のSVEロード命令について調べる (LD1{B,SB,H,SH,W,SW,D}命令)

SVEのメモリアクセス命令についてまとめる Gem5のコードを眺めながら、Aarch64のメモリアクセス命令にはどのようなコンフィグレーションがあるのかをまとめている。 まずAArch64のメモリアクセス命令の構造がよくわからん。いろいろあるがまずはリストアップ…

Gem5のインストール試行とベンチマーク実行 (RISC-V命令にベクトル新規命令を追加する)

Gem5に命令を追加する試行続き。命令の定義をいろいろと調べていて、前回なぜVLEおよびVSEがうまく動かなかったのかを調査していた。 結果としてVSETVLI命令をある程度きちんと実装しておかないとベンチマークとして正しく動作しないようだった。そりゃそう…