2022-01-01から1年間の記事一覧
サイクル精度シミュレータSniperは、トレースファイルをベースとしたサイクル精度解析シミュレータだ。 RISC-Vのサポートにおいては、SpikeからSIFTファイルを生成し、それをSniperに加えることでサイクル計算を行う。 これだけだとSniper側にRISC-Vのデコー…
RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 Spikeのシミュレーション環境を見ると、OpenSBIによってブート処理が始まった後、Linuxカーネルを0x8020_0000に展開してからブート処理がスタートするようだ。 カーネルイメージ…
前回、Spikeシミュレータで外部デバイスのライブラリを動的ロードする方法が分かったので、これを自作CPUのシミュレーション環境に導入することを考える。 自分はSpikeを取り込んだ単体でELFファイルをシミュレーションする環境を作っているのだが、これに対…
RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 Buildrootで必要なシリアルデバイスを用意して、Spikeシミュレーションで一致検証ができるようにした。 C++側のシリアルデバイスのモデルを作成して、Spikeに動的ライブラリとし…
riscv-isa-sim(いわゆるspikeシミュレータ)は便利なツールだが、例えば外部デバイスとして任意の場所に自作のデバイスを追加することができる。 例えば、自分の場合だと0x5400_0000に自作のシリアルデバイスを追加したい場合はどうするか。いろいろ情報は少…
SniperにRISC-Vのベンチマークを実行させたくて、マイクロベンチマークをSpike上でシミュレーションしSIFTを生成する試行をしている。 SIFTの生成時にどうもSpikeがハングしてしまうか、予期しない動作をしてしまい様子がおかしい。 どうもみてみると、SIFT…
自作RISC-V CPUコアの方は、いくつかの実装の変更を行って性能がかなり伸びるようになった。 Coremarkの環境を構築して測定できるようにしておく。最大構成ではコンパイルに時間がかかるので、4種類の構成で性能を測定した。 あとはRV64に限定している。ITER…
RISC-Vのベクトルテストケースを試したくて、簡単なテストを探している。rvv-intrinsic-doc をチェックしている。 https://github.com/riscv-non-isa/rvv-intrinsic-doc テストケースを試すためには、intrinsicをサポートしたGNU Toolchainを構築しなければ…
自作RISC-V CPUコアの方は、いくつかの実装の変更を行って性能がかなり伸びるようになった。 GShareの実装 LDQ/STQのスケジューリングの調整 フラッシュ信号の最適化 Dhrystoneのコンパイルオプション最適化 いろいろ頑張った結果、Standardコンフィグレーシ…
SniperでRISC-Vのベクトル命令をサポートするために、RISC-Vデコーダについて解析する。 SniperのRISC-Vデコーダは、RV8をベースとしている。RV8のデコーダに情報を追加していく。 https://github.com/michaeljclark/rv8 命令の追加 (meta/opcodes) # RVV (a…
RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 Read Modify Writeについていくつかの修正を加えたのと、LR/SCについて簡単な実装を行った。 LR/SCはどちらも最も古い命令になってから実行する、投機的実行をしない方式で実行し…
RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行している。 いくつかの基本的な機能が整ったので、Linuxの起動を試行しながらデバッグをしている。 Spikeとの実装を合わせるために、TIME CSRレジスタの実装を削除した。これはメモリマップ…
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ブート環境を構築したので、次にこれをRTL環境で実行している。 ChipyardやSpikeの環境では、BootROMに、最初のブートシーケンス及びDevice Treeの情報がバイナリ形式で格納されている。 これをどのように作成するのかについてまとめておく。 …
RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行してみようと思う。 まずは、ブートローダをロードする前のBootROMを作成する必要がある。 SpikeやChipyardでは、BootROMが定義されており、CPUは最初にそこから命令をロードして実行する。 …
RISC-VのLinuxブート環境を構築したので、次にこれをRTL環境で実行してみようと思う。 まずは簡単にブートローダから。これはELF形式で格納されているので簡単に実行することができる。 しかし、ロード直後に落ちてしまった。あれえ、なんでこんなところで落…
RISC-V向けLinuxのビルド環境として、buildrootを使用したいのだがどうも安定してビルドできる環境の資料がないので、自分で環境を作ることにした。 自分はWSL上で作業しているのだが、環境変数の設定など少し厄介なところがあるので、せっかくなのでDockerf…
RISCOFというのは、RISC-V Compilance Flameworkの略で、RISC-Vアーキテクチャアセンブリテストを使用して、標準のRISC-Vリファレンスモデルに対するハードウェア・ソフトウェアのテストを行うためのPythonベースのフレームワークとなっている。 https://git…
PerformanceModel::queueInstruction()はひたすらm_instruction_queueに命令をPushしていく。ENABLE_PERF_MODEL_OWN_THREADは定義されていない気がする。 void PerformanceModel::queueInstruction(DynamicInstruction *ins) { if (m_fastforward || !m_enab…
Sniperの動作について、一度まとめてみることにした。シミュレーションをもとにトレースを作成してみる。 main() : standalone.cc - Simulatorをインスタンス化する - getTraceManager()->init() -getTraceManager()->run() - TraceThread::start() - TraceT…
RISC-VのRMW(Read Modify Write)命令を自作OoOコアに実装しようとしている。 基本的な機能の実装は完了したので、今度は依存する命令に対する発行制限などの機能を追加する。 実行中のRMW命令よりも若い命令は実行してはいけない。このためにパイプライン中…
きっかけは、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(Read Modify Write)命令を自作OoOコアに実装しようとしている。 AMOADDの実装は完了した。次に、RMW命令を追い越そうとする命令を検出して止める機能を実装する。 パイプライン中でSTQを参照し、自分よりも古いRMW命令が存在している場合にそれ…
自作RISC-V CPUコアの方は、いくつか構成を改善してGShare分岐予測器が正しく動くようになった。 GShareの厄介なところは、複数の命令をフェッチした際に同時に分岐予測をするのがかなり難しい。 実際問題かなり複雑な論理になってしまい、おそらくこのまま…
RISC-VのRMW(Read Modify Write)命令を自作OoOコアに実装しようとしている。 まずはAMOADD.W命令の実装から初めて見ている。 RMW命令は基本的にSTQからパイプラインに流すようにしている。 ただしストア命令のようにL1Dに最後に書くだけではないので、L1Dに…
Sniperの解析の続き。RISC-Vのベクトル命令のサイクル解析を行えるようになりたい。 前回の結果では、まだまだ想定したサイクル数になっていない。16個のメモリリクエストを発生させるとして、16サイクルくらいかかってほしいのだがそうもいっていない。引き…
RISC-VのRMW(Read Modify Write)命令を自作OoOコアに実装しようとしている。 いくつか実装の方法がありそうだが、基本的なAtomic命令の形式をどのように作りこむのか考えてみる。 まず、RISC-VのAMOADD命令は以下のように構成されている。 amoadd.w rd,rs2,(…
Sniperは現在のところ、1命令につき最大2つしかメモリアクセスをトレースできるようになっておらず、まずはこれを変更する必要がある。 SniperのSIFTトレースフォーマットのうち、MAX_DYNAMIC_ADDRESSESを変更してより多くのメモリアクセスを受け入れること…
ちょっといろいろ試行したくて、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コアの方は、いくつかの構成を変更してRASの改造を行った。 RASのレイテンシは大きくなったが安定して予測できるようになったので、Dhrystoneを測定してみる。 前の計測結果がこのような感じだ。 Configuration IPC tiny 0.56 small 0.84 stan…