FPGA開発日記

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

ISS

ISSにシステムレジスタ読み書きの機能を実装する

ISS

MIPSのシステムレジスタ読み書きの機能を実装する xv6のデバッグをしていて、何か動作がおかしいなと思っていたら、システムレジスタを定義していたものの、読み書きの動作を定義していなかった! そりゃ、うまくいかない。 github.com とりあえず、システム…

32ビットモードと64ビットモードの両方をサポートするためのRISC-V ISSの実装

ISS

RISC-V用のISSで、倍精度と単精度の浮動小数点をサポートをするために、RISC-V ISSで32ビットモードと64ビットモードをサポートしよう。 32ビットモードと64ビットモードのレジスタファイル対応 まずは、レジスタファイルの大きさとアドレスの範囲を64ビット…

RISC-Vの浮動小数点命令をISSに実装する

ISS

MIPSの浮動小数点命令についても、大分実装が進んできたので、RISC-Vの実装を進めていこう。 RISC-Vにも単精度、倍精度の浮動小数点演算命令が定義されている。 Download - RISC-V RISC-Vの浮動小数点命令をISSに実装する ISSの実装についてはMIPSのそれと殆…

softfloatを使ってISSの浮動小数点命令を実装しよう(1)

ISS

softfloatは、浮動小数点をソフトウェアで実現するためのライブラリだ。 Berkeley SoftFloat 今までは整数命令ばかり実装していたけど、MIPS64やRISC-Vも注目を浴びてきたということもあり、浮動小数点の命令も実装していこう。 そのためには、x86の命令を使…

CMakeとISSテスト環境を構築する手順

ISS

ISSのリグレッションテストを実行するための環境を構築していこう。 CMakeを使ってリグレッションの環境を構築する CMakeLists.txtの記述 CTestのためのパッケージを追加 Travis-CIを使ってリグレッションを実行する .travis.ymlを記述する Travis-CIのCMake…

ISSのコア部とインタフェース部を分離するためのCMakeLists.txtを記述する

ISS

ISSのインタフェースを統一するために、まずはコア部とインタフェース部を分離する。 現在のISSは、基本的に以下のようなインタフェースを持っている。 図では、コントロール部とCPUコア部を分離して記述しているが、実際には同じ階層としてビルドしていた。…

64bit MIPSに対応したISSを公開しました

ISS

MIPS64r6(整数のみ)に対応したISSを公開しました。64bitでコンパイルしたCoremarkの完走を確認しました! github.com Swimmer-ISSのコンパイル方法 ベンチマークの実行方法 各オプションの意味 ベンチマークの実行結果 coremark.run.log の内容(抜粋) corema…

templateを使って演算命令を共通化する

ISS

ISSで64ビット対応をしていると、32ビットですでに実装しているのに、同じものを64ビットで再度実装しなければならないことがある。 加減算ならまだしも、ロードストアや複雑な演算で同様なルーチンを何個もコピーしていると面倒なので、templateを使って共…

自作ISSのRelease-6への対応を検討する(新規命令を実装する)

ISS

msyksphinz.hatenablog.com という訳で、実装した。Coremarkも完走したので、とりあえずは大丈夫かな。 github.com github.com PC操作、分岐系 addiupc align aluipc aui auipc コンパクト型分岐系 balc bc blezalc bgezalc bgtzalc bltzalc beqzalc bnezalc…

自作ISSのRelease-6への対応を検討する

ISS

自作ISSでは、MIPSのRelease-5までの基本的な命令と、RISC-Vの基本的な命令を対応させている。 浮動小数点の命令などはまだ実装していないが、まだ検証する方法が無いし、使っていないので今のところ実装してない。 Imaginationから新しいコアもリリースされ…

インタラクティブモードでの調整

ISSでインタラクティブにいろいろデバッグをすることができるようになってきたので、タイプミスによりLuaのコマンドを打ち間違えたときにセグって落ちてしまうのが気になってきた。 よく見てみたら、引数の処理をするのにLuaのスタックにどの程度引数が入っ…

C++内でLuaをインタプリタのように動作させるための調査(実装してみた)

前回の続きで、LuaのインタプリタをISSに実装してみた。 msyksphinz.hatenablog.com 前回lua_interpreterを実行してみて、バックスペースなどの操作が出来なかったのだが、これはlibreadlineを使っていなかったからだった。 コンパイルするときに、-DLUA_USE…

C++内でLuaをインタプリタのように動作させるための調査(まだ未実装)

僕のISSはインタプリタとしてLuaを使用しているが、起動時にLuaファイルを指定するとそこから一方的に実行が始まるだけで、例えばデバッグモードのように一旦停止してレジスタをダンプする、などの動作を挿入することができない。 そのような動作は、全てス…

ISSの出力のログファイルサイズを制御したい

ISS

ISSでOSをシミュレーションしていると、デッドロックしているのを見逃してしまい、ディスクを食い潰していることがある。 これを防ぐために、指定したサイズのファイルサイズを越えると、シミュレーションをストップする機能を追加した。 github.com 使った…

ISSのシステムレジスタ値を設定できるようにする

ISS

xv6の解析中に、システムレジスタの初期値によって割り込みを発生させたりさせなかったりする設定が間違っており、うまく動作していない点があった。 そう考えてみると、今のISSにはシステムレジスタの初期値を設定できていないので、システムレジスタテーブ…

階層トレースモードにおいて、途中からトレースの表示を省略するモードを設ける

ISS

例えば、printfとかは内部で大量の関数を呼び出しており、関数の呼出関係のトレース図を作ると大変なことになる。 下の例では、Coremarkにおいて、cmp_complexから先を全て階層トレースとして出力した場合の結果だ。 <FunctionCall 51052: cmp_complex(0x80000180)> <FunctionCall 51061: calc_func(0x80000058)> <FunctionCall 51085: crcu16(0x800015c0)> <Return: crcu16> <Return: calc_func> </return:></return:></functioncall></functioncall></functioncall>

Calling Conventionモードに応じてISSのログの表記を変更する

ISS

レジスタのCalling Conventionとは。 呼出規約 - Calling Convention(コーリングコンベンション) レジスタはハードウェア的にはFFの塊だが、ソフトウェアとしては、どのレジスタをどの役割として使うかが決められている。 また、それに応じて、レジスタの名…

ISSでイメージファイルをロードできるような機能を追加

ISS

xv6の勉強をしていて、xv6.imgとか、fs.imgとかがロードできたほうが良いなと思ったので、その機能を追加しておいた。 github.com どうやら、単純にimgファイルは中身を読み取ってそれを転送していくだけで良いみたいだ。 ただし、今はテスト段階のため、512…

関数の呼び出し関係をトレースとして表示する機能を追加

ISS

ISSに関数呼出のトレースを表示する機能を追加した。 --trace_hier : Generate Trace Hierachy tree --trace_out <log> : output log filename for trace hierarchy mode default is same as --out <filename> --trace_hier オプションを有効化すると、以下のような関数呼出</filename></log>…

バイナリのロードがすごく遅いので何が起きているのか調査(解析編)

ISS

xv6のバイナリをISSで実行しているが、最初のバイナリのロードでもの凄く時間がかかっている。 ロードだけで1分くらいはかかっているように感じる。 msyksphinz/xv6-mipsgithub.com msyksphinz/swimmer_riscvgithub.com まずは、Google Perftoolsを使って、…