始めに
前回Tang Primer用にriscv-rv32iのコアを起こしてから3年、Aary A7であれば情報が多いため、DRAMを使ってより広いスペースでプログラムを動かせるように拡張をしてみました。機能は前記事Tang PrimerまたはArty A7で自作riscv-rv32iを動かすと大きくは変わらず、data ramをデータキャッシュ化してDRAMを接続し、data ramとして128MBの空間を使えるようにしました。これに伴い、instruction ram側にBRAMリソースを割り振り、より大きなCプログラムが動作するようになりました。安定動作しつつあるので、公開することにしました。今回レポジトリを新たに作成して前のSRAM版と共存させていくことにしました。
レポジトリ
https://github.com/yoshiki9636/my-riscv-rv32i-dc
参考URL
Tang PrimerまたはArty A7で自作riscv-rv32iを動かす
Arty A7でAXIバス簡略仕様でDDR3 SDRAMへ読み書きしてみる ※MIG設定の参考
VivadoでMIG+DDR3のシミュレーションの走らせ方メモ&ModelsimでのMIGシミュレーションの走らせ方追加 ※MIGシミュレーション参考
Ver 0.4の機能・制約
- 単純なダイレクトマップのDキャッシュを実装
- instruction memoryはSRAMのままのため、ハーバートアーキティクチャのまま
- I/Oは4セットのRGB LED、12ピン
- uartモニターにzコマンド(Dキャッシュのパージ)を追加
- Uartでの表字をI/Oで実現
- interruptピンを使った外部割込み(単体)、mretの実装を追加
- illegal operations exceptionを追加
- privilegeはM-modeのみ
- fence系、ecall以外のecall系未実装
- gccのrisc-vツールチェーンでのベアメタルCの動作確認済み
使い方
特に変わっていないので、githubページのReadmeまたは、前回のページを参考にしてください。以下は連立方程式を解くプログラムsimequ_test.cを実行してみたところです。4元1次方程式を解いています。
終わりに
手抜きの短い記事ですが、論理の方は2024年1月に着手してうまくいかずだいぶ放置していたため、非常に時間がかかってしまいました。次はIキャッシュですが、いつになるかはちょっと想像つかないところです。あとはタイマーやアトミック命令などサポートが必要と考えられますが、趣味のプログラミング、ぼちぼちやっていこうと思います。