2020-09-01から1ヶ月間の記事一覧 - FPGA開発日記

FPGA開発日記

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

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

Binary Translation型エミュレータを作る(Fused-Multiply-Add向けヘルパー関数の実装)

Binary Translation方式のエミュレータをRustで作る実装、浮動小数点命令を実装している。加減算命令については特に問題なく実装が進んだのだが、FMADDなどの3オペランド命令の実装についてサポートを追加した。FMADD.DなどのFused Multiply-Add命令は入力オ…

Binary Translation型エミュレータを作る(softfloatクレートの実装変更)

Binary Translation方式のエミュレータをRustで作る実装、浮動小数点命令を実装している。浮動小数点演算はsoftfloatを使用しており、Rustでもいくつかのcrateが公開されているためこれを活用している。 テストパタンを試行していたのだが、riscv-testsが通…

Binary Translation型エミュレータを作る(浮動小数点演算の実装)

自作Binary Translationエミュレータの実装、浮動小数点レジスタへのロードストア命令の実装が完了したので、次は演算命令の実装だ。簡単なところから、FADD.D(倍精度浮動小数点加算命令)から実装して行きたい。 さて、C++で記述されたsoftfloatをどのよう…

Binary Translation型エミュレータを作る(浮動小数点演算の検討)

Binary Translation方式のエミュレータ開発、RISC-Vの基本命令については一通り実装が完了した。次はどちらの方向に進むかということだが、いくつか考えられるのは、 浮動小数点命令のサポート 仮想アドレスのサポート Compressed 命令のサポート AArch64ホ…

Binary Translation型エミュレータを作る(AArch64に対応するために)

Binary Translation型のエミュレータを作っている。今のところRISC-Vのバイナリをx86に直接バイナリ変換して実行することができるようになった。riscv-testsの一部を実行してx86上でPassできるようになっている。 QEMUはもともとマルチプラットフォーム向け…

QEMUはどのように浮動小数点命令をエミュレートしているのか

QEMUはゲストマシンの機械語をホストマシンの機械語に直接翻訳して(Binary Translation)実行することで高速動作を実現しているのだが、整数命令の場合はこれで問題ない。しかし浮動小数点命令の場合はどうだろう?RISC-Vとx86では浮動小数点命令の丸めの扱い…

Binary Translation型エミュレータを作る(riscv-testsのパタンを通していく)

Binary Translation型のエミュレータをRustで自作する話、徐々にテストパタンが安定して動作するようになっている。64ビット整数命令のパタンはすべてPassできるようになりたい。 これに伴っていくつかの実装変更を行った。これまではCSRRW命令などは専用のT…

GoogleのSystemVerilog ParserであるVeribleを試す(2)

GoogleのSystemVerilog Parserの続き。さらにいくつかコマンドがあるので探っていく。 verible-verilog-syntax これがおそらくSyntax解析エンジンの最も中心的なコマンドであろう。Verilogファイルを読み取って階層構造を出力する。階層構造を出力するために…

GoogleのSystemVerilog ParserであるVeribleを試す(1)

GoogleがSystemVerilogのParserを開発していた。見つけたきっかけはGoogleのRISC-V向けランダムパタン生成ツールであるRISCV-DVを調査していたのだが、その最中に見つけたものだった。 github.com github.com 余談であるがriscv-dvの方はUVMをサポートできる…

Binary Translation型エミュレータを作る(riscv-testsのパタンを通していく)

Binary Translation型エミュレータにおいてシフト命令を実装した。Binary Translation型エミュレータでは、ゲストマシンの命令(今回はRISC-V)からホストマシンの命令(今回はx86)に直接変換することで高速実行を可能にするシミュレータだ。 前回ついにriscv-t…

Binary Translation型エミュレータを作る(RISC-Vテストパタンを動かす)

Binary Translation型エミュレータにおいてシフト命令を実装した。Binary Translation型エミュレータでは、ゲストマシンの命令(今回はRISC-V)からホストマシンの命令(今回はx86)に直接変換することで高速実行を可能にするシミュレータだ。 CSR命令などのPriv…

Binary Translation型エミュレータを作る(Helper Function Call機能の実装)

Binary Translation型エミュレータにおいてシフト命令を実装した。Binary Translation型エミュレータでは、ゲストマシンの命令(今回はRISC-V)からホストマシンの命令(今回はx86)に直接変換することで高速実行を可能にするシミュレータだ。 次に実装するのは…

Binary Translation型エミュレータを作る(シフト命令の実装)

Binary Translation型エミュレータにおいてシフト命令を実装した。Binary Translation型エミュレータでは、ゲストマシンの命令(今回はRISC-V)からホストマシンの命令(今回はx86)に直接変換することで高速実行を可能にするシミュレータだ。 現在実装している…

Binary Translation型エミュレータを作る(テスト環境の用意)

はじめに RustでBinary Translation型エミュレータを作っている。Binary Translation型エミュレータの特徴は、ゲストのマシンコード(例えばRISC-Vなど)をホストマシン(例えばx86)で実行する場合に、RISC-Vのマシンコードをそれと等価なx86コードに変換す…

Binary Translation型エミュレータを作る(システムレジスタアクセスの実装)

Binary Translation型エミュレータにおいてシステムレジスタアクセスを実装している。システムレジスタアクセスのためのCSR命令は、Helper関数を呼び出してRustの関数側で複雑な処理を実行する。前回は関数の呼び出し側を実装し、Rustの簡単な関数を呼び出す…

Binary Translation型エミュレータを作る(システムレジスタアクセスを実現するためのホストコードジャンプ)

QEMUがRISC-VのCSR命令をエミュレートする仕組み QEMUが複雑な命令をエミュレートする場合、TCG(Tiny Code Generator)によるx86命令への直接的な変換を行うだけでなく、ホストコードのサポート関数を直接呼び出してその実行を肩代わりする場合がある。例えば…

RISC-V Vector Extension v1.0で追加される新規仕様について

RISC-V Vector Extension v0.9がすでにStableになっているが、v1.0がReadyに入りつつある。すでにGitHubのドキュメントはv1.0のリリースに向けて改変が行われており、いくつかの新規追加事項についてはすでにアップデートが完了している。 v1.0とv0.9の差分…

QEMUで使用されているマルチターゲットディスアセンブラcapstoneを調査する

QEMUについて調査している。x86のコードをどのようにディスアセンブルしているのかを調査していると、gitのサブモジュールとしてcapstoneというツールが使われていることが分かった。capstoneは、マルチターゲットのディスアセンブラらしい。ディスアセンブ…

Binary Translation型エミュレータを作る(メモリアクセス命令をどのように実現するか)

Binary Translation型エミュレータにおいてメモリアクセス命令をどのように実現するかについて纏めておこう。RISC-Vのバイナリからx86の命令に変換して実行する方法をまとめておく。この方式は基本的にQEMUで実現されている方式に基づいているが、初期の実装…

Binary Translation型エミュレータを作る(ストア命令の実装)

RustでBinary Translation型エミュレータを作っている。Binary Translation型エミュレータの特徴は、ゲストのバイナリ形式(RISC-Vなど)をホストのバイナリ形式(x86など)に実行時に変換するタイプのエミュレータである。今回はホストとしてはx86、ゲストとし…

Binary Translation型エミュレータを作る(ロード命令の実装)

RustでBinary Translation型エミュレータを作っている。Binary Translation型エミュレータの特徴は、ゲストのバイナリ形式(RISC-Vなど)をホストのバイナリ形式(x86など)に実行時に変換するタイプのエミュレータである。今回はホストとしてはx86、ゲストとし…

QEMUによるメモリアクセスを実現する仕組み

QEMUによる分岐命令の実現方法が分かったので、次はロードストア命令について実現方法を見ていきたいと思う。例えばRISC-VにおけるLD命令とSD命令を実行する場合、どのようにx86命令に変換されるのだろうか? LD x10, 0(data) SD x10, 8(data) 以下のような…

Binary Translation型のエミュレータを作る(条件分岐命令の実装)

Rustで実装しているBinary Translation型エミュレータ、分岐命令を実装するための方針を考える。分岐命令は基本的に以下のような方針で組み立てることにする。 比較する値をレジスタにロードしてくる。 cmp命令により比較を実行する。 分岐命令の種類に応じ…

SystemVerilogの階層構造把握のためのsvinstを試す

Chiselが生成するVerilogファイルはとにかく長い。 ファイルを1つにまとめて生成するというのもあるが(モジュール毎に分割するオプションも存在するのでこれは問題ではないけど)、1つ1つのモジュールも大きくなりがちで、解析に非常に時間がかかる。 Chisel…

QEMUが分岐命令を処理する仕組み(Relocationによるラベルの解決)

QEMUで分岐命令を取り扱う場合、主に以下のような手順で取り扱われることを見てきた。 source1に新しいオペランドを確保する。gen_get_gpr(source1, a->rs1)によりsource1にrs1の情報を格納する。 source2に新しいオペランドを確保する。gen_get_gpr(source2…

Binary Translation型エミュレータを作る(Dynamic Translation部分のデバッグ方法)

自作Binary Translation型エミュレータを作っている。RISC-Vの命令を入力するとそれをx86に変換しそのままホストマシンで実行することでインタプリタ型のエミュレータよりも高速に動作することを期待したものだ。前回実行すべきブロックのプロローグ・エピロ…

Binary Translation型エミュレータを作る(プロローグ・エピローグの分離)

前回は、QEMUの分岐命令の取り扱いについて確認していた。今回はこれを自作Binary Translationエミュレータに実装することを考える。 まずはシンプルに考えた方が良さそうだ。基本的な実装方針について確認する前に、少し追加の実装を行う必要があるためこれ…

QEMUのTCG(Tiny Code Generator)を読み解く(7. QEMUの分岐命令の取り扱い)

QEMUの調査続き。次は分岐命令をどのように処理しているのか見ていこう。 例えばBEQ命令がどのようにx86に処理されるのかを見てみよう。 qemu/target/riscv/insn_trans/trans_rvi.inc.c static bool trans_beq(DisasContext *ctx, arg_beq *a) { return gen_…

Intel Advanced Matrix Extension(AMX)とは何なのか

遅ればせながらIntel Advanced Matrix Extension(AMX)の資料を読み漁ってみた。参考にしたのは以下の資料。 Intel® Architecture Instruction Set Extensions and Future Features Programming Reference https://software.intel.com/content/dam/develop/pu…

Binary Translation型エミュレータを作る(64ビット演算への拡張)

Binary Translation型エミュレータを作っている。ゲストマシンはRISC-Vで、ホストマシンはx86である。ADDI命令は簡単なものであれば実装できるようになった(ソースレジスタがx0の場合に限る)。どんどん実装を進めていこう。次はLUI命令の問題だ。現在x86命令…