FPGA開発日記

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

Chiselを使ってCPU の検索結果:

Chiselを使ってCPUを作ろう(17. 5ステージにCPUにフォワーディングパスを追加する)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト。5ステージまで拡張したので、次はフォワーディングパスを追加して正常に演算を実行できるようにする。 github.com ALUのフォワーディングパスは、 WBステージ → EXステージ MEMステージ → EXステージ EXステージ → EXステージ の3種類のフォワードパスを追加して、書き込み先アドレスと使用アドレスが同一ならば、フォワードするようにする。 Verilogと書き方は全く同じだ。 minic…

Chiselを使ってCPUを作ろう(16. 5ステージにCPUに拡張してみる)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト。折角なので5ステージまで拡張して、テストパタンが通るようにしたい。 参考にしたのはヘネパタの後ろの方に乗っている5ステージのプロセッサの解説。とりあえず図に乗っていることをすべてChiselで書き下してみることにした。 そしてテストパタンを動かし、間違っているところを直していく。 github.com 今のところChiselの書き方としては非常にイマイチだ。ただしVerilogに直さずにChiselのままシ…

Chiselを使ってCPUを作ろう(15. デザインのパラメタライズ)

…る。 この方法は、 Chiselを使ってCPUを作ろう(5. トレース記述をどう作る?) のコメントで教えてもらった。 src/main/scala/cpu/cpu.scala class CpuDebugMonitor [Conf <: RVConfig](conf: Conf) extends Bundle { val inst_valid = if (conf.debug == true) Output(Bool()) else Output(UInt(0.W)) va…

Chiselを使ってCPUを作ろう(14. 2段パイプラインのデザインをGitHubに公開しました)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト。 とりあえず、rv64ui-pのリグレッションテストがすべてPass するようになったのでGitHub上に公開した。 といっても、2段ステージのパイプラインで非常にしょぼいものだが。 ただし、このデザインの凄いところは一切Verilogを使っていないこと。だいたいのChiselのデザインはメモリのところにVerilogを使ったり、 CPUの動作制御の部分にVerilogを使ったりするのだが、これは全てChi…

Chiselを使ってCPUを作ろう(13. リグレッションテストを流してみる)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト。 とりあえず一旦リグレッションテストを全部流してみるとどのようになるのだろうか。 リグレッションテストは、ホームディレクトリにあるtest.hexを書き換える形で行う。 本当はファイルオープンする記述を改造してリンクを差し替えなくてもよくしたいけど、Scalaのやり方が分からな過ぎて諦めた。 おかげで今のところシーケンシャルにしか実行できない。 ホームディレクトリにあるtest.hexのシンボリックリンクを…

Chiselを使ってCPUを作ろう(12. テスト終了コードの取り扱いについて)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト。RISC-Vにはfromhostやtohostといったレジスタ(メモリマップドレジスタ)が定義されており、それを使用してシミュレーションの制御を行う。 このメモリマップドレジスタはだいたい0x1000あたりに定義されており、そこにストアした値が0であればPassでテスト終了、などといった条件でPass / Failを判定する。 テストパタンの終了条件は、Scalaのテストベンチ側に以下のように記述することで…

Chiselを使ってCPUを作ろう(11. 例外やシステムコールでのCSRの取り扱いなど)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト。テストパタンを動かすためには、CSRレジスタを扱えければならないのと、Ecallなどの例外を扱う命令が実行できなければならない。 Ecallは、例外を発生させ例外コードをmcauseに書き込み、mtvecに格納されているPC位置までジャンプする。 mcauseへの書き込みと、mtvecの読み込みとPC更新ができればよいわけだ。 CSRへの書き込みを実行するのは以下のコードとなる。 when(io.ecall…

Chiselを使ってCPUを作ろう(10. Configurationを1つのcaseにまとめる)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト、テストパタンを動かしながらデバッグしている。 いくつかコンフィグレーションを変えながら動かしたいところがあり、またVerilogのパラメータのように扱いたい部分があるのだが、Chiselにはcaseを用いたコンフィグレーションの設定方法があるらしい。 RISC-V Sodorには以下のような記述がみられた。 src/common/configuration.scala case class SodorCon…

Chiselを使ってCPUを作ろう(9. テストベンチを走らせる)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト、算術演算命令、ロード・ストア命令、CSR命令が多少動くようになってきたので、RISC-Vのテストパタンを動かしてみてもよさそうな気がしてくる。 riscv-testesに乗っているテストパタンを動かしてどのようになるかチェックしてみたい。そのための環境を構築した。 riscv-testsのパタンはデフォルトだと0x80000000番地に構築されるので、テストパタンを修正して0x00000000番地から始まる…

Chiselを使ってCPUを作ろう(8. CSR命令の実装方法調査)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト、算術演算命令、ロードストア命令とくれば次はCSR命令だ。 RISC-VにはCSR(Control and Status Register)が多くの数定義されている。 これらをChiselで記述するためにはどうしたらよいのだろうか。 まずは比較的読みやすいRISC-VのChisel実装、Sodorを読んでみる。 https://github.com/ucb-bar/riscv-sodor/blob/maste…

Chiselを使ってCPUを作ろう(7. Load / Store命令の実装)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト、ある程度演算命令は動き始めたので、次はLoad/Store命令を実装する。 RV64の命令系列では、64-bit, 32-bit, 16-bit, 8-bitのメモリアクセスが行える必要がある。 メモリの部分はVerilogで記述してもよいのだが、そうするとScalaでシミュレーションできなくなるのでこれもChiselで実装したい。 8‐bit単位でのアクセスを行うために、メモリモジュールを改造して、8ビッ…

Chiselを使ってCPUを作ろう(6. パイプラインと分岐命令の実装)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト、ある程度演算命令は動き始めたが、ちゃんと動作しているのかどうかを確かめたい。 分岐命令はALUで比較を実行して、その結果に応じてPCを切り替える。 RISC-Vには3種類のPCアップデートの方法があって、 Branch Conditional式 : 比較の結果、PC+Immで分岐する。 J式 : 比較をしない。PC+Immで分岐する。 JALR : 比較をしない。レジスタ値で分岐する。 の大きく分けで3つで…

Chiselを使ってCPUを作ろう(5. トレース記述をどう作る?)

Chiselを使って、非常にシンプルなCPUを作ってみるプロジェクト、ある程度演算命令は動き始めたが、ちゃんと動作しているのかどうかを確かめたい。 普通CPUを作るときは、波形をわざわざ観測するなんてそんなダサいことはしなくて、トレースファイルを出力してそれをISSと一致比較検証するか、そもそもDPIか何かを使ってCPUの内部情報を動的に抽出してISSを比較したりする。 そのために、CPUの内部にシミュレーション時限定のトレースユニットを組み込み、そこから情報を回収してテキス…