FPGA開発日記

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

2023-08-01から1ヶ月間の記事一覧

自作CPUコアとBOOMv3のPPA(Performance, Power, Area)を比較する (2. 性能の解析)

自作CPUコアをBOOMv3と比較したくて、ベンチマーク(Dhrystone)、論理合成面積、タイミングを比較してみた。 タイトルではPPAと言っているけど、正確ではない。まあ似たようなもんでしょ。 性能:Dhrystoneを測定した。自作CPUコアのStandardがBOOMv3に匹敵す…

自作CPUコアとBOOMv3のPPA(Performance, Power, Area)を比較する

自作CPUコアをBOOMv3と比較したくて、ベンチマーク(Dhrystone)、論理合成面積、タイミングを比較してみた。 タイトルではPPAと言っているけど、正確ではない。まあ似たようなもんでしょ。 もともとパフォーマンスチューニング不足ということもあり、キリキリ…

インタフェース10月号 / FPGAマガジン特別版を購入した

今回のインタフェースの特集の内容自体はあまり自分と関係ないのだけれども、待望のFPGAマガジンが限定で復活したということなので早速購入してみた。 FPGAマガジンが終了してしまったのはとても寂しかったので、期間限定とはいえとてもうれしい。 interface…

Vivadoにおいて論理合成で生成されたすべてのレジスタをリストアップする方法

追記:本当は[all_registers]のほうがいい。 Design Compilerとかだと結構あるけれども、Vivadoの論理合成スクリプトにおいて、フリップフロップがどの程度使用されたかを確認したい時がある。 このために、VivadoのDCPからすべてのフリップフロップのセルを…

FPNewでの1ビット誤差が発生する場合の検証環境での対応

自作CPUのFPUは、外部IPを使用している。FPNewというIPを使っている。 github.com FPNewは、簡単に浮動小数点演算を実装できるのだが、これをインテグレートした後に問題を見つけた。 Some compliance issues with IEEE 754-2008 are currently known to exi…

RISC-V命令一覧ページのフォーマットをwavedrom形式に変更中

RISC-Vのベクトル命令一覧を作成するときに使った、wavedromの命令フォーマット表記が奇麗で気に入っているので、スカラ命令の命令一覧ページも同じように改変することを検討している。 msyksphinz-self.github.io 各命令の定義のページは、RestructuredText…

自作CPUの検証環境改変 (RASの検証環境作成)

自作CPUのRAS(Return Address Stack)を一時的に無効化していたので、再度有効化して検証環境を作成する。 RASのC++モデルとRTLを一致させるためには、以下の情報が必要となる。 (投機実行しない)コミットした命令のみでRASにどのような情報が挿入されるかの…

自作CPUの検証環境改変 (Gshareの精度向上)

自作CPUの分岐予測器(Gshare)をちゃんとデバッグしたいため、モデルとの比較環境を構築している。 比較環境に基づいて、Gshareの改良を行っている。ポイントは、複数の命令を同時にフェッチした際のGshareの履歴テーブルの作り方と、投機実行が失敗した際の…

RISC-Vのベクトル命令一覧と関連情報をまとめたページを公開した

RISC-Vのベクトル命令を使ってアプリケーションを記述するのに、いろいろとドキュメントを見て回るのが面倒だと思っている。 まず、 - どのような命令があるのか調べる(公式ドキュメント) - 本当に自分の意図とあっているのか確認する(Spikeの実装をチェ…

gem5のベクトル・レジスタファイルの構成を調べる

gem5の公式リポジトリにはRISC-VのRVV実装は入っていないのだが、ARMにおけるNEONやSVEのベクトル・レジスタの実装は入っている。 これをどのように実装するのかについて調査した。 SVEのベクトル・レジスタサイズを決めているのは以下のコードのようだ: sr…

自作CPUにZicondの命令を実装

自作CPUにZicondの命令を実装した。 Zicondの仕様については以下で定義されている。 github.com 実装しなければならないのは以下の2命令だ。 czero.eqz rd, rs1, rs2 czero.nez rd, rs1, rs2 実装自体は非常に簡単なので、デコーダと論理を追加するだけだ。 …

自作CPUの検証環境改変 (Gshareの検証環境)

自作CPUの分岐予測器(Gshare)をちゃんとデバッグしたいため、モデルとの比較環境を構築している。 まずはGHR(Global History Table)の比較をしたいため、RTLとの比較環境を構築した。 もう少し進めて、モデル側にも同様なgshareの予測器を追加して、予測が一…

gem5の命令ダンプ機能の解析 (1. traceDataの生成方法の調査)

少しいろいろと、gem5の命令トレースの方法を解析していた。 gem5はcommit.ccにおいて、dump()により命令トレースの出力を行う。 src/cpu/o3/commit.cc bool Commit::commitHead(const DynInstPtr &head_inst, unsigned inst_num) { assert(head_inst); Thre…

自作CPUにBit-manipulationの命令を実装

自作CPUにBit-manipulationの命令を実装した。 Bit-manipulationのうちRatifiedされた命令群としてZba, Zbb, Zbc, Zbsがある。 以下の命令を自作CPUに実装した。 Zba : address generation instructions add.uw rd, rs1, rs2 Add unsigned word sh1add rd, r…

RISCOFを使ったB拡張のテストパタン生成方法

RISCOFを使って、Bit-manipulationのためのテストパタンを作って流してみる。 RISCOFについては、過去にブログで調査したのでこれが役に立った。 msyksphinz.hatenablog.com RISCOFのサポートするriscv-arch-testsにはB拡張のテストが含まれており、これをRI…

自作CPUでのBit-manipulation拡張の実装検討 (デコーダの追加)

Bit-manipulationを自作CPUに実装してみたいので、まずはデコード情報を入力している。 以下のようなJSONを入力して、デコードを追加している。 [ { "name":"add.uw r[11:7],r[19:15],r[24:20]", "length":"32", "xlen":["32", "64"], "field": ["00001", "0…

自作CPUの検証環境改変 (Gshareの検証環境)

自作CPUの分岐予測器(Gshare)をちゃんとデバッグしたいため、モデルとの比較環境を構築している。 まずはGHR(Global History Table)の比較をしたいため、RTLとの比較環境を構築した。 C++側の実装を構成して、RTLとの値を比較するようにしている: void step…

ChipsAllianceのRISC-V命令セット・シミュレータWhisper(VeeR-ISS)がかなり使いやすくなっている

かつてWestern Digitalが開発していて、今はChipsAllianceに管理が移っているWhisper(VeeR-ISS)がかなり使いやすくなっていたのでメモ。 使い勝手としてはSpikeに近くなって、Linuxユーザモード向けのプログラムとかもかなり動かしやすくなっている。 github…

Official GCCでのRISC-Vコンパイル環境構築方法 (Linux Cross-compilation向け)

RISC-V 向けGCCを作るのに、glibcを用いたcross-compilerの作り方をメモしておく。 Binutilsのコンパイル curl -L ftp://ftp.gnu.org/gnu/binutils/binutils-2.40.tar.gz | tar xz && \ cd binutils-2.40 && \ mkdir build && \ cd build && \ ../configure …

RISC-Vのベクトル命令の一覧ページを作っている

RISC-Vのベクトル命令は死ぬほど種類が豊富で、どういう命令が存在しているのかを調査するのだけでも非常に時間がかかる。 そこで、RISC-Vのベクトル拡張命令をHTML形式で参照することのできるページを作ることにした。 とりあえず、ベクトル・メモリアクセ…

RISC-V の Bit-manipulation の仕様をウェブから参照できるページを作った(日本語化中)

RISC-VのBit Manipulationについて自分で理解するために、ウェブ上でマニュアルを参照できるページを作った。 最終的に日本語化しておきたいが、まだその途中だ。 msyksphinz-self.github.io github.com こう見てみると、Bit Manipulationは結構たくさん定義…

RISC-V の Bit-manipulation (1.0.0)の使用について概観する

このブログではしばらくRISC-VのBit-manipulationについて取り扱っていなかったのだが、ちょっと調べる必要があったので、現在定義されている命令を調べてみることにした。 github.com 現在の仕様によると、Frozenな命令使用は大きく以下のグループに分けら…

GAP Benchmarkのグラフ変換用ツールconverterについて解析

GAP Benchmarkのグラフを変換するツールconverterが何をしているのかちょっと見ておく。 ./converter -f benchmark/graphs/raw/twitter.el -b benchmark/graphs/twitter.sg ./converter -f benchmark/graphs/raw/sk-2005/sk-2005.mtx -b benchmark/graphs/we…

QEMUにおいてLinux User Modeのバイナリをビルドする方法

QEMUにはLinux User ModeとSystem Modeがあるのだが、それぞれのビルド方法をまとめておく。 User ModeのQEMUのビルドはriscv64-linux-userを追加するのがポイント。 git clone https://gitlab.com/qemu-project/qemu.git cd qemu mkdir build cd build ../c…

GAP Benchmarkの各プログラムの構成について (cc.cc)

GAP Benchmarkの各プログラムの中身を調べている。cc.ccについて調べた。 CC (Connected Components) : 連結成分 連結成分は、グラフの中でつながっているグループをまとめ上げる作業。 連結しているノードをグループ化し、最終的に連結していないグループで…

LLVM18系でRISC-VのAuto-vectorizationがどの程度性能向上したかを確認する

LLVMの18系ではRISC-VのAuto-vectorizationに手を加えられているという話を聞いたので、少しベンチマークを動かして試してみた。 使ったのは最近ハマっているGAP Benchmarkのコンパイルで、LLVM18(まだ開発中)のバージョンは f9da447fa791c078dcae52e48dcd03…

GAP Benchmarkの各プログラムの構成について (pr.cc)

GAP Benchmarkの各プログラムの中身を調べている。sssp.ccについて調べた。 pr: PageRank とりあえずWikipediaでPageRankについて調べてみる。 ja.wikipedia.org 定義式を眺める: : ページAにリンクしているページ$T{n}$のページランク。仮にページAに対し…

GAP Benchmarkの各プログラムの構成について (sssp.ccのソースコード)

GAP Benchmarkの各プログラムの中身を調べている。sssp.ccについて調べた。 sssp: Single source shortest path SSSPのコードをもうちょっと読み解いていこうと思う。 github.com 重要な変数: distベクトル:各ノードまでの最短距離を保持する。つまり、始…

GAP Benchmarkの各プログラムの構成について (sssp.cc)

GAP Benchmarkの各プログラムの中身を調べている。sssp.ccについて調べた。 sssp: Single source shortest path いわゆる一般的なグラフ問題で、あるノード(1点:single)からすべてのノードに対する最短距離を検出するためのアルゴリズムを総じてSSSPと呼ぶ…