FPGA開発日記

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

2020-12-01から1ヶ月間の記事一覧

年末なので今年のまとめをしよう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…

日経XTECH テクノ大喜利に寄稿しました

日経エレクトロニクスのXTECH、テクノ大喜利のお題「CPUメーカが描くFPGAの未来」というお題目に寄稿させて頂きました。 このテクノ大喜利は日経エレクトロニクスで連載されているときから面白くて読んでいたのだけれども、まさか自分が寄稿することになると…

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

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

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

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

RISC-V勉強会@Online 2020 12/18の発表資料をアップロードしました

RISC-V勉強会@Online 2020 12/18の発表資料をアップロードしました。アップロード場所は、私のブログなどの資料を保管している以下のGitHub Sitesです。 msyksphinz.github.io RISC-V勉強会に参加いただきありがとうございました。私の発表は「RISC-V」とい…

LLVMのRISC-V Vector Extensionのサポート状況を確認する

ふと気になって、LLVMにおけるRISC-VのVector Extensionのサポート状況を確認しようと思った。 LLVMはRISC-Vをすでにサポートしているが、Vector Extensionはどこまでサポートしているのか分からない。確認してみよう。 リビジョンは75f98f0f8c813a0cffb130b…

OpenHWのCVA6(Ariane)を試す

OpenHWのCVA6は昔Arianeと名付けられていたが、OpenHWにより管理されるようになり名称がCVA6と変更された。 RISC-V Summit 2020でもOpenHWの発表があり、そういえばどうなったかなと思い再度試してみることにした。 昔試してみたときの記事はこちら。 msyksp…

自作Binary Translation型RISC-Vエミュレータのマルチスレッド化

前回QEMUを解析しながら、QEMUがBlock Chainingという技術で直接TCG間をジャンプしていること、そしてメインスレッドとモニタスレッドが別に走っておりメインスレッドを高速化していることを見た。これを私のエミュレータでも実装してみたい。まずはマルチス…

Rustの並列処理についての勉強

Rustで作る命令セットシミュレータの続き、どうも高速化のためには並列処理について勉強する必要が生じてきた気がするので、Rustで並列処理を実現するための方法について勉強している。 実現したいこととしては: メインスレッドでエミュレーションが実行さ…

Chipyard + TileLink のドキュメントの日本語訳をまとめて公開しました

いきなり話は飛ぶんですが、12月18日の金曜日に「RISC-V勉強会」というオンラインイベントで「ハードウェア記述言語Chiselをもっと活用するためのDiplomacy概説」というタイトルで1時間話をします。 risc-v.connpass.com なお、資料は今作っている最中ですが…

TileLinkを使った自作CPU+多彩なバス接続を考える

ちょっと自作CPUしてみる Chiselを使って自作CPUして、それにTileLinkを接続して簡単なマルチコアシステムを作ってみる。 作ったCPUコア: RV64の簡単な5段パイプライン まともに検証していないけどとりあえずriscv-tests程度は動くCPUコアを作った。 github.…

TCG最適化が施された後にQEMUはどのように割り込み条件を検出しているのか

前回のQEMU解析でBlock Chainingのテクニックにより直接TCG同士をジャンプする方法について調査したが、ここで出てくる疑問は、例えば割り込みの検出やシミュレーションの停止条件など、「一度ホストマシンの制御コードに戻らないと分からないような処理はど…

QEMUのTCG同士を直接接続するBlock Chainingの実現方法調査

QEMUのRustでの再実装、どうにも最適化の方向が良く分からなくなってきた。そこで一度立ち戻ってQEMUがどのような方式でTCGを高速化しているのかを確認してみることにする。 そもそもの疑問は、QEMUを-d in_asmで実行していると途中でログの生成が止まってし…

自作Binary Translation型RISC-VエミュレータのTCG最適化解析

前回の続き。自作Binary Translation型RISC-Vエミュレータの最適化作業をしている。TCGの最適化やRefCellへの書き換えをしてもあまり変わらなかったので、もう何が原因なのか良く分からなくなってきた。とりあえず実行時に発生してしまう細かなメモリコピー…

自作Binary Translation型RISC-VエミュレータのTCG最適化解析

前回の続き。自作Binary Translation型RISC-Vエミュレータの最適化作業、いくつか改善を取り入れたのでflamegraphを用いて最適化の結果を解析する。現状の実装でflamegraphを適用した結果が以下となった。 これをよく見てみると、clone()が多く出てきている…

自作Binary Translation型RISC-VエミュレータのTCG最適化試行

自作Binary Translation型RISC-Vエミュレータで性能向上を図っているが、どうにも上手く行かない。いろんな方法を試行しているのだが、いくつかの試行についてメモをしておこうと思う。 即値生成をEAX以外でもできるようにする 即値生成はEAXに対してのみで…

Chisel + DiplomacyでのCPUコアデバッグ

自作CPUの構成をマルチコアに変更したので、いくつか問題が表面化してしまっている。命令フェッチのシーケンサが1サイクルでメモリの応答が返ってくる仕様になっているのでこれは良くない。修正しよう。シーケンサを拡張してステートマシンを構築した。 val …

Chisel + Diplomacyでのマルチコア構成デバッグ

自作CPUの構成をマルチコアに変更したので、いくつか問題が表面化してしまっている。例えばメモリは1サイクルでアクセスできる仮定にしていたのを、いくつかValid & Readyの方式に実装し直さなければならない。このためには、とりあえずTileLinkにDelayerを…

自作Binary Translation型RISC-Vエミュレータの性能解析

Rustで作っているBinary Translation型のRISC-Vエミュレータ、Dhrystoneを使ってシミュレーション速度の解析を行っている。前回の解析でFNVHashMapを使うことである程度速度の向上が見られたが、より性能を上げるためにはそもそもHashMapを使わなければよい…

自作Binary Translation型RISC-Vエミュレータの性能解析

自作RISC-Vエミュレータの性能解析続き。私はWSL1を使用しているので、Rustの性能解析ツールflamegraphを使用することができない(どうもLinuxのツールが必要で、これがWSL1では使用できないようだ)。 qiita.com AWS上に急遽Rustの環境を構築し、そこでflam…

自作Binary Translation型RISC-VエミュレータでDhrystoneを実行する(2)

前回の続き。いろいろバグを潰しながら、メモリマップを変えつつバイナリを用意して、ついにDhrystoneを最後まで完走させることができた。さて問題の実行速度だが、Dhrystoneで測定してみることにする。比較対象はQEMU、自作RISC-Vエミュレータ、そしてSpike…

Chisel + Diplomacyで作る自作CPU:デバッグモニタ

自作CPUにおいてデバッグモニタというのは常に重要な機能で、私は特に波形を見るのがとても嫌いなのでデバッグ情報はなるべくテキスト形式で出力している。ちなみ今回のデバッグ機能というのはいわゆるJTAGのようなデバッグ機能ではなく、CPUをデバッグする…

自作Binary Translation型RISC-VエミュレータでDhrystoneを実行する

自作Binary Translation型RISC-Vエミュレータは、ある程度RISC-Vの命令セットをサポートできるようになってきており、最大の課題だったCompressed命令のサポートもほぼ完了しつつある。テストパタンも安定してPassできるようになってきたので、次はベンチマ…