FPGA開発日記

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

自作CPUのOoO発行の様子を計測するための仕組みの作成

自作CPUはアウト・オブ・オーダ命令発行できるような構成にしているのだが、そのうちどれくらいが実際にアウト・オブ・オーダ発行できているのかをちゃんと計測できていない。 いい機会なので、命令スケジューラに統計情報を処理する機能を追加して、全体命…

HAIR: Halving the Area of the Integer Register File with Odd/Even Bankingを読む(1. 概要)

レジスタ・ファイルのサイズを削減するための手法の論文「HAIR」を読んでいる。その内容を簡単にまとめようと思う。 HAIRのレジスタ・ファイルの構成について まず、この論文では汎用レジスタの構成について、読み込みポート・書き込みポートの多さが問題と…

あけましておめでとうございます 2024

あけましておめでとうございます。今年も、FPGA開発日記をよろしくお願いします。 今年は現時点で決まっている大きなプロジェクトとかは何もなくて、FPGA開発日記としては粛々と自分のことをやって、成果を出していければいいなと思う。 すこし課題に思って…

年末なので今年のまとめをしよう2023

FPGA開発日記は2015年1月4日開始から、おおよそ9年が経過しました。 今年は、ブログの記事数が3000記事に到達した節目でもあります。 プライベートでも仕事でも、かなり忙しい状況ではあるのですが、その中で継続して3000記事まで到達できたのは自分でも自信…

自作CPUにベクトル命令を追加する実装検討 (32. LMUL>1の対応考え直し)

ベクトル命令における、LMUL>1の対応というのは結構難易度の高い問題だ。 今回はその解決方法として、LMULの値がVSETVL命令で変更されると、例外を出して物理レジスタの構成を整列し直す方式を考えたい。 この方式を実際にVerilogで記述して動作をテストしよ…

自作CPUにベクトル命令を追加する実装検討 (32. LMUL>1のサポート実装)

msyksphinz.hatenablog.com ベクトルレジスタのLMUL>1サポートを具体的に考えていく。 前に考えた、LMULが変更されたときにベクトル・レジスタのリネームを整列する方法を考える。 例外を発生させるところまではできているので、例外の途中にvsetvl命令が実…

自作CPUにベクトル命令を追加する実装検討 (31. ベクトルレジスタ読み込みの遅延挿入)

msyksphinz.hatenablog.com 前回の続きで、ベクトルレジスタの1サイクル遅延に備えて、1ステージベクトル読み出しのためのステージを挿入した。 また、レジスタ読み出しを行った後に、ストアバッファのインタフェースがストールすることに備えて、ストールし…

自作CPUにベクトル命令を追加する実装検討 (30. ベクトルレジスタ読み込みの遅延挿入)

msyksphinz.hatenablog.com 汎用レジスタは、1サイクル遅延を挿入してBlockRAMを使えるようにしたので、ベクトル・レジスタも1サイクル遅延を挿入してBlockRAMを使えるようにした。 この時にいろいろと改変しないといけない場所で最も面倒なのが、STQからキ…

LiteX 2023.12 リリース確認

CHANGESは以下の通り。これを見る限りあまり大きな変更はないように思える。 自分の自作CPUをアップデートして、試してみなければ。 [> Fixed -------- - liteeth/arp : Fixed response on table update. - litesata/us(p)sataphy : Fixed data_width=32 cas…

Delaying Physical Register Allocation Through Virtual-Physical Registers (2. 性能評価)

ちょっとベクトルレジスタについて似たようなアイデアを考えたので探して読んでみた。 前回の続き。 msyksphinz.hatenablog.com Delaying physical register allocation through virtual-physical registers https://ieeexplore.ieee.org/document/809456 4.…

商用RISC-V命令セットシミュレータが使えない人のためのオープンソース命令セットシミュレータSpike入門 (2. DPI-Cを用いたC++との通信)

いろんなニュースがあり、Imperasの検証環境が使えなくなる可能性があるので、オープンソース(そしてほぼRISC-Vシミュレータとしてはデファクトスタンダード)のRISC-V命令セットシミュレータSpikeを使ってどのようにハードウェアを検証するかどうかについて…

商用RISC-V命令セットシミュレータが使えない人のためのオープンソース命令セットシミュレータSpike入門

いろんなニュースがあり、Imperasの検証環境が使えなくなる可能性があるので、オープンソース(そしてほぼRISC-Vシミュレータとしてはデファクトスタンダード)のRISC-V命令セットシミュレータSpikeを使ってどのようにハードウェアを検証するかどうかについて…

自作CPUのGshareの性能をモデルと比較する (3. Gshareの動作を修正する)

モデルおよびBOOMv3に比べてどうも分岐予測の精度が悪い気がしているので、いろいろと調査していた。 もうちょっと外乱に強いように、いろいろ変更する。結構外乱の要因として大きいのが、フェッチステージから命令バッファに入るときに、命令バッファが満杯…

自作CPUのGshareの性能をモデルと比較する (2. Gshareの理想的な動作をモデル化する)

モデルおよびBOOMv3に比べてどうも分岐予測の精度が悪い気がしているので、いろいろと調査していた。 どうしてもモデルとの比較結果が異なるので、もうちょっと考え直さないとだめだ。 もっと詳細にログをとると、Gshareはグローバル履歴をかなり正確にとら…

Gather/Scatterのような不連続なメモリアクセスについてどのようにプリフェッチを出すか (IMP) (4. 部分キャッシュ・ライン・アクセス)

IMP: Indirect Memory Prefetcherという論文があり、これはGather/Scatterに対してどのようにプリフェッチを出すかというものを提案した論文になっている。ちょっと読んでまとめてみようと思う。 msyksphinz.hatenablog.com msyksphinz.hatenablog.com msyks…

自作CPUのGshareの性能をモデルと比較する (2. Gshareの理想的な動作をモデル化する)

モデルおよびBOOMv3に比べてどうも分岐予測の精度が悪い気がしているので、いろいろと調査していた。 どうしてもモデルとの比較結果が異なるので、もうちょっと考え直さないとだめだ。 F1ステージによるuBTBによる分岐予測 F1ステージでBTBアクセスによる分…

自作CPUのGshareの性能をモデルと比較する

モデルおよびBOOMv3に比べてどうも分岐予測の精度が悪い気がしているので、いろいろと調査していた。 結果としては、グローバル履歴の更新に問題があり、正しく分岐予測のテーブルにアクセスできていないっぽい。 問題となるのは、以下のシンプルなループで…

サイクル精度シミュレータの物理レジスタ量を制御する改造について

自作CPUに接続するサイクル精度シミュレータとしてSniperを使用しているが、Sniperは物理レジスタのサイズを考慮していない。つまり物理レジスタは無限に用意されている(あるいはROBのサイズに応じた適切な物理レジスタが用意されている)という仮定にある。 …

RISC-Vのデコードエンジンrv8がC拡張を誤ってデコードしてしまう問題の解析

rv8というのはRISC-VのデコーダやJITエンジンなどをまとめたパッケージで、Sniperサイクル精度シミュレータはrv8をデコードエンジンとして使用している。 Sniperでのサイクル計算の中で、どうも16ビットのC拡張をうまくデコードすることができていないように…

自作CPUにuBTBを搭載して分岐予測を高速化する検討

現在の自作CPUは分岐予測にGShareを使用しており、2サイクルをかけて予測を行う。 したがって分岐予測を行うと常に1サイクルのバブルが入る仕組みになっており、したがってそこで性能が律速される仕組みになっている。 簡単なものでいいのでuBTBを積み込んで…

自作CPUにベクトル命令を追加する実装検討 (29. ベクトル命令のキャッシュ境界を超えるアクセスの対応)

msyksphinz.hatenablog.com この話の続き。上記の仕様をとりあえずマイクロ・アーキテクチャに突っ込んで実装した。 一応うまく動いているっぽいが、シンプルなテストがとりあえず通ったに過ぎない。 101 / 121 : vle16_v_misalign : PASS 105 / 121 : vle64…

Delaying Physical Register Allocation Through Virtual-Physical Registers

ちょっとベクトルレジスタについて似たようなアイデアを考えたので探して読んでみた。 Delaying physical register allocation through virtual-physical registers https://ieeexplore.ieee.org/document/809456 MICRO-32 物理レジスタのLate Allocation(実…

自作CPUにベクトル命令を追加する実装検討 (28. ベクトル命令のキャッシュ境界を超えるアクセスの対応)

これまでのベクトルロード命令は、すべて1つのリクエストがキャッシュの境界を超えないように制御してきた。 しかし実際にはそんなことはなく、キャッシュの境界を超える場合はそれに応じて相応の処理を行わなければならない。 それについて考えた。 まず、…

riscv-vector-testsを試す

GitHubで発見したRISC-Vのベクトル命令テストケースを試してみることにした。 結構こいつはきちんと基本的なテストケースを作ってくれるっぽい。 github.com git clone https://github.com/ksco/riscv-vector-tests.git 基本的には上記ディレクトリでmakeを…

Cache Refill/Access Decoupling for Vector Machinesの論文を読む (3. ベンチマークと性能測定)

面白そうな論文があったので読んでみることにした。続き Cache Refill/Access Decoupling for Vector Machines https://ieeexplore.ieee.org/document/1551005 msyksphinz.hatenablog.com msyksphinz.hatenablog.com 評価 DVM (Decoupled Vector Machine) : …

マルチポートRAMを使用するためのLVT (Live Value Table)の実装

自作CPUのレジスタファイルは非常に多くの読み込みポートと書き込みポートを使用しており、それだけで非常に多くのLUTを消費してしまう。例えば、ちょっと豪華なバックエンドを実装すると、 ALUが1パイプラインにつき2ポートの読み込み、1ポートの書き込み、…

自作CPUのシミュレーション環境に、サイクル精度シミュレータを接続する

自作CPUの環境に、モデルシミュレータのサイクル精度との比較環境を構築した。RTLもモデルシミュレータも波形ビューアで表示可能なログを表示することができ、パイプラインの挙動を比較することができる。 このためには、大まかに言って以下の作業が必要だ。…

Cache Refill/Access Decoupling for Vector Machinesの論文を読む (2. マイクロ・アーキテクチャ)

面白そうな論文があったので読んでみることにした。続き Cache Refill/Access Decoupling for Vector Machines https://ieeexplore.ieee.org/document/1551005 msyksphinz.hatenablog.com 5.1 "SCALE" Decoupled Vector Processor VEUはクラスタ化 4バンク・4…

Cache Refill/Access Decoupling for Vector Machinesの論文を読む (1. 概要)

面白そうな論文があったので読んでみることにした。 Cache Refill/Access Decoupling for Vector Machines https://ieeexplore.ieee.org/document/1551005 Cache Refill/Access Decoupling for Vector Machines 諸元 37th International Symposium on Microarc…

自作CPUにベクトル命令を追加する実装検討 (27. ベクトル・ベンチマークのデバッグ)

単純なベクトル命令のベンチマークだけど、想定する性能が出ない。 これはやはりパイプライン中であまり見たくないいろんなハザードが発生するからで、この辺を何とかしないといけない。 やっぱり気になるのはベクトル・ロードの実行中にいろんなハザードが…