1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Arty A7で自作riscv-rv32iを動かす③ DRAMでIキャッシュDキャッシュ

1
Last updated at Posted at 2025-04-24

始めに

 DRAMと接続してDキャッシュ版を公開して早くも半年、まだ納得いくところまでできていないですが、Cプログラムがそれなりに動いているので、I,Dキャッシュ双方が動作している版をmy-riscv-rv32i-dcにマージいたしました。これにより、命令とデータが同一DRAM上に搭載されて、CPUへのプログラムのアップロードがDRAMのみでの動作が可能となりました。

2025/5/21追記

  • instruction RAM版でのいくつかのbug fixをしました。I,Dキャッシュのサイズを14ビット(arty A7 T100の場合)に設定すると、ctest/ 以下のほとんどのプログラムは動作するようになりました。しかし、I,Dキャッシュのサイズを8bitに絞ると動作しないものが出てきます。I,Dキャッシュ双方がスラッシングを起こすような条件で動作しない不具合がまだあるようです。

2025/11/7追記

  • モニタ機能を強化しました。Break point機能の追加、IOレジスタ,CSRレジスタ,レジスタファイルのダンプができるようになり、プログラムを停止したときに各レジスタの値の読み書きが可能となりました。
  • 継続的なBugfixにより安定度が増しております。現在わかっている不具合は、キャッシュサイズを小さく(DWIDTHが7bit以下)した場合に一部データが0化けを起こす、です。たぶんDキャッシュの入れ替えが行われる際にまだ不具合がでるパターンがあるようです。
  • git のREADMEを整備すると同時に、英語のみの表記としました。ブラウザの翻訳機能を使ってください。

2026/4/13追記

  • ver 0.6に表記をアップ
  • M命令(mult,div,rem)をコンパイルオプションで追加しました。
  • external interrupt, timer interrupt, rx uart interruptを実装、検証しました。
  • それぞれ単体および組み合わせたCプログラムでの動作を確認しています。
  • レジスタマップはRISC-V RV32I互換CPUと互換です。(というか使いまわし)
  • ここまで来てもFreeRTOSはIllgal Ops例外で動作せず・・・。(まだD$の不具合が効いている模様)

2026/4/19追記

  • ついにFreeRTOSのDemoが動作!!! D$ストールがらみの不具合数個をつぶしました。
  • 残りのエラー: Iキャッシュ、Dキャッシュともに64byteの最小サイズにした場合にFreeRTOSのみ動作しない
    かなりレアケースになっているらしく、つぶすのが困難。。。
    初期のBRAMのみのRV32Iのコーディングを始めてから6年、やっとここまで来ました!
    まだLinuxカーネル載せるには少なくともA命令セットの実装が必要。MMUは無くてもよいという噂もあり。

2026/4/20追記

  • Dhrystone MIPSを測定してみました。横軸数字はコンパイル最適化オプション値(1~3)、縦軸はDMIPS値(1757で換算した値)、緑がRV32I、オレンジがRV32IM。こうしてみる度大体50MHzで50MIPS達成しています。

image.png

2026/7/21追記

  • 主にタイマー割込み付きの大きなプログラムについての複数バグをFix。
  • Atomic命令を追加。しかし、割込み付きプログラムでは動作保証なし。
  • fence.i命令を追加。同じく割込み付きプログラムでは動作保証なし。
  • キャッシュとは別に1cycleでアクセス可能なスクラッチメモリおよび、スクラッチメモリとDRAM間のDMA機能を追加。
  • FreeRTOSおよびμT-kernel上での簡単なデモプログラム(2つのプロセスを立ち上げ、一方から他方へ1秒おきにメッセージを送信する)の半日動作を確認。
  • 未だタイマー割込み付きの大きなプログラムでは不具合あり。

レポジトリ

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.6の機能・制約

  • 単純なダイレクトマップのIキャッシュおよびDキャッシュを実装
  • IキャッシュDキャッシュ複合要因での不具合が観測されている
  • キャッシュのラインサイズは16byte
  • IキャッシュとDキャッシュのスヌープは未実装
     つまりプログラム実行中に命令を書き換えてもキャッシュに反映されない(スヌープなし)
  • I/Oは4セットのRGB LED、12ピン(outputのみ)
  • 現在のクロック設定は200MHz/166.66667MHz/50MHz。
  • uartモニターにbreak機能とIO/csr/RFダンプ・書き換え機能を追加
  • Uartでの表字をI/Oで実現
  • interruptピンを使った外部割込み(チャタリング防止回路付き)、mretの実装を追加
  • 64bit Free Run Counter実装およびtimer割込みサポート
  • interruptにrx割込みを追加
  • SPI, GPIO論理追加(イネーブルしていない)
  • 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にバグがあります・・・。

使い方

 特に変わっていないので mig対応によりModelsimシミュレーションの方法が大幅に変わったので、githubページのReadmeまたは、前回のページVivadoでMIG+DDR3のシミュレーションの走らせ方メモ&ModelsimでのMIGシミュレーションの走らせ方追加を参考にしてください。

モニター機能一覧

g : goto PC address ( run program until quit ) : format: g <start addess>
Ctrl-c : quit from any command : format: Ctrl-c
w : write date to SDRAM : format: w <start adderss> <data> ....<data> Ctrl-c
r : read data from SDRAM : format: r <start address> <end adderss>
t : trashed memory data and 0 clear : format: t <start address> <end adderss>
s : program break point set : format: s <break address>
    Setting address : using even number address
    Unsetting address : using odd number address
p : read IO regs/csr/RF : format: p <start address> <end adderss>                                                           address : upper 2bits == 2'b11 : I/O registers
    address : upper 2bits == 2'b10 : csr registers
    address : upper 2bits == 2'b00 : Register Files
i : write IO regs/csr/RF : format: i <start adderss> <data> ....<data> Ctrl-c
    address : upper 2bits == 2'b11 : I/O registers
    address : upper 2bits == 2'b10 : csr registers
    address : upper 2bits == 2'b00 : Register Files
j : print current PC value : format: j
z : parge D cache : format:  z // currently not woring

終わりに

 短い手抜きの記事でした。まだベアメタルCのテストで動かないものがあり、切り分けがだんだんと難しくなっています。モニタ機能を強化する必要があるのですが、 一方手元のArty A7-35Tでは搭載資源を食い尽くしつつあり、T100へのアップグレードの必要性に迫られています。悩みは尽きません。あとタイマー等のインプリとかも必要になってくるので、ぼちぼちとやって行こうと思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?