ほかの波形と見比べながら、なんとなく何が必要なのか分かってきた。
次に必要なのはメモリマップだ。メモリマップを以下のように修正した。
[ { "base": "0x0000_0000", "size": "0x0002_0000", "attr": {"R": 1, "W": 0, "X": 1, "A": 1, "C": 0}, "comment": "ROM" }, { "base": "0x0c00_0000", "size": "0x0400_0000", "attr": {"R": 1, "W": 1, "A": 1, "X": 0, "C": 0}, "comment":"Interrupt Controller" }, { "base": "0x2000_0000", "size": "0x0000_2000", "attr": {"R": 1, "W": 1, "X": 1, "C": 1, "A": 1}, "comment":"SRAM" } ]
必要なのはPLICのメモリマップで、これは0x0c00_0000にアクセスできるように変更している。
あとはAXIとWishBoneの変換だ。どうもデバッグしているとAXIとWishboneを何も考えずに接続すると、IDのビット幅が潰れてしまいうまく動かない。 Rocket版の実装を見ながら、修正していった。
fetch_wb_if = wishbone.Interface(data_width=128, adr_width=32-log2_int(128//8)) data_wb_if = wishbone.Interface(data_width=128, adr_width=32-log2_int(128//8)) # Adapt AXI interfaces to Wishbone. fetch_a2w = axi.AXI2Wishbone(axi_fetch_if, fetch_wb_if, base_address=0) self.submodules += fetch_a2w data_a2w = axi.AXI2Wishbone(axi_data_if, data_wb_if, base_address=0) self.submodules += data_a2w
これで、だいぶブートが進むようになってきた。いろいろ解析していると、次はフェッチがストップしているなあ。 引き続き解析していこう。