FPGA開発日記

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

2022-10-01から1ヶ月間の記事一覧

RISC-V OoOコアであるBOOMのChicken Bitを使うための試行

RISC-VのOut-of-orderedコアであるBOOMの詳細を少し調べていたのだが、Chicken Bitというのがある。 どうもアウトオブオーダ実行を止めることができる機能らしい。 と思ったら、あれ?違うかな。完全にPipelineをクリアしながら進めるのか。じゃあInOrderよ…

サイクル精度シミュレータSniperでLoad命令のレイテンシを調査する

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

サイクル精度シミュレータSniperでRegion of Interestの領域をベンチマーク側から設定する方法

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

サイクル精度シミュレータSniperでIn-order / Out-of-orderモードでサイクル数の変化を観測する

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

RISC-VのFPU命令がIllegal命令例外を発生した場合に何を確認すべきか

まあ自分用のメモというか、失敗記録なのだけれども。 例えば、以下のfcvt命令が急に命令例外を出した。SpikeのConfigurationはRV64GCにしているので間違いない。どこを確認すべきか? core 0: 3 0x0000000080000e52 (0x20278bd3) f23 0xffffffff5f800000 co…

RISC-V Vectorized Bencmark Suiteのコンパイルとシミュレーション方法

RiVec、つまりRISC-V Vectorized Bencmark SuiteはベンチマークスイートをRISC-Vベクトル向けに移植したベンチマークスイートだ。 メインリポジトリのRiVecはバージョンが古くてRVV1.0のintrinsicではコンパイルすることができない。 Pull Requsetを観察して…

RISC-Vのランダムテストジェネレータ AAPGを試す (5. FPUの命令系統をチェックする)

AAPGを久しぶりに触っている。久しぶりにテストパタンを動かして問題ないことを確認したので、もうちょっと命令範囲を拡張することにした。 https://gitlab.com/shaktiproject/tools/aapg FPU系の命令でバグがちょいちょい見つかっている。riscv-testsでカバ…

RISC-Vのランダムテストジェネレータ AAPGを試す (4. RISC-V命令拡張を試す)

AAPGを久しぶりに触っている。久しぶりにテストパタンを動かして問題ないことを確認したので、もうちょっと命令範囲を拡張することにした。 https://gitlab.com/shaktiproject/tools/aapg 現時点ではAAPGはFPU/RMW命令を生成するようになっていない。config.…

RISC-V VectorのAuto Vectorizationが生成するアセンブリコードを読み解く (Memory Copy)

RISC-Vベクトル命令の自動生成がかなりサマになってきた、という話を聞いたので、GCCのAutoVectorizationを見てみることにした。 使用したのは、RVVに対応したRISC-V GCCだ。 $ riscv64-unknown-elf-gcc --version riscv64-unknown-elf-gcc () 12.0.1 202205…

RISC-V Vector intrinsicのサンプルアプリケーションを解析する

RISC-V Vector Intrinsicのドキュメントでは、サンプルアプリケーションがいくつか格納されている。 https://github.com/riscv-non-isa/rvv-intrinsic-doc/tree/master/examples それぞれのアプリケーションにおいて、どのようにベクトル命令が使用されてい…

Googleのセキュリティにフォーカスした「KataOS」を触ってみる

Googleのリリースしたセキュリティを重視したオペレーティングシステムのKataOS、RISC-Vも視野に入れているということで面白そうなのでチェックしてみることにした。 https://opensource.googleblog.com/2022/10/announcing-kataos-and-sparrow.html まず、K…

サイクル精度シミュレータ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は最初にそこから命令をロードして実行する。 …