自作CPUにPMA (Physical Memory Attributes) を実装するために、まずは既存のRISC-V実装がどのようなメモリマップ構成になっているのかを調査した。 対象としたのはChipyard上で構成できるRocket-Chipだ。Rocket-ChipのVerilogファイルを生成すると同時にメモリマップの情報を持つJSONファイルも生成されるので、これを参考に表を作ってみた。
JSONファイルはめちゃめちゃ崩れているのでFormatterで整理する。
chipyard.TestHarness.RocketConfig.json
{"#address-cells":[1],"#size-cells":[1],"aliases":{"serial0":["&/soc/serial@54000000"]},"compatible":["freechips,rocketchip-unknown-dev"],"cpus":{"#address-cells":[1],"#size-cells":[0],"cpu@0":{"clock-frequency":[0],"compatible":["sifive,rocket0","riscv"],"d-cache-block-size":[64],"d-cache-sets":[64],"d-cache-size":[16384],"d-tlb-sets":[1],"d-tlb-size":[32],"device_type":["cpu"],"hardware-exec-breakpoint-count":[1],"i-cache-block-size":[64],"i-cache-sets":[64],"i-cache-size":[16384],"i-tlb-sets":[1],"i-tlb-size":[32],"interrupt-controller":{"#interrupt-cells":[1],"compatible":["riscv,cpu-intc"],"interrupt-controller":[]},"mmu-type":["riscv,sv39"],"next-level-cache":["&/soc/cache-controller@2010000"],"reg":[{"base":0,"size":1,"r":false,"w":false,"x":false,"c":false,"a":false}],"riscv,isa":["rv64imafdc"],"riscv,pmpgranularity":[4],"riscv,pmpregions":[8],"status":["okay"],"timebase-frequency":[1000000],"tlb-split":[]}},"htif":{"compatible":["ucb,htif0"]},"memory@80000000":{"device_type":["memory"],"reg":[{"base":2147483648,"size":268435456,"r":true,"w":true,"x":true,"c":true,"a":true}]},"model":["freechips,rocketchip-unknown"],"soc":{"#address-cells":[1],"#size-cells":[1],"boot-address-reg@4000":{"reg":[{"base":16384,"size":4096,"r":true,"w":true,"x":false,"c"
Formatterで処理した後でメモリマップを表にまとめてみる。
ベースアドレス | サイズ | アクセス権限 | 説明 |
---|---|---|---|
0x0000_0000 | 0x0000_1000 | RWXA | デバッグコントローラ |
0x0000_3000 | 0x0000_1000 | RWXA | エラーデバイス |
0x0000_4000 | 0x0000_1000 | RWA | ブートROM |
0x0001_0000 | 0x0001_0000 | RX | ROM |
0x0002_0000 | 0x0001_0000 | RXC | LBWIF ROM |
0x0200_0000 | 0x0001_0000 | RWA | CLINT |
0x0201_0000 | 0x0000_1000 | RWA | キャッシュコントローラ |
0x0c00_0000 | 0x0400_0000 | RWA | 割り込みコントローラ |
0x1000_0000 | 0x0000_1000 | RWXCA | LBWIF RAM |
0x5400_0000 | 0x0000_1000 | RWA | シリアルデバイス |
0x8000_0000 | 0x1000_0000 | RWXCA | メインメモリ |
メモリ属性については、
- R: Read
- W: Write
- A: Atomic Access
- X: Execute
- C: Cacheable
この中で分からないのはLBWIFというデバイスだ。検索してみるとLBWIFというのはLow Bandwidth Interfaceのことらしい。 Chipyardのドキュメントを見るとSerDesなどに使用するということらしいので、とりあえず実装に当たっては無視していいだろう。