2020-11-01から1ヶ月間の記事一覧
ET&IoT 2020は今年はコロナウイルスの影響でデジタル開催されています。カンファレンスプログラムについては、全て動画にて公開されています。 今年も私は「ますます注目されるオープンソース命令セットアーキテクチャRISC-Vの最新動向」(実は前回とタイトル…
Chiselを使ったDiplomacyのデザイン作成、ELFファイルのメモリへのロードパスは完成したので、CPUからフェッチを実行してみる。 CPUはメモリロード中はリセットしており、これを解除するためのシーケンスを作成する。特定のメモリアドレスにアクセスするとCP…
Binary Translation型エミュレータを作る(Compressed命令の実装3) 前回Compressed命令のフレームワークは完成したので後はひたすら命令を追加していくだけとなる。メモリアクセス命令の実装を行った。 メモリアクセス命令については、ソースオペランドがSP固…
前回Compressed命令のフレームワークは完成したので後はひたすら命令を追加していくだけとなる。算術演算命令の実装を行った。 Compressed命令はレジスタフィールドの取り扱いに一貫性が無いので、レジスタの読み取り方法が難しい。C.ADD命令は5ビットを用い…
Chiselを使ったDiplomacyのデザイン作成、今回はあまりDiplomacyは関係なく、ELFファイルをロードしてメモリに書き込むためのプログラムを作成する。 ELFをロードして解析するプログラムはC++製のものを前に作ったものから取り寄せてきた。ELFをロードするプ…
Chiselを使ったDiplomacyのデザイン、久しぶりに再開した。Chisel + Diplomacyを使って簡単なSoCを作ってみているが、まずは外部からメモリにデータを書き込むパスが必要だろう。これについて検討する。 Rocket-ChipなどのSoC構成では、DTMというモジュール…
Chiselを使ったDiplomacyのデザイン、久しぶりに再会した。いくつか例を作ってみたいと思うので、大昔に作った自作のRISC-V Chisel CPUコアをDiplomacyで載せ替えて、簡単にバス接続が実現できる様子を観察してみたい。 まず、大昔に用意したCPUコアは以下の…
前回Compressed命令のフレームワークは完成したので後はひたすら命令を追加していくだけとなる。今日は以下の命令を実装。 C.LW C.LD C.SW C.SD C.ADDI C.ADDI16SP メモリアクセス系はあまり気にせずに実装した。というかこれまでの32ビット版の実装があるの…
Binary Translation型のエミュレータをRustで作るプロジェクト、ある程度ベンチマークテストも動くようになってきたので、次なる大物はCompressed命令のサポートだろう。Compressed命令はRISC-Vの命令系列の中でも16ビット長のもので、一般的な32ビットの命…
前回の続き。同じようにメモリマップを変更した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…
ここでやりたいことは、これまで作って生きているRust版RISC-VエミュレータをARMアーキテクチャ上で動かすということだ。現在の私のRISC-Vエミュレータは変換後の機械語がX86限定になっているため、ARM上では動かないのは至極当たり前のことだ。そこで、ARM…
前回QEMUでとりあえずprintf()を扱うための簡単なサンプルは無いかと探していたのだが、どうやらfreedom-e-sdkがかなり使い物になっているようで、これを試してみることにした。 $ git clone https://github.com/sifive/freedom-e-sdk.git $ cd freedom-e-sd…
ふとした理由でQEMU5.1.0でRISC-Vのテストコードを動かしたくてやり方をいろいろと調べていたのだがどうも見つからない。とりあえず以下のオプションを足してテストコードを動かしてみる。 $ git checkout v5.1.0 $ ../configure --target-list=riscv64-soft…
Rustで作るBinary Translation型のエミュレータ、基本的な機能はかなり備わってきて、システムコールも一部サポートしたので次はベンチマークテストを動かそう。まずはDhrystoneだろう。printf()が動くようになったのでDhrystoneは問題なく動くはずだ。 $ ca…
Rustで作るBinary Translation型のエミュレータ、基本的な機能はかなり備わってきたのだが、ここまで来るとテストパタンを動かしてみたい。RISC-Vのテストベンチとしては代表的なものにriscv-testsのbenchmarksディレクトリのテストパタンが挙げられるが、こ…
Binary Translation型のエミュレータの開発続き。今回は久しぶりに浮動小数点に戻って、FCVT命令を実装する。 FCVT命令は、すべてSoftfloatでの実装となる。FCVT.xx命令をデコードすると、すべてFCVTのヘルパー関数にジャンプし、そこで処理を行うことになる…
PolarFile SoC Icicle Kitの続き。Linuxのブートは成功したが、このLinuxはOpenEmbeddedの最小構成のものらしい。かろうじてGCCは入っているようだが、gitコマンドなどは入っていない。LANポートは持っているのでネットワークに接続することは出来るが、それ…
MicrochipのFPGA評価ボードであるPolarFire SoC Icicle Kitを購入してから一か月くらい忙しくて放置してしまっていた。 しかしずっと放置していてもしょうがないので、電源を入れて使ってみることにした。 PolarFire SoC Icicle Kitの詳細については、FPGA部…
Diplomacyとは、モジュール間のパラメータを調停するためのフレームワーク。Chisel自体の機能ではなく、Chisel+Scalaを使って実装されている。「Diplomacy」という名前が示す通り、モジュール間でパラメータを「外交」して、調停することができるフレームワ…
Binary Translation型のエミュレータを開発している。変数の定義方法抜本的に作り直したので、命令の生成方法を修正している。ロードストア命令については修正が完了したので、次はジャンプ命令などの修正を行っていく。 JALR命令 JALR命令は書き込みレジス…
前回のブログではBinary Translation型のエミュレータの実装において、いくつかの命令を新しいTCG形式に書き直した。これをすべてのメモリアクセス命令について修正していこうと思う。RISC-Vには以下のロードストア命令が定義されている。 命令 アセンブリ言…
Binary Translation型のRISC-Vエミュレータを作っている。現在のTCGは、レジスタを直接指定するのではなくアロケートする仕組みになっている。このアロケーション処理をもう少し簡単に記述できるようにするため、Rustのビットマップの機能を使ってみた。 Rus…
Binary Translation型のRISC-Vエミュレータを作っている。これまで、Binary Translationのための中間表現であるTCGは、かなりx86に近い構造になっていたが、より一般的な構造としてTCGをより細かな粒度に変換している。新しいTCGを使ってメモリアクセス命令…
Binary Translation型のRISC-Vエミュレータを作っている。これまで、Binary Translationのための中間表現であるTCGは、かなりx86に近い構造になっていたが、より一般的な構造としてTCGをより細かな粒度に変換している。新しいTCGを使ってメモリアクセス命令…
前回のレジスタ自動アサインでとりあえず2レジスタの加算はできるようになったが、次は1レジスタと即値をもつ命令の生成方法を考える。TCGのオペレーション自体は変えたくないので、sourceオペランドの属性だけ変えて、命令生成時に属性によって生成する命令…
Rustで開発しているBinary Translation型のエミュレータはRISC-Vのゲストコードを翻訳してx86_64のホストコードに変換している。RISC-Vのゲストコードはすでにレジスタ阿新済みなので何も考える必要はないが、ホストコードを生成する場合、x86_64のどのレジ…
upによるパラメータのオーバーライド 前回から調査しているChiselデザインのParameterization、site(), here(), up()の調査の中で、今回はup()の調査を行う。 up()の使用方法は、とりあえずサンプルデザインを見るのがいいだろう。以下では、Adder()とMul()…