FPGA開発日記

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

ChipyardのRocket-ChipにおけるPMA構成調査

自作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などに使用するということらしいので、とりあえず実装に当たっては無視していいだろう。