FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

ISS

ISSに分岐予測を実装する検討(2. 分岐予測の機構をISSに実装する)

ISS

前回で、分岐予測機構について簡単にまとめたので、今度は分岐予測をISSに実装しよう。 分岐予測の機構を実装する まずは、必要なSRAMをモデル化する。 github.com /* * Branch Predictor implementation */ const int32_t BRANCH_LOCAL_BIT = 3; const int3…

ISSに分岐予測を実装する検討(1. 分岐予測の機構について)

ISS

前回までで、ISSに命令キャッシュ、データキャッシュを実装する方法について検討し、実装した。 Verilog-HDLでCPUを実装するにあたり、まだまだ必要な機能はある。次は、分岐予測を命令セットシミュレータ(ISS)を用いて実装する機能について検討しよう。 分…

ISSにL1キャシュのシミュレーション機能の検討(3. L1命令キャッシュのモデル実装とリファクタリング)

ISS

前回までで、L1キャッシュのモデルをISSに実装したのだが、L1 データキャッシュのシミュレーションしか実装していなかった。 L1キャッシュへのアクセスは命令フェッチの際に発生する。しかも今度はL1データキャッシュと違ってストアは発生しない。この方が楽…

ISSにL1キャシュのシミュレーション機能の検討(2. キャッシュモデルをISSへ実装)

ISS

前回、RTLの検証方法について少しまとめ、ISSを使ってL1キャッシュのシミュレーションを行う方法について少し考えた。 キャッシュの一般的な構成 キャッシュは、一般的には以下のような構造を取っている。 構成されるのは主に2つのメモリ、タグ用のRAMとデー…

ISSにL1キャシュのシミュレーション機能の検討(1. キャッシュの構成について)

ISS

RTLでデジタル回路を設計するときに、そのデジタル回路が正しく動作しているかどうかを検証するためには様々な方法がある。 知っているものを一覧でまとめてみた。 検証手法 特徴 セルフチェック検証 検証パタンそのものに、RTLが正しく動作したかどうかを検…

RISC-V命令セットシミュレータの途中状態を保存する(セッション保存)機能の実装(メモリ内容の保存と回復)

ISS

msyksphinz.hatenablog.com 前回で、CPUの汎用レジスタやシステムレジスタなどの部分において情報を保存する機能は実装した。 次に、メモリの情報について保存する機能について考えていく。 基本的には前回の記事でも書いたように、メモリのストアされた部分…

RISC-V命令セットシミュレータの途中状態を保存する(セッション保存)機能の検討と実装

ISS

RISC-V/MIPS対応ISSを作っているのだが、これを使ってxv6などの比較的長いシミュレーション実行時間が必要なプログラムを動作させようとしている。 これらのOSの問題点は、ブートするまでが非常に長く、せっかくブートしたと思っても検証プログラムを流すの…

ISSを使ったxv6のデバッグ(まだブートできない)

ISS

とりとめのない記事だが、とりあえず日記なので書いておく。 RISC-Vアーキテクチャでコンパイルしたxv6を動作させるためにISSを利用して、シミュレーションを行っている。 現在、最初のHDDからカーネルのロードまでは終わっているが、そこから先でmainまで飛…

ISSの実装(32ビットモードと64ビットモード混在)

ISS

自作ISSのバグでしばらくハマっていた。32ビットモードでxv6やCoremarkなどのベンチマークを動かすと、ちゃんと動作してくれず、トレースモードが正常出力されない。 しばらく追いかけていたのだが、32ビットモードと64ビットモードの混在環境での詰めの甘さ…

リネームレジスタを模倣する機能をISSに追加する

ISS

前回の記事で、アウトオブオーダの考え方、リネームレジスタの考え方についてまとめた。 msyksphinz.hatenablog.com CPUを実装するにあたり、リネームレジスタが正しく実装できているかどうかを確認したい。 リネームレジスタが正しく動作しているかは、 新…

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を使って、…