RISC-V
SonicBOOMのデザインを読み解く続き。フロントエンドデザインを波形を見ながら読み解いていくことにする。最初のブート部分の波形を表示すると以下のようになる。 まず、F0ステージからICacheへのリクエストを出し、F2ステージにレスポンスが無ければキャッ…
色々訳あってRISC-VのOoOデザインであるSonicBOOMの構成を読み解くことにした。SonicBOOMのデザインは、デザインそのものはriscv-boomリポジトリから入手できるが、合成及びRTLシミュレーションを行うためにはChipyardを使う必要がある(boom-templateという…
自作RISC-V命令セットシミュレータの実装続き。算術演算命令について説明すると、RISC-V Vector Extensionには大きく分けで3つの演算命令種が定義されている。 .VV 命令:ベクトルレジスタとベクトルレジスタ同士を算術演算して、その結果をベクトルレジスタ…
自作RISC-V命令セットシミュレータ、Vector Extensionのサポート続き。メモリアクセスが一応実装できたので、次は基本的な四則演算を実装して行きたい。 基本的な四則演算として、整数の四則演算を見ていく。対象としては、 VADD.VV : 加算 VSUB.VV : 減算 V…
自作RISC-V命令セットシミュレータ、Vector Extensionのサポート続き。Unit Strideのメモリアクセス命令は追加したのだが、あと2種類のメモリアクセス命令についても追加する。それがStridedメモリアクセス命令とIndex Stridedメモリアクセス命令である。 復…
自作命令セットシミュレータのRISC-V Vector Extensionサポート、基本的なベクトルロードストア命令の実装が終わった。 テストを追加したいのだが、一応マスクレジスタのテストをしておきたい。Vector Extensionのマスクについてここでまとめておいて、シミ…
自作命令セットシミュレータのRISC-V Vector Extensionサポート、とりあえずCSR命令の確認が終わったので先に進めていく。 RISC-V Vector Extensionのメモリアクセスにはいくつか種類があって、大きく分けると3種類。 Unit Stride:最もシンプルなメモリアク…
RISC-Vのベクトル拡張の理解に当たり、複雑怪奇なシステムレジスタを理解するのは大変だ。ここではRISC-Vベクトル拡張が備える謎のシステムレジスタについて一気に解説していきたい。 ちなみに最新のRISC-V Vector Extension 0.9をベースに解説している。 RI…
RISC-Vのベクトル拡張の理解に当たり、複雑怪奇なシステムレジスタを理解するのは大変だ。ここではRISC-Vベクトル拡張が備える謎のシステムレジスタについて一気に解説していきたい。 ちなみに最新のRISC-V Vector Extension 0.9をベースに解説している。 RI…
RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)は私の手元のGCCでコンパイルしたCoremarkで、特にオプションをいじらずに5.0CMK/MHzを上回ることが確認できた。 私が使っているのがRISC-V GCC 7.2なので最近リリースされたGCC 10.0にアップグレードする…
久しぶりになってしまった自作命令セットシミュレータのベクトル命令サポート。少し時間があるので再挑戦する。 前回、全命令のデコーダを生成したのだが、全命令ではなかった。ロードストア命令が抜けている。今回はロードストア命令の内基本的なものを作っ…
RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)が公開されている。シミュレーションは前回上手く動作したが、ブロックダイアグラムを作って中身を見てみたいと思った。 そこで生成されたVerilogを読みながらブロックダイアグラムを作ってみることにし…
RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)が公開されているが、シミュレーションを行うためにはChipyardの環境を用意するのが原則になっているようだ。 SonicBOOMv3のリポジトリ事態にCoremarkは入っていないようなので自分でバイナリを構築する…
RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)が公開されているが、シミュレーションを行うためにはChipyardの環境を用意するのが原則になっているようだ。 Chipyardの環境はかなり巨大なので用意するのが面倒なのだが、構築方法を忘れそうなので一…
SonicBOOMというのはBOOM(Berkeley Out-of-Order Machine)の第3世代で、なぜSonicという名前を付けたのか謎だが、IPCを向上させるための技術が詰め込まれている。 carrv.github.io SonicBOOM: The 3rd Generation Berkeley Out-of-Order Machine https://car…
RISC-V トレースフォーマットの勉強。続き。 github.com github.com 1章ずつ、翻訳ではなく日本語でサマライズしていく形式で進めていく。 6. リファレンスアルゴリズム 以下のようなエンコーダの実装を考える。 Qualified? : 命令がフィルタリングのクライ…
RISC-V トレースフォーマットの勉強。続き。 github.com github.com 1章ずつ、翻訳ではなく日本語でサマライズしていく形式で進めていく。 5. トレースエンコーダの出力パケット 5.7 Format 1 パケット このパケットには分岐命令の情報が含まれている。また…
RISC-V トレースフォーマットの勉強。続き。 github.com github.com 1章ずつ、翻訳ではなく日本語でサマライズしていく形式で進めていく。 5. トレースエンコーダの出力パケット トレースエンコーダでは、以下の情報を含まなければならない。 パケットタイプ…
RISC-V トレースフォーマットの勉強。続き。 github.com github.com 1章ずつ、翻訳ではなく日本語でサマライズしていく形式で進めていく。 4. フィルタリング エンコーダがトレースを生成するためのメカニズムを示している。例えば、以下の条件ではトレース…
RISC-V トレースフォーマットの勉強。続き。 github.com github.com 1章ずつ、翻訳ではなく日本語でサマライズしていく形式で進めていく。 3. Hartのエンコーダインタフェース 3.1 インタフェースの要求 以下の情報がインタフェースとして転送されればよい。…
RISC-V トレースフォーマットの勉強。続き。 github.com github.com 1章ずつ、翻訳ではなく日本語でサマライズしていく形式で進めていく。 Chapter.2 分岐トレース 命令データトレース、もしくは分岐トレースはとあるアドレスからスタートして命令の実行情報…
RISC-Vのトレースフォーマットの仕様書が公開された。現在はドラフト段階だが、ドキュメントがGitHubで公開され、pdfファイルも入手することができる。 各種CPUアーキテクチャのトレース形式など、あまり勉強したことが無いのでこれを機に読んでみよう。 git…
Rustで作る自作命令セットシミュレータの続き。アトミック命令をすべて実装したのはいいが、同じような記述を大量に並べてしまっておりどうも気持ちが悪い。 AMOADD.Wの実装 fn execute_amoadd_w (&mut self, inst: InstT) { let rs1 = Self::get_rs1_addr(i…
Rustで作る自作命令セットシミュレータの続き。残りの命令を実装していく。次はアトミック命令の実装だ。これもC++で実装したことがあるのでRustに移植するだけである。 Rustでの実装で気をつけなければならないのは型の変換を明示的に行わなければならない…
Rustで作る自作命令セットシミュレータの続き。テストパタンによってはシミュレーションにかなり時間がかかっているような気がするので、どこに負荷がかかっているのかを解析したい。 色々調べていると、Rustで書いたプログラムの性能解析としてFlamegraphと…
Rustで作る自作命令セットシミュレータの続き。RV32とRV64でテストはある程度動くようになっているので、ここらでリグレッションテストを通して細かいところを修正していこうと思う。 Rust実装の修正 RV32とRV64で微妙に動作が異なる部分 例えばシフト命令の…
Rustで作る自作命令セットシミュレータの続き。RV32のテストは動くようになってきたので、次はRV32の仮想アドレスモードの対応について考える。 これも昔作ったC++のRISC-Vシミュレータですでに対応しているので簡単なのだが、いくつかRV32とRV64で切り替え…
Rustで自作命令セットシミュレータを作っているが、RV64のテストパタンはある程度Passできるようになっている。 RV32についてだが、これまではRV32とRV64を別のクラスとして実装していた。しかしどうもこれでは冗長なコードがあってたまらないので、統一して…
Rust製自作命令セットシミュレータ、命令デコーダの実装を少しずつ改造している。 与えられた機械語から、命令をデコードして意味を解析する。 RISC-Vの機械語は非常に単純なので、命令デコーダの設計は簡単だ。 単純にcase文を並べていくだけで完成する。こ…
Cargoのテスト環境を使ってリグレッションテストを作る Rustで作った命令セットシミュレータについて、テストの方法を考え直した。 現在はMakefileで管理をしているが、Cargoの機能を使ってテスト環境を構築した方が良さそうだ。 そこでRustのmain()を直接呼…