始めに
DRAMと接続してDキャッシュ版を公開して早くも半年、まだ納得いくところまでできていないですが、Cプログラムがそれなりに動いているので、I,Dキャッシュ双方が動作している版をmy-riscv-rv32i-dcにマージいたしました。これにより、命令とデータが同一DRAM上に搭載されて、CPUへのプログラムのアップロードがDRAMのみでの動作が可能となりました。
レポジトリ
https://github.com/yoshiki9636/my-riscv-rv32i-dc
参考URL
Tang PrimerまたはArty A7で自作riscv-rv32iを動かす
Arty A7で自作riscv-rv32iを動かす② DRAMでDキャッシュのみ版
Arty A7でAXIバス簡略仕様でDDR3 SDRAMへ読み書きしてみる ※MIG設定の参考
VivadoでMIG+DDR3のシミュレーションの走らせ方メモ&ModelsimでのMIGシミュレーションの走らせ方追加 ※MIGシミュレーション参考
Ver 0.5の機能・制約
- 単純なダイレクトマップのIキャッシュおよびDキャッシュを実装
- キャッシュのラインサイズは16byte
- IキャッシュとDキャッシュのスヌープは未実装
つまりプログラム実行中に命令を書き換えてもキャッシュに反映されない - I/Oは4セットのRGB LED、12ピン
- 現在のクロック設定は200MHz/166.66667MHz/50MHz。かなり動作が遅いです・・・。
- uartモニターにzコマンド(Dキャッシュのパージ)を追加
- Uartでの表字をI/Oで実現
- interruptピンを使った外部割込み(単体)、mretの実装を追加
- illegal operations exceptionを追加
- privilegeはM-modeのみ
- fence系、ecall以外のecall系未実装
- gccのrisc-vツールチェーンでのベアメタルCの動作確認済み
※コンパイル方法はctest/cmpl.shを参考にしてください。
※ただし、newlibのlibc_nanoやlibm_nanoを用いた場合に、sprintfを用いた浮動小数点の表示がうまくいきません。ctest/内部の*_test2.cというものがそれに当たります。詳細原因究明中。
※dijkstra_test.cが動作しません。linux上では動作確認しているので、まだCPUにバグがあります・・・。
使い方
特に変わっていないので、githubページのReadmeまたは、前回のページを参考にしてください。
終わりに
短い手抜きの記事でした。まだベアメタルCのテストで動かないものがあり、切り分けがだんだんと難しくなっています。モニタ機能を強化する必要があるのですが、一方手元のArty A7-35Tでは搭載資源を食い尽くしつつあり、T100へのアップグレードの必要性に迫られています。悩みは尽きません。あとタイマー等のインプリとかも必要になってくるので、ぼちぼちとやって行こうと思います。