FPGA開発日記

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

LiteXによるSoC環境構築を試行する (11. LiteXブートシーケンスの解析)

https://raw.githubusercontent.com/enjoy-digital/litex/master/doc/litex.png

ほかの波形と見比べながら、なんとなく何が必要なのか分かってきた。

次に必要なのはメモリマップだ。メモリマップを以下のように修正した。

[
        {
        "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

これで、だいぶブートが進むようになってきた。いろいろ解析していると、次はフェッチがストップしているなあ。 引き続き解析していこう。