現在、自作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