FPGA開発日記

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

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

ET&IoT 2020 テクニカルセッションの発表動画が公開されました

ET&IoT 2020は今年はコロナウイルスの影響でデジタル開催されています。カンファレンスプログラムについては、全て動画にて公開されています。 今年も私は「ますます注目されるオープンソース命令セットアーキテクチャRISC-Vの最新動向」(実は前回とタイトル…

Chisel+Diplomacyの構成で自作CPUからの命令フェッチを確認

Chiselを使ったDiplomacyのデザイン作成、ELFファイルのメモリへのロードパスは完成したので、CPUからフェッチを実行してみる。 CPUはメモリロード中はリセットしており、これを解除するためのシーケンスを作成する。特定のメモリアドレスにアクセスするとCP…

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

Binary Translation型エミュレータを作る(Compressed命令の実装3) 前回Compressed命令のフレームワークは完成したので後はひたすら命令を追加していくだけとなる。メモリアクセス命令の実装を行った。 メモリアクセス命令については、ソースオペランドがSP固…

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

前回Compressed命令のフレームワークは完成したので後はひたすら命令を追加していくだけとなる。算術演算命令の実装を行った。 Compressed命令はレジスタフィールドの取り扱いに一貫性が無いので、レジスタの読み取り方法が難しい。C.ADD命令は5ビットを用い…

Chisel+Diplomacyの構成で外部からELFファイルをロードしてメモリに格納するパスを作成

Chiselを使ったDiplomacyのデザイン作成、今回はあまりDiplomacyは関係なく、ELFファイルをロードしてメモリに書き込むためのプログラムを作成する。 ELFをロードして解析するプログラムはC++製のものを前に作ったものから取り寄せてきた。ELFをロードするプ…

Chisel + Diplomacyで自作SoCを設計する検討 (2. 外部メモリアクセスのためのインタフェースを作る)

Chiselを使ったDiplomacyのデザイン、久しぶりに再開した。Chisel + Diplomacyを使って簡単なSoCを作ってみているが、まずは外部からメモリにデータを書き込むパスが必要だろう。これについて検討する。 Rocket-ChipなどのSoC構成では、DTMというモジュール…

Chisel + Diplomacyで自作SoCを設計する検討

Chiselを使ったDiplomacyのデザイン、久しぶりに再会した。いくつか例を作ってみたいと思うので、大昔に作った自作のRISC-V Chisel CPUコアをDiplomacyで載せ替えて、簡単にバス接続が実現できる様子を観察してみたい。 まず、大昔に用意したCPUコアは以下の…

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

前回Compressed命令のフレームワークは完成したので後はひたすら命令を追加していくだけとなる。今日は以下の命令を実装。 C.LW C.LD C.SW C.SD C.ADDI C.ADDI16SP メモリアクセス系はあまり気にせずに実装した。というかこれまでの32ビット版の実装があるの…

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()…