2020-07-01から1ヶ月間の記事一覧
前回の続き。所望の場所から命令をフェッチできるようになったので、次は命令デコーダを追加していきたい。QEMUにおける命令デコーダはDSLで記述されており、MYRISCVXの場合はqemu/target/myriscvx/insn32.decodeに置いている。これはRISC-Vにおけるデコーダ…
前回QEMUのトレース情報を取得しながらシミュレーションをスタートできるようになったが、よく見てみると最初の命令でいきなりIllegal Instructionで例外に飛んでいる。当たり前だ、そこに命令は配置されておらず、しかもデコーダもろくに実装していないので…
QEMUにはトレース出力用の関数を自動的に生成するフレームワークが存在している。これは命令トレースを出力するのとは異なり、各種イベントを取得するためのフレームワークを生成するものだ。 まず、取りたいイベントを定義しなければならない。target/myris…
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 Extensionサポート、とりあえずCSR命令の確認が終わったので先に進めていく。 RISC-V Vector Extensionのメモリアクセスにはいくつか種類があって、大きく分けると3種類。 Unit Stride:最もシンプルなメモリアク…
RISC-Vのベクトル拡張の理解に当たり、複雑怪奇なシステムレジスタを理解するのは大変だ。ここではRISC-Vベクトル拡張が備える謎のシステムレジスタについて一気に解説していきたい。 ちなみに最新のRISC-V Vector Extension 0.9をベースに解説している。 RI…
RISC-Vのベクトル拡張の理解に当たり、複雑怪奇なシステムレジスタを理解するのは大変だ。ここではRISC-Vベクトル拡張が備える謎のシステムレジスタについて一気に解説していきたい。 ちなみに最新のRISC-V Vector Extension 0.9をベースに解説している。 RI…
MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com MLIRとLLVM IR MLIRをLLVM IRの代替とし…
MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com MLIRをClangで使用する 現在のClangのIR…
MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com 次はTensorFlowのExampleの例を見る。Ten…
MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com MLIR Infrastructureについて この"Batte…
MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。 以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。 docs.google.com MLIRはMulti-Level Intermediate Representation Comp…
QEMUの続き。QEMUのRISC-V対応においてバイナリのシミュレーション方法とログの出し方が分かったわけだが、これをMYRISCVXに移植したい。つまり同じコマンドをqemu-system-myriscvx64に適用することを考える。 まずは変換のための初期化関数から。 qemu/targ…
QEMUの続き。QEMUのRISC-V対応においてバイナリのシミュレーション方法とログの出し方が分かったわけだが、これをMYRISCVXに移植したい。つまり同じコマンドをqemu-system-myriscvx64に適用することを考える。 ./qemu-system-myriscvx64 --machine none --d …
QEMUの続き。前回、QEMUを使ってLinux向けにコンパイルされたバイナリを実行することができるようになったが、ベアメタルのバイナリを動かすことはまだできていない。目標としてはとりあえずriscv-tests関係のプログラムを動かすことができるようになりたい…
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の続き。独自ターゲットでビルドしてみる。前回の続き。 gen_load()とgen_store()で使用されている関数を定義しなければならない。 gen_get_gpr():GPRから値を取得する関数。 /* Wrapper for getting reg values - need to check of reg is zero since …
QEMUの続き。独自ターゲットでビルドしてみる。前回の続き。 QEMUのデコーダを作っていく。QEMUのデコーダはDSLを使って記述するらしい。translate.cで呼び出されているecode_insn32()を作っていく。 qemu/target/myriscvx/translate.c static void decode_o…
QEMUの続き。独自ターゲットでビルドしてみる。前回の続き trans_xxx()の関数がみんな消えてしまったのはおそらく最適化で消されたので、一応念のためDebugビルドしてオブジェクトをダンプしてみた。 $ ../configure --enable-debug --disable-pie --target-…
QEMUの続き。独自ターゲットでビルドしてみる。static const TranslatorOps myriscvx_tr_opsで必要な関数を調査する。 必要な関数を確認しながら追加していく。myriscvx_tr_breakpoint_check()の中で、デバッグ例外を発生させることが必要だ。 static bool m…
QEMUの続き。独自ターゲットでビルドしてみる。static const TranslatorOps myriscvx_tr_opsで必要な関数を調査する。 一つずつ見ていこう。myriscvx_tr_init_disas_context()を見てみる。Disasということから、これはディスアセンブル(というかログ?)を…
QEMUの続き。独自ターゲットでビルドしてみる。 次に追加したのはmyriscvx_cpu_fp_enable()である。これはどうも浮動小数点を使用したかを確認するらしい。浮動小数点命令が有効になっていても、mstatus.fsが0になっていればfalseになる。つまりこれはコンテ…
QEMUの続き。独自ターゲットでビルドしてみる。myriscvx64コンフィグレーションを用意した。 MYRISCVXCPUはCPUMYRISCVXStateを包むラッパーのようなものらしい。envメンバ変数としてMYRISCVXStateを含んでおり、cfgメンバはRISC-Vのオプションを指定できるよ…
RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)は私の手元のGCCでコンパイルしたCoremarkで、特にオプションをいじらずに5.0CMK/MHzを上回ることが確認できた。 私が使っているのがRISC-V GCC 7.2なので最近リリースされたGCC 10.0にアップグレードする…
久しぶりになってしまった自作命令セットシミュレータのベクトル命令サポート。少し時間があるので再挑戦する。 前回、全命令のデコーダを生成したのだが、全命令ではなかった。ロードストア命令が抜けている。今回はロードストア命令の内基本的なものを作っ…
論理最小化と言うのは、情報系の勉強をしたことのある人ならば必ず一度はやったことののある話だと思う。大体は2~3変数の論理入力に対して最適なAND-OR回路を導出するのが論理圧縮の基本であるが、入力変数が大きくなると人の手では負えなくなる。 これはCP…
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)が公開されている。シミュレーションは前回上手く動作したが、ブロックダイアグラムを作って中身を見てみたいと思った。 そこで生成されたVerilogを読みながらブロックダイアグラムを作ってみることにし…
RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)が公開されているが、シミュレーションを行うためにはChipyardの環境を用意するのが原則になっているようだ。 SonicBOOMv3のリポジトリ事態にCoremarkは入っていないようなので自分でバイナリを構築する…
RISC-VのオープンソースプロセッサBOOMv3(SonicBOOM)が公開されているが、シミュレーションを行うためにはChipyardの環境を用意するのが原則になっているようだ。 Chipyardの環境はかなり巨大なので用意するのが面倒なのだが、構築方法を忘れそうなので一…