FPGA開発日記

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

Binary Translation型エミュレータを作る(Compressed命令の実装検討)

Binary Translation型のエミュレータをRustで作るプロジェクト、ある程度ベンチマークテストも動くようになってきたので、次なる大物はCompressed命令のサポートだろう。Compressed命令はRISC-Vの命令系列の中でも16ビット長のもので、一般的な32ビットの命…

QEMU5.1.0でRISC-Vバイナリの動かし方調査 (2. Dhrystone調査)

前回の続き。同じようにメモリマップを変更したDhrystoneをコンパイルして実行する。 diff --git a/bsp/qemu-sifive-u54/metal-platform.h b/bsp/qemu-sifive-u54/metal-platform.h index cd1e5e3..2f5f89a 100644 --- a/bsp/qemu-sifive-u54/metal-platform…

AArch64版QEMUとUbuntuを使用してARM版Linuxを立ち上げる

ここでやりたいことは、これまで作って生きているRust版RISC-VエミュレータをARMアーキテクチャ上で動かすということだ。現在の私のRISC-Vエミュレータは変換後の機械語がX86限定になっているため、ARM上では動かないのは至極当たり前のことだ。そこで、ARM…

QEMU5.1.0でRISC-Vバイナリの動かし方調査

前回QEMUでとりあえずprintf()を扱うための簡単なサンプルは無いかと探していたのだが、どうやらfreedom-e-sdkがかなり使い物になっているようで、これを試してみることにした。 $ git clone https://github.com/sifive/freedom-e-sdk.git $ cd freedom-e-sd…

QEMU5.1.0でのRISC-Vテストの動かし方とOpenSBIについて

ふとした理由でQEMU5.1.0でRISC-Vのテストコードを動かしたくてやり方をいろいろと調べていたのだがどうも見つからない。とりあえず以下のオプションを足してテストコードを動かしてみる。 $ git checkout v5.1.0 $ ../configure --target-list=riscv64-soft…

Binary Translation型エミュレータを作る(Dhrystoneを動かす)

Rustで作るBinary Translation型のエミュレータ、基本的な機能はかなり備わってきて、システムコールも一部サポートしたので次はベンチマークテストを動かそう。まずはDhrystoneだろう。printf()が動くようになったのでDhrystoneは問題なく動くはずだ。 $ ca…

Binary Translation型エミュレータを作る(システムコールのサポート検討)

Rustで作るBinary Translation型のエミュレータ、基本的な機能はかなり備わってきたのだが、ここまで来るとテストパタンを動かしてみたい。RISC-Vのテストベンチとしては代表的なものにriscv-testsのbenchmarksディレクトリのテストパタンが挙げられるが、こ…

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

Binary Translation型のエミュレータの開発続き。今回は久しぶりに浮動小数点に戻って、FCVT命令を実装する。 FCVT命令は、すべてSoftfloatでの実装となる。FCVT.xx命令をデコードすると、すべてFCVTのヘルパー関数にジャンプし、そこで処理を行うことになる…

PolarFire SoC Icicle Kitを試す(2)

PolarFile SoC Icicle Kitの続き。Linuxのブートは成功したが、このLinuxはOpenEmbeddedの最小構成のものらしい。かろうじてGCCは入っているようだが、gitコマンドなどは入っていない。LANポートは持っているのでネットワークに接続することは出来るが、それ…

PolarFire SoC Icicle Kitを試す(1)

MicrochipのFPGA評価ボードであるPolarFire SoC Icicle Kitを購入してから一か月くらい忙しくて放置してしまっていた。 しかしずっと放置していてもしょうがないので、電源を入れて使ってみることにした。 PolarFire SoC Icicle Kitの詳細については、FPGA部…

Chiselで作る最小構成のDiplomacy

Diplomacyとは、モジュール間のパラメータを調停するためのフレームワーク。Chisel自体の機能ではなく、Chisel+Scalaを使って実装されている。「Diplomacy」という名前が示す通り、モジュール間でパラメータを「外交」して、調停することができるフレームワ…

Binary Translation型エミュレータを作る(ジャンプ命令の修正)

Binary Translation型のエミュレータを開発している。変数の定義方法抜本的に作り直したので、命令の生成方法を修正している。ロードストア命令については修正が完了したので、次はジャンプ命令などの修正を行っていく。 JALR命令 JALR命令は書き込みレジス…

Binary Translation型エミュレータを作る(ロードストア命令全修正)

前回のブログではBinary Translation型のエミュレータの実装において、いくつかの命令を新しいTCG形式に書き直した。これをすべてのメモリアクセス命令について修正していこうと思う。RISC-Vには以下のロードストア命令が定義されている。 命令 アセンブリ言…

Binary Translation型エミュレータを作る(Bitmapsを使ってレジスタアロケータを書き直す)

Binary Translation型のRISC-Vエミュレータを作っている。現在のTCGは、レジスタを直接指定するのではなくアロケートする仕組みになっている。このアロケーション処理をもう少し簡単に記述できるようにするため、Rustのビットマップの機能を使ってみた。 Rus…

Binary Translation型エミュレータを作る(ストア命令をTCGで書き直す)

Binary Translation型のRISC-Vエミュレータを作っている。これまで、Binary Translationのための中間表現であるTCGは、かなりx86に近い構造になっていたが、より一般的な構造としてTCGをより細かな粒度に変換している。新しいTCGを使ってメモリアクセス命令…

Binary Translation型エミュレータを作る(ロード命令を新しいTCGで書き直す)

Binary Translation型のRISC-Vエミュレータを作っている。これまで、Binary Translationのための中間表現であるTCGは、かなりx86に近い構造になっていたが、より一般的な構造としてTCGをより細かな粒度に変換している。新しいTCGを使ってメモリアクセス命令…

Binary Translation型エミュレータを作る(レジスタ自動アサインを考える2)

前回のレジスタ自動アサインでとりあえず2レジスタの加算はできるようになったが、次は1レジスタと即値をもつ命令の生成方法を考える。TCGのオペレーション自体は変えたくないので、sourceオペランドの属性だけ変えて、命令生成時に属性によって生成する命令…

Binary Translation型エミュレータを作る(ホストマシンのレジスタ自動アサインを考える)

Rustで開発しているBinary Translation型のエミュレータはRISC-Vのゲストコードを翻訳してx86_64のホストコードに変換している。RISC-Vのゲストコードはすでにレジスタ阿新済みなので何も考える必要はないが、ホストコードを生成する場合、x86_64のどのレジ…

Parameter / Conifgで作るコンフィグレーション可能なChiselデザイン

upによるパラメータのオーバーライド 前回から調査しているChiselデザインのParameterization、site(), here(), up()の調査の中で、今回はup()の調査を行う。 up()の使用方法は、とりあえずサンプルデザインを見るのがいいだろう。以下では、Adder()とMul()…

Binary Translation型エミュレータを作る(MUL/DIV命令の実装)

Binary Translation方式の命令セットエミュレータのRust実装をしている。いくつかのベンチマークを動かすために、乗除算命令を実装しなければならない。これまでサボっていたので実装方法を検討していく。 RISC-Vには以下の乗除算命令が定義されている。MUL…

Parameter / Conifgで作るコンフィグレーション可能なChiselデザイン2

複数のConfigを組み合わせる 前回のパラメータは、いくつかのコンフィグレーションを組み合わせて新しいコンフィグレーションを作り上げることができる。例えば以下の2つのConfigを組み合わせて新しいConfigを作り上げることができる。 class Bus32BitConfig…

Binary Translation型エミュレータを作る(TCGのキャッシュ化による高速化)

Binary Translation方式の命令セットエミュレータのRust実装をしている。前回、ロードストア命令をTLBに対応させて高速化した。これに続いて、命令用のTCGをキャッシュ化により高速化させる。これまでは命令を変換する際にキャッシュを持たず常にTCG変換を行…

Parameter / Conifgで作るコンフィグレーション可能なChiselデザイン

Chiselのアドバンスドな使い方はDiplomacy / Parameters / Configあたりを使いこなすことだと言われる。ParametersとConfigについては何となく理解しているつもりだが具体的なサンプルを使って確かめていなかったのでいくつか調査している。 最もシンプルな…

Binary Translation型エミュレータを作る(MMUをストア命令に対応させる)

Binary Translation方式の命令セットエミュレータのRust実装をしている。前回、ロード命令の実装をTLBに置き換えた。これによりTLBキャッシュにヒットした場合はロード命令の動作が高速化され、高速命令実行が可能になる。今度はこれをストア命令に対応させ…

Binary Translation型エミュレータを作る(MMUアクセスをTCG化)

Binary Translation方式の命令セットエミュレータのRust実装をしている。前回、MMUへのアクセスをすべてヘルパー関数で実現することができたが、もちろんこれで終わることは出来ない。ヘルパー関数はRustのプログラムでメモリアクセスが発生すると常にそれが…

Binary Translation型エミュレータを作る(メモリアクセス命令のMMU実装)

Binary Translation方式の命令セットエミュレータのRust実装をしている。仮想アドレス変換機能を使ってRISC-Vのロードストア命令の実装を行っている。実装後にテストパタンを流しながらバグを取っているが、いくつか問題になった部分がある。 通常命令実行中…

最小構成で学ぶChisel & Diplomacy

Diplomacyを使ってみるために、最小構成を考えてみよう。上記の2つのPusher(リクエスト挿入するためのモジュール)を介してMemoryに接続する。 下記のソースコードはいくつか説明しておいた方が良い。 まず、pusher1, ifu, xbar, memoryはLazyModuleとして…

Chisel & Diplomacyの考え方

ChiselはScalaをベースとしたハードウェア記述言語で、ソフトウェア開発言語をベースにしている分だけ柔軟に記述できたり、Verilogなのでは不可能な面白い記述ができたりする。 Chisel自体でも十分ハードウェア設計をすることは可能なのだが、よりChiselを柔…

ChiselとDiplomacyを使ってオリジナルデザインを作成してみる (3. 外部モジュールとの接続方法検討)

前回の続き。Diplomacyを使って実際にいくつかデザインを作ってみようと思った。Diplomacyを使えばデバッグユニットをその場で生成して、さらに外部と接続して制御したい。そんなデザインを作ってみよう。 CoreComplexモジュールの作成 まずはコアの部分を作…

ChiselとDiplomacyを使ってオリジナルデザインを作成してみる (2. Rocket-Chipの確認)

Diplomacyの勉強をしていて、さてRocket-Chipの場合はどのようにして外部インタフェースと接続しているのか、具体的にはどのようにELFファイルなどのテストパタンをロードしているのか気になってきたので調査してみた。 Verilatorの場合 Verilatorはシミュレ…