FPGA開発日記

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

RISC-V

自作RISC-V CPUコアで構成を変えながら性能を測定していく (5. Pipeline Visualizerのトレース生成実装)

自作RISC-V CPUコアの方は、いくつかのコンフィグレーションにおいてDhrystoneを完走させることができるくらいになってきた。 パイプライントレースのログ生成を実装する。基本としては各モジュールのパイプラインステージ毎にDPI-Cを通じてC++側に情報を取…

自作RISC-V CPUコアで構成を変えながら性能を測定していく (4. Pipeline Visualizerを導入する)

自作RISC-V CPUコアの方は、いくつかのコンフィグレーションにおいてDhrystoneを完走させることができるくらいになってきた。 ちょっとパイプラインのボトルネックが見えないので、Pipeline Visualizerを導入してみることにした。 使ってみたのはKanataとい…

自作RISC-V CPUコアで構成を変えながら性能を測定していく (3. Dhrystoneのボトルネック解析ツール)

自作RISC-V CPUコアの方は、いくつかのコンフィグレーションにおいてDhrystoneを完走させることができるくらいになってきた。 前回の結果に基づいて、どの部分でストールが発生しているかというのをチェックする。 まず、命令バッファが埋まり切っているタイ…

自作RISC-V CPUコアで構成を変えながら性能を測定していく (3. Dhrystoneのボトルネック解析ツール)

自作RISC-V CPUコアの方は、いくつかのコンフィグレーションにおいてDhrystoneを完走させることができるくらいになってきた。 次に、どこがボトルネックになっているのかを見てみるために、いくつか性能ダンパーを追加することにした。 基本的に見てみたいの…

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

自作RISC-V CPUコアの方は、いくつかのコンフィグレーションにおいてDhrystoneを完走させることができるくらいになってきた。 RASの実装を変更してからCALL/RETでの分岐予測ミスが減ったので多少性能が上がったと思うのだが、久しぶりにDhrystoneを測定して…

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

自作RISC-V CPUコアの方は、いくつかのコンフィグレーションにおいてDhrystoneを完走させることができるくらいになってきた。 RASの実装を変更してからCALL/RETでの分岐予測ミスが減ったので多少性能が上がったと思うのだが、久しぶりにDhrystoneを測定して…

自作RISC-Vコアにおける浮動小数点命令サポートの実装 (3. レジスタの実装と基本的な符号命令)

浮動小数点命令とレジスタをサポートするために、リネームと物理レジスタの実装を変更する。 物理レジスタについては、x0(=ft0)レジスタに書き込みができるように変更する。また、リネームにおいてはx0(=ft0)もリネームを実行する。 汎用レジスタに対する特…

自作RISC-Vコアにおける浮動小数点命令サポートの実装

浮動小数点命令をサポートするためには、まずはレジスタファイル、そして検証環境の更新が必要だ。 まず、SpikeにおけるFPU命令のトレースログの取り扱いについては、浮動小数点命令レジスタへの書き込みが行われると、レジスタの種類のビットが変更される。…

自作RISC-Vコアにおける浮動小数点命令サポートの検討

自作RISC-V CPUコアに浮動小数点命令をサポートしたい。浮動小数点命令は大きく分けて単精度浮動小数点と倍精度浮動小数点命令があり、それぞれの命令を追加していく。 自作CPUコアでは命令定義をJSONで管理して、デコーダを自動生成するようにしているので…

RISC-V CPUコア CVA6 のL1Dキャッシュ構成ドキュメントを読む (1. L1Dキャッシュの構造)

CVA6はオープンソースのRISC-V CPUコアで、Chipyardにも組み込まれているインオーダパイプラインのCPUだ。 CPUの部分はソースコードを読むことができるが、複雑なLSUやキャッシュ周りはちゃんとVerilogの実装を読もうとすると時間がかかってしまう。ちょうど…

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

しばらくブログを書いていなかったが久しぶりに再開する。 自作RISC-V CPUコアの方は、いくつかのコンフィグレーションにおいてDhrystoneを完走させることができるくらいになってきた。性能は小さいほうから順調にスケーリングしているが、構成を大きくして…

自作RISC-V CPUコア実装(テストパタンデバッグ)

自作CPUのデバッグをチマチマ進めている。 TLBの問題についてはとりあえず置いておいて、テストパタンを動かしながら問題点を洗い出している。 とりあえず環境等の問題を洗い出して、基本的なケースは動くようなところまで直していった。 巨大なコンフィグレ…

RISC-Vのランダムテストriscv-tortureを試す (2. メンテナンスによるアップデート)

riscv-torture(ランダムテストパタン)はしばらくメンテナンスされていなかったのだが、最近アップデートされて一応makeが通るようになった。 自作CPUのランダムテストパタンとして使用することにする。 github.com RISC-V TortureのConfiguration Tortureの…

SonicBOOMのデザインを読み解く (LSUによるロード命令)

SonicBOOMの動作解析、次はLSUによるロード命令の動作を見てみよう。ロード命令はLSUにより発行されるが、命令自体は整数ユニットとは別のイシューユニットで発行される。 以下のアセンブリ命令を実行して波形を取得した。 .section .text .global simple_lo…

SonicBOOMのデザインを読み解く (DispatcherとFrontendのReplay動作)

前回の解析で、イシューユニットで命令があふれてしまった場合にどのように動作するのかが解析できなかった。いくつか構成を変えて新しいコンフィグレーションを生成してみる。 StrangeBoomConfigという新しいコンフィグレーションを作ってその動作を確かめ…

SonicBOOMのデザインを読み解く (リソースが満タンになった場合のFetcherの挙動はどうなるか)

次に、以下のようにALUのリソースを一気に使い切るようなコードを見てみよう。これはDispatcherがC.ADDIを8命令フルにDispatchするがALUの数が足りず、すべての命令を発行することができない場合にFetcherがどのようにリロードするのかを観察する。 00000000…

SonicBOOMのデザインを読み解く (DispatcherとFrontendのReplay動作)

SonicBOOMのデザインを読み解いている。引き続き以下のようなプログラムを動かして命令フェッチャーの動きを観察している。 000000008000322e <simple_add>: 8000322e: b0002573 csrr a0,mcycle 80003232: 301025f3 csrr a1,misa 80003236: 0205e593 ori a1,a1,32 800032</simple_add>…

SonicBOOMのデザインを読み解く (フロントエンドからDispatcher)

SonicBOOMのデザインを読み解いている。少しクリティカルな部分について解析するために以下のようなプログラムを動かしてみよう。 000000008000322e <simple_add>: 8000322e: b0002573 csrr a0,mcycle 80003232: 301025f3 csrr a1,misa 80003236: 0205e593 ori a1,a1,32 </simple_add>…

SonicBOOMのデザインを読み解く (FetchBuffer)

引き続きSonicBOOMのデザインを読んでいる。SonicBOOMではf3にて簡単なデコードが完了すると、バックエンドに命令が渡される。その時のフロントエンドとバックエンドのインタフェースとしてFetchBuffer(fb)に格納される。FetchBufferからバックエンドに命令…

SonicBOOMのデザインを読み解く(TLBの動作確認)

SonicBOOMのデザインを読んでいる。次はTLBについて調査する。 TLBは仮想アドレスから物理アドレスを引いてくるための機構なのだが、テーブルサーチ部分は以下のような構成になっていた。 1つの仮想アドレスに対して4-WAY同時に格納できる構成になっており、…

SonicBOOMのデザインを読み解く(フロントエンド)

RISC-VのOoOコアSonicBOOMのデザインを読み解いている。フロントエンドのパイプライン構成について読み解いていきたい。 SonicBOOMのフェッチ部については大まかに言って3ステージに分かれていると言って良い。 s0:プログラムカウンタから仮想アドレスを命…

SonicBOOMの性能測定 (Coremark)

SonicBOOMの基本的な性能を見るために、次はCoremarkを実行してみることにした。SonicBOOMはパラメータに応じて以下の構成を取ることができる。 Coremarkのソースコードとコンパイルについては、以下のリポジトリを活用することにした。デフォルトではCorema…

SonicBOOMのデザインを読み解く(算術演算のデータパスの生成方法)

RISC-VのOoOコアであるSonicBOOMのデザインを勉強している。前回に続いて、以下のテストパタンを用いてALUのデータパスがどのようにして選択されているのかを観察している。 .section .text .global simple_add simple_add: addi x10, x0, 1 addi x11, x10, …

SonicBOOMの性能測定 (Dhrystoneの性能測定)

SonicBOOMの基本的な性能を見るために、Dhrystoneを実行してみることにした。SonicBOOMはパラメータに応じて以下の構成を取ることができる。 これらの構成の違いは、BOOMのconfix-mixins.scalaに定義されている。GigaBoomConfigは以下のように定義されている…

2020年RISC-V界隈振り返り(ハードウェアメイン)

2020年も終わりに近づいてきた。今年はとにかくコロナウイルスに振り回された日々だったが、まずは無事に2020年を終えることができて良かったと思っている。この調子でいくと来年はどうなるのかは想像もつかないが、自分のモットーである「制御できないこと…

SonicBOOMのデザインを読み解く (算術演算のデータパスとレイテンシ)

SonicBOOM (BOOMv3)のデザインを読み解いていきたいと思う。まずはいくつか小さなマイクロベンチマークプログラムを流して、データパスの流れを追っていきたいと思う。 一番基本となるのは加算をチェインだろう。依存関係の加算を連続して実行すると加算器の…

SonicBOOMのデザインを読み解く (全体バス構成とフロントエンド概要2)

SonicBOOMのデザインを読み解く続き。フロントエンドデザインを波形を見ながら読み解いていくことにする。最初のブート部分の波形を表示すると以下のようになる。 まず、F0ステージからICacheへのリクエストを出し、F2ステージにレスポンスが無ければキャッ…

SonicBOOMのデザインを読み解く (全体バス構成とフロントエンド概要)

色々訳あってRISC-VのOoOデザインであるSonicBOOMの構成を読み解くことにした。SonicBOOMのデザインは、デザインそのものはriscv-boomリポジトリから入手できるが、合成及びRTLシミュレーションを行うためにはChipyardを使う必要がある(boom-templateという…

RISC-V Vector命令をサポートした自作命令セットシミュレータの実装検討 (8. VX, VI命令の実装)

自作RISC-V命令セットシミュレータの実装続き。算術演算命令について説明すると、RISC-V Vector Extensionには大きく分けで3つの演算命令種が定義されている。 .VV 命令:ベクトルレジスタとベクトルレジスタ同士を算術演算して、その結果をベクトルレジスタ…

RISC-V Vector命令をサポートした自作命令セットシミュレータの実装検討 (7. 単純な算術演算の実装)

自作RISC-V命令セットシミュレータ、Vector Extensionのサポート続き。メモリアクセスが一応実装できたので、次は基本的な四則演算を実装して行きたい。 基本的な四則演算として、整数の四則演算を見ていく。対象としては、 VADD.VV : 加算 VSUB.VV : 減算 V…