FPGA開発日記

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

ISS

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…

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

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

RustでRISC-V命令セットシミュレータを作ろう (17. マクロの導入)

Rustで作る自作命令セットシミュレータの続き。アトミック命令をすべて実装したのはいいが、同じような記述を大量に並べてしまっておりどうも気持ちが悪い。 AMOADD.Wの実装 fn execute_amoadd_w (&mut self, inst: InstT) { let rs1 = Self::get_rs1_addr(i…

RustでRISC-V命令セットシミュレータを作ろう (16. アトミック命令の実装)

Rustで作る自作命令セットシミュレータの続き。残りの命令を実装していく。次はアトミック命令の実装だ。これもC++で実装したことがあるのでRustに移植するだけである。 Rustでの実装で気をつけなければならないのは型の変換を明示的に行わなければならない…

RustでRISC-V命令セットシミュレータを作ろう (15. flamegraphによる性能解析)

Rustで作る自作命令セットシミュレータの続き。テストパタンによってはシミュレーションにかなり時間がかかっているような気がするので、どこに負荷がかかっているのかを解析したい。 色々調べていると、Rustで書いたプログラムの性能解析としてFlamegraphと…

RustでRISC-V命令セットシミュレータを作ろう (14. リグレッションテストの全確認)

Rustで作る自作命令セットシミュレータの続き。RV32とRV64でテストはある程度動くようになっているので、ここらでリグレッションテストを通して細かいところを修正していこうと思う。 Rust実装の修正 RV32とRV64で微妙に動作が異なる部分 例えばシフト命令の…

RustでRISC-V命令セットシミュレータを作ろう (13. RV32仮想アドレスモードの実装)

Rustで作る自作命令セットシミュレータの続き。RV32のテストは動くようになってきたので、次はRV32の仮想アドレスモードの対応について考える。 これも昔作ったC++のRISC-Vシミュレータですでに対応しているので簡単なのだが、いくつかRV32とRV64で切り替え…

RustでRISC-V命令セットシミュレータを作ろう (12. RV32機能の実装)

Rustで自作命令セットシミュレータを作っているが、RV64のテストパタンはある程度Passできるようになっている。 RV32についてだが、これまではRV32とRV64を別のクラスとして実装していた。しかしどうもこれでは冗長なコードがあってたまらないので、統一して…

RustでRISC-V命令セットシミュレータを作ろう (11. 命令デコーダの実装)

Rust製自作命令セットシミュレータ、命令デコーダの実装を少しずつ改造している。 与えられた機械語から、命令をデコードして意味を解析する。 RISC-Vの機械語は非常に単純なので、命令デコーダの設計は簡単だ。 単純にcase文を並べていくだけで完成する。こ…

RustでRISC-V命令セットシミュレータを作ろう (10. Rustでテストケースを作成する)

Cargoのテスト環境を使ってリグレッションテストを作る Rustで作った命令セットシミュレータについて、テストの方法を考え直した。 現在はMakefileで管理をしているが、Cargoの機能を使ってテスト環境を構築した方が良さそうだ。 そこでRustのmain()を直接呼…

RustでRISC-V命令セットシミュレータを作ろう (9. 命令のディスアセンブル機能を実装する)

Rustを使ったRISC-Vシミュレータの調整を行っている。デバッグ・トレース機能の調整を行った。 もうひとつの機能は、命令の機械語からニーモニックを出力する機能だ。 実はこの機能は必須の機能ではない。 spike-dasmというriscv-toolsを使えば、逆アセンブ…

RustでRISC-V命令セットシミュレータを作ろう (8. デバッグ・トレース機能の整理)

Rustを使ったRISC-Vシミュレータの調整を行っている。デバッグ・トレース機能の調整を行った。 ISSを使ってテストプログラムをデバッグする場合、いくつかの情報を出力してプログラムの動作を監視する必要がある。例えば、ISSからは以下の情報が出てくると役…

RISC-V Vector命令をサポートした自作命令セットシミュレータの実装検討 (2. 全ベクトル命令のデコーダ生成)

ベクトル命令の全命令をリストアップしたので、次はいよいよベクトル命令のデコーダ生成に入る。デコーダの生成を人力で頑張る必要はなく、私のRISC-Vシミュレータはすべて自動的にデコーダを吐き出す仕組みが搭載されている。したがって、ひたすらベクトル…

RISC-V Vector命令をサポートした自作命令セットシミュレータの実装検討

RISC-V Vector命令の仕様がかなり固まってきた。いつの間にかVer 0.8が公開され、命令のニーモニックも安定しつつある。 RISC-V "V" Vector Extension Version 0.8-draft-20191117 https://riscv.github.io/documents/riscv-v-spec/riscv-v-spec.pdf ついで…

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の命令を使…