FPGA開発日記

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

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

QEMUに入門してみる(16. 命令デコーダの追加)

前回の続き。所望の場所から命令をフェッチできるようになったので、次は命令デコーダを追加していきたい。QEMUにおける命令デコーダはDSLで記述されており、MYRISCVXの場合はqemu/target/myriscvx/insn32.decodeに置いている。これはRISC-Vにおけるデコーダ…

QEMUに入門してみる(15. QEMUにおけるリセットベクタの追加方法)

前回QEMUのトレース情報を取得しながらシミュレーションをスタートできるようになったが、よく見てみると最初の命令でいきなりIllegal Instructionで例外に飛んでいる。当たり前だ、そこに命令は配置されておらず、しかもデコーダもろくに実装していないので…

QEMUに入門してみる(14. トレース関数の自動生成方法)

QEMUにはトレース出力用の関数を自動的に生成するフレームワークが存在している。これは命令トレースを出力するのとは異なり、各種イベントを取得するためのフレームワークを生成するものだ。 まず、取りたいイベントを定義しなければならない。target/myris…

QEMUに入門してみる(13. 割り込み・例外ハンドラの実装)

QEMUのデバッグ続き。次に落ちたのは以下の部分。GDBで確認する。 $ gdb ${QEMU_BUILD}/myriscvx64-softmmu/qemu-system-myriscvx64 Starting program: ${QEMU_BUILD}/myriscvx64-softmmu/qemu-system-myriscvx64 --machine virt --d in_asm --nographic --k…

RISC-V Vector命令をサポートした自作命令セットシミュレータの実装検討 (4. Unit Strideメモリアクセスの実装)

自作命令セットシミュレータのRISC-V Vector Extensionサポート、とりあえずCSR命令の確認が終わったので先に進めていく。 RISC-V Vector Extensionのメモリアクセスにはいくつか種類があって、大きく分けると3種類。 Unit Stride:最もシンプルなメモリアク…

RISC-V Vector Extension v0.9のCSR仕様2

RISC-Vのベクトル拡張の理解に当たり、複雑怪奇なシステムレジスタを理解するのは大変だ。ここではRISC-Vベクトル拡張が備える謎のシステムレジスタについて一気に解説していきたい。 ちなみに最新のRISC-V Vector Extension 0.9をベースに解説している。 RI…

RISC-V Vector Extension v0.9のCSR仕様1

RISC-Vのベクトル拡張の理解に当たり、複雑怪奇なシステムレジスタを理解するのは大変だ。ここではRISC-Vベクトル拡張が備える謎のシステムレジスタについて一気に解説していきたい。 ちなみに最新のRISC-V Vector Extension 0.9をベースに解説している。 RI…

LLVMの新しい中間言語表現 MLIRを試す(6. MLIRに関する発表資料を読む)

MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com MLIRとLLVM IR MLIRをLLVM IRの代替とし…

LLVMの新しい中間言語表現 MLIRを試す(5. MLIRに関する発表資料を読む)

MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com MLIRをClangで使用する 現在のClangのIR…

LLVMの新しい中間言語表現 MLIRを試す(5. MLIRに関する発表資料を読む)

MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com 次はTensorFlowのExampleの例を見る。Ten…

LLVMの新しい中間言語表現 MLIRを試す(4. MLIRに関する発表資料を読む)

MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com MLIR Infrastructureについて この"Batte…

LLVMの新しい中間言語表現 MLIRを試す(3. MLIRに関する発表資料を読む)

MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com MLIRはMulti-Level Intermediate Representation Comp…

QEMUに入門してみる(12. QEMUでのコールバック関数追加方法の調査)

QEMUの続き。QEMUのRISC-V対応においてバイナリのシミュレーション方法とログの出し方が分かったわけだが、これをMYRISCVXに移植したい。つまり同じコマンドをqemu-system-myriscvx64に適用することを考える。 まずは変換のための初期化関数から。 qemu/targ…

QEMUに入門してみる(11. QEMUでのコールバック関数追加方法の調査)

QEMUの続き。QEMUのRISC-V対応においてバイナリのシミュレーション方法とログの出し方が分かったわけだが、これをMYRISCVXに移植したい。つまり同じコマンドをqemu-system-myriscvx64に適用することを考える。 ./qemu-system-myriscvx64 --machine none --d …

QEMUに入門してみる(10. QEMUでのベアメタルバイナリの実行方法調査)

QEMUの続き。前回、QEMUを使ってLinux向けにコンパイルされたバイナリを実行することができるようになったが、ベアメタルのバイナリを動かすことはまだできていない。目標としてはとりあえずriscv-tests関係のプログラムを動かすことができるようになりたい…

QEMUに入門してみる(9. QEMUでの詳細トレースの出し方)

QEMUの続き。QEMUを使ってRISC-Vのアプリケーションやベンチマークを走らせたい。とりあえずは普通のRISC-Vのバイナリで動作を確認するところから始めよう。 main.c #include <stdio.h> int main() { printf("Hello World\n"); return 0; } $ riscv64-unknown-linux-g</stdio.h>…

QEMUに入門してみる(8. translateに必要な関数の確認)

QEMUの続き。独自ターゲットでビルドしてみる。前回の続き。 gen_load()とgen_store()で使用されている関数を定義しなければならない。 gen_get_gpr():GPRから値を取得する関数。 /* Wrapper for getting reg values - need to check of reg is zero since …

QEMUに入門してみる(7. translateに必要な関数の確認)

QEMUの続き。独自ターゲットでビルドしてみる。前回の続き。 QEMUのデコーダを作っていく。QEMUのデコーダはDSLを使って記述するらしい。translate.cで呼び出されているecode_insn32()を作っていく。 qemu/target/myriscvx/translate.c static void decode_o…

QEMUに入門してみる(6. translateに必要な関数の確認)

QEMUの続き。独自ターゲットでビルドしてみる。前回の続き trans_xxx()の関数がみんな消えてしまったのはおそらく最適化で消されたので、一応念のためDebugビルドしてオブジェクトをダンプしてみた。 $ ../configure --enable-debug --disable-pie --target-…

QEMUに入門してみる(5. translateに必要な関数の確認)

QEMUの続き。独自ターゲットでビルドしてみる。static const TranslatorOps myriscvx_tr_opsで必要な関数を調査する。 必要な関数を確認しながら追加していく。myriscvx_tr_breakpoint_check()の中で、デバッグ例外を発生させることが必要だ。 static bool m…

QEMUに入門してみる(4. 独自コンフィグレーションを用意して必要なファイルを確認)

QEMUの続き。独自ターゲットでビルドしてみる。static const TranslatorOps myriscvx_tr_opsで必要な関数を調査する。 一つずつ見ていこう。myriscvx_tr_init_disas_context()を見てみる。Disasということから、これはディスアセンブル(というかログ?)を…

QEMUに入門してみる(3. 独自コンフィグレーションを用意して必要なファイルを確認)

QEMUの続き。独自ターゲットでビルドしてみる。 次に追加したのはmyriscvx_cpu_fp_enable()である。これはどうも浮動小数点を使用したかを確認するらしい。浮動小数点命令が有効になっていても、mstatus.fsが0になっていればfalseになる。つまりこれはコンテ…

QEMUに入門してみる(2. 独自コンフィグレーションを用意して必要なファイルを確認)

QEMUの続き。独自ターゲットでビルドしてみる。myriscvx64コンフィグレーションを用意した。 MYRISCVXCPUはCPUMYRISCVXStateを包むラッパーのようなものらしい。envメンバ変数としてMYRISCVXStateを含んでおり、cfgメンバはRISC-Vのオプションを指定できるよ…

RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)を試す(4. GCC10を使用して再計測)

RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)は私の手元のGCCでコンパイルしたCoremarkで、特にオプションをいじらずに5.0CMK/MHzを上回ることが確認できた。 私が使っているのがRISC-V GCC 7.2なので最近リリースされたGCC 10.0にアップグレードする…

RISC-V Vector命令をサポートした自作命令セットシミュレータの実装検討 (3. メモリアクセス命令の実装検討)

久しぶりになってしまった自作命令セットシミュレータのベクトル命令サポート。少し時間があるので再挑戦する。 前回、全命令のデコーダを生成したのだが、全命令ではなかった。ロードストア命令が抜けている。今回はロードストア命令の内基本的なものを作っ…

論理最小化のためのツールespresso-logic-analyzerを試す

論理最小化と言うのは、情報系の勉強をしたことのある人ならば必ず一度はやったことののある話だと思う。大体は2~3変数の論理入力に対して最適なAND-OR回路を導出するのが論理圧縮の基本であるが、入力変数が大きくなると人の手では負えなくなる。 これはCP…

QEMUに入門してみる(2. 独自コンフィグレーションを用意して必要なファイルを確認)

QEMUの続き。独自ターゲットでビルドしてみる。myriscvx64コンフィグレーションを用意した。 ../configure --disable-werror --target-list=myriscvx64-softmmu make -j$(nproc) default_configs/myriscvx64-softmmu.mak # Default configuration for myrisc…

RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)を試す(3. Verilogを読みながらブロックダイアグラムを作る)

RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)が公開されている。シミュレーションは前回上手く動作したが、ブロックダイアグラムを作って中身を見てみたいと思った。 そこで生成されたVerilogを読みながらブロックダイアグラムを作ってみることにし…

RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)を試す(2. Coremark値の測定)

RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)が公開されているが、シミュレーションを行うためにはChipyardの環境を用意するのが原則になっているようだ。 SonicBOOMv3のリポジトリ事態にCoremarkは入っていないようなので自分でバイナリを構築する…

RISC-VのオープンソースプロセッサBOOMv3を試す

RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)が公開されているが、シミュレーションを行うためにはChipyardの環境を用意するのが原則になっているようだ。 Chipyardの環境はかなり巨大なので用意するのが面倒なのだが、構築方法を忘れそうなので一…