FPGA開発日記

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

Chipyardで独自コアシミュレーション環境構築方法の調査 (バス幅拡張とアサーション修正)

テストパタンを流してとりあえず最初のフェッチが上手く行くかどうかを見ていたのだが、どうも以下のアサーションエラーで落ちてしまう。 Assertion failed: 'A' channel Get carries invalid source ID (connected at MSRHTile.scala:163:21) Aチャネルのエ…

Chipyardで独自コアシミュレーション環境構築方法の調査 (Verilatorでシミュレーション実行)

Chipyard環境上で独自CPUコアのシミュレーション環境を構築しようとしているが、いくつか環境の変更を行っている。 src/main/scala/MSRHCoreBlackbox.scala class MSRHCoreBlackbox( xLen: Int ) extends BlackBox with HasBlackBoxResource { val io = IO(n…

Chipyardで独自コアシミュレーション環境構築方法の調査 (ヘテロ構成についての調査)

Chipyardではいくつかのコンフィグレーションが用意されており、欲しい構成に応じてかなり柔軟にVerilogを生成することができる。どのようなコンフィグレーションが生成できるかについては、generators/chipyard/src/main/scala/config/に定義が置かれている…

Chipyardで独自コアシミュレーション環境構築方法の調査 (3. 独自コアの入出力ピンサポート)

RISC-Vコアのシミュレーション環境Chipyardでは、現在Rocket-Chip、BOOM、Arianeがサポートされているが、独自CPUコアをサポートするにあたり入出力ポートを独自CPU向けに改造する必要がある。 まず、ここではまず独自CPU側では以下のインタフェースを使って…

Chipyardで独自コアシミュレーション環境構築方法の調査 (2)

ArianeCoreの生成方法が分かったので、次は独自コアの構成方法について調査してみよう。ここでは、独自のRISC-Vコア MSRH を接続する方法について考えてみる。 この調査の目的は、Chipyardの環境を使えば、CPUコアを設計してインタフェースを統一すれば簡単…

Chipyardで独自コアシミュレーション環境構築方法の調査

Chipyardの環境ではScalaで実装しているRocket-ChipやBOOMコアもインスタンス化することができるが、それ以外にSystemVerilogで実装されているArianeもシミュレーションを実行することができる。 つまり、SystemVerilogで実装した独自CPUコアに対してもChipy…

ChipyardでRISC-VコアArianeを試す

Chipyardには、RISC-VのインオーダCPUであるArianeを試すための環境が用意されている。もともとSubrepoとしてArianeが配置されていたのは知っていたので何らかのビルド・実行できる環境があるとは思っていたが、どうやら本当に実行できるようだ。 ArianeはSy…

富岳のプロセッサA64FXのマイクロアーキテクチャマニュアルを読む(分岐予測)

CPU

チョット分け合ってA64FXのマニュアルを読みなおしている。分岐予測について調べたかったのでもう一度読み直してまとめている。 条件分岐予測には私の理解では大きく2種類があって、 局所分岐予測:条件分岐命令毎に分離した履歴バッファを利用する。つまり…

SonicBOOMのデザインを読み解く (ロードストアのトレースログ)

ロードストアのトレースログについては、以下のオプションを変更してリコンパイルすることで出力されるようになるらしい。リコンパイルには例によってかなり時間がかかってしまうのだけれども。 src/main/scala/common/parameters.scala diff --git a/src/ma…

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

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

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

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

C言語のマクロであんまり使わないけど(低レイヤプログラミングにおいて)猛烈に便利な演算子

これは自分用メモ。 ご存知C言語にはマクロと呼ばれる#defineなどを使ったルール記述が可能だ。有名なものだと#define, #ifdef, #endif などのものだ。これを使えばコンパイル時に様々なオプションでソースコードを改変することができ、グローバルに持たせて…

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は以下のように定義されている…

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

あけましておめでとうございます。今年も、FPGA開発日記をよろしくお願いします。 去年の成果としては、以下のような感じだと思う。自分自身、今年は意外とハードウェアよりも、ソフトウェアよりに移っていると思う。 引き続きRISC-Vをベースとしたエコシス…

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

このブログも始めてから6年が経った。 年末年始なので、今年一年はどうだったかな、ということでまとめてみよう。 今年の元旦には、こんな目標を立てていたのだった。 msyksphinz.hatenablog.com 2020年始に立てた目標 引き続きRISC-Vをベースとしたエコシス…

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

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

フルスクラッチから作って理解するQEMU (Rust編)

モチベーション なぜRustを選んだか? 私はQEMUは「アーキテクチャエミュレーション界のLLVM」だと思っている QEMUが高速な理由:TCG Binary Translation ゲスト命令(RISC-V) → TCG → ホスト命令(x86)の処理をRustで作ろう RISC-Vの命令をフェッチしてデコー…

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

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

自作Binary Translation型RISC-VエミュレータのTB Lookup and Jumpの実装

QEMUのTCG Block Chainingを実装したので、次はもう一つの障害、TB Lookup and Jumpを実装しよう。TB Lookup and Jumpは、TCG Block Chainingではカバーしきれない部分を最適化するものだ。TCG Block Chainingは、あるブロックからあるブロックへ、毎回必ず…

自作Binary Translation型RISC-VエミュレータのTCG Block Chaining実装

QEMUにおけるTCG Block Chainingというのは、TCG(Tiny Code Generator)というゲスト命令のブロックを次々と繋げて、制御側に戻すことなく連続的にTCGを実行することで高速化を図るための技法である。 前回はこれを実装しかけていたのだが、バグに遭遇して最…

自作Binary Translation型RISC-VエミュレータのTCG Block Chaining実装

QEMUにおけるTCG Block Chainingというのは、TCG(Tiny Code Generator)というゲスト命令のブロックを次々と繋げて、制御側に戻すことなく連続的にTCGを実行することで高速化を図るための技法である。TCG Block Chainingについてはこの辺の資料が詳しい。 htt…

自作Binary Translation型RISC-Vエミュレータのデバッグ(Jumpの条件変更)

自作Binary Translation型RISC-Vエミュレータの開発、いい加減本命のTCG Block Chainingを実装しろと言いたいところだが、まだ本来のテストパタンがPASSできなくて地味にデバッグを続けていた。 一つ問題になったのは、本当に時々エミュレーション中にSegmen…