FPGA開発日記

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

LiteXによるSoC環境構築を試行する (13. LiteXのCPUバリアントの使い方)

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

現在、自作CPUのLiteX対応は、最も小さなコンフィグレーションをターゲットとしていたが、良く調べてみるとLiteXはCPUのコンフィグレーションを指定して合成が可能だ。

例えば、VexRiscvの場合は以下のようなコンフィグレーションを指定することができる。

# Variants -----------------------------------------------------------------------------------------

CPU_VARIANTS = {
    "minimal":            "VexRiscv_Min",
    "minimal+debug":      "VexRiscv_MinDebug",
    "minimal+debug+hwbp": "VexRiscv_MinDebugHwBP",
    "lite":               "VexRiscv_Lite",
    "lite+debug":         "VexRiscv_LiteDebug",
    "lite+debug+hwbp":    "VexRiscv_LiteDebugHwBP",
    "standard":           "VexRiscv",
    "standard+debug":     "VexRiscv_Debug",
    "imac":               "VexRiscv_IMAC",
    "imac+debug":         "VexRiscv_IMACDebug",
    "full":               "VexRiscv_Full",
    "full+cfu":           "VexRiscv_FullCfu",
    "full+debug":         "VexRiscv_FullDebug",
    "full+cfu+debug":     "VexRiscv_FullCfuDebug",
    "linux":              "VexRiscv_Linux",
    "linux+debug":        "VexRiscv_LinuxDebug",
    "linux+no-dsp":       "VexRiscv_LinuxNoDspFmax",
    "secure":             "VexRiscv_Secure",
    "secure+debug":       "VexRiscv_SecureDebug",
}

同じように、自作CPUにも回路面積に応じてコンフィグレーションが指定できるので、この対応を行った。

# Variants -----------------------------------------------------------------------------------------

CPU_VARIANTS = ["tiny", "small", "standard", "big", "giant"]

# GCC Flags ----------------------------------------------------------------------------------------

GCC_FLAGS = {
    #                       /-------- Base ISA
    #                       |/------- Hardware Multiply + Divide
    #                       ||/----- Atomics
    #                       |||/---- Compressed ISA
    #                       ||||/--- Single-Precision Floating-Point
    #                       |||||/-- Double-Precision Floating-Point
    #                       imacfd
    "tiny":     "-march=rv64gc   -mabi=lp64 ",
    "small":    "-march=rv64gc   -mabi=lp64 ",
    "standard": "-march=rv64gc   -mabi=lp64 ",
    "big":      "-march=rv64gc   -mabi=lp64 ",
    "giant":    "-march=rv64gc   -mabi=lp64 ",
}

コンフィグレーションファイルの設定は、まあ適当にファイルを入れ替えるようにする。

    def __init__(self, platform, variant="standard"):
        self.platform     = platform
        self.variant      = variant
        self.reset        = Signal()
        self.interrupt    = Signal(32)
        # Peripheral bus (Connected to main SoC's bus).
        axi_if = axi.AXIInterface  (data_width=self.soc_io_data_width.get(self.variant), address_width=32, id_width=9)
        wb_if  = wishbone.Interface(data_width=self.soc_io_data_width.get(self.variant), adr_width=32-log2_int(self.soc_io_data_width.get(self.variant)//8))
        # Add Verilog sources.
        # TODO: use Flist.cv64a6_imafdc_sv39 and Flist.cv32a6_imac_sv0 instead
        basedir = get_data_mod("cpu", "scariv").data_location
        platform.add_source(os.path.join(basedir, "tb",  "sim_pkg.sv"))
        platform.add_source(os.path.join(basedir, "src", "litex_defines.svh"))
        platform.add_source(os.path.join(basedir, "src", "riscv_common_pkg.sv"))
        platform.add_source(os.path.join(basedir, "src", "riscv_fpu_imafdc_pkg.sv"))
        platform.add_source(os.path.join(basedir, "src", "riscv64_pkg.sv"))
        platform.add_source(os.path.join(basedir, "src", "scariv_" + self.variant + "_conf_pkg.sv"))

これにより、--cpu-variantオプションによりコンフィグレーションが指定できるようになった。複数のコンフィグレーションで検証できる。

litex_sim --cpu-type=scariv --cpu-variant=tiny --output scariv_tiny
litex_sim --cpu-type=scariv --cpu-variant=small --output scariv_small
litex_sim --cpu-type=scariv --cpu-variant=standard --output scariv_standard
litex_sim --cpu-type=scariv --cpu-variant=big --output scariv_big
litex_sim --cpu-type=scariv --cpu-variant=giant --output scariv_giant

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com