d99661d66e3c5a08ac14229003acace54aec3b3c
1 # This file is Copyright (c) 2020 Florent Kermarrec <florent@enjoy-digital.fr>
2 # This file is Copyright (c) 2020 Greg Davill <greg.davill@gmail.com>
9 from litex
import get_data_mod
10 from litex
.soc
.interconnect
import wishbone
11 from litex
.soc
.cores
.cpu
import CPU
14 CPU_VARIANTS
= ["standard"]
21 gcc_triple
= ("riscv64-unknown-elf", "riscv32-unknown-elf", "riscv-none-embed",
22 "riscv64-linux", "riscv-sifive-elf", "riscv64-none-elf")
23 linker_output_format
= "elf32-littleriscv"
24 io_regions
= {0x80000000: 0x80000000} # origin, length
28 flags
= "-march=rv32i "
29 flags
+= "-mabi=ilp32 "
30 flags
+= "-D__serv__ "
33 def __init__(self
, platform
, variant
="standard"):
34 assert variant
in CPU_VARIANTS
, "Unsupported variant %s" % variant
35 self
.platform
= platform
36 self
.variant
= variant
38 self
.ibus
= ibus
= wishbone
.Interface()
39 self
.dbus
= dbus
= wishbone
.Interface()
40 self
.periph_buses
= [ibus
, dbus
]
41 self
.memory_buses
= []
45 self
.cpu_params
= dict(
47 i_clk
= ClockSignal(),
48 i_i_rst
= ResetSignal() | self
.reset
,
54 o_o_ibus_adr
= Cat(Signal(2), ibus
.adr
),
55 o_o_ibus_cyc
= ibus
.cyc
,
56 i_i_ibus_rdt
= ibus
.dat_r
,
57 i_i_ibus_ack
= ibus
.ack
,
60 o_o_dbus_adr
= Cat(Signal(2), dbus
.adr
),
61 o_o_dbus_dat
= dbus
.dat_w
,
62 o_o_dbus_sel
= dbus
.sel
,
63 o_o_dbus_we
= dbus
.we
,
64 o_o_dbus_cyc
= dbus
.cyc
,
65 i_i_dbus_rdt
= dbus
.dat_r
,
66 i_i_dbus_ack
= dbus
.ack
,
69 ibus
.stb
.eq(ibus
.cyc
),
71 dbus
.stb
.eq(dbus
.cyc
),
75 self
.add_sources(platform
)
77 def set_reset_address(self
, reset_address
):
78 assert not hasattr(self
, "reset_address")
79 self
.reset_address
= reset_address
80 self
.cpu_params
.update(p_RESET_PC
=reset_address
)
83 def add_sources(platform
):
84 vdir
= get_data_mod("cpu", "serv").data_location
85 platform
.add_source_dir(os
.path
.join(vdir
, "rtl"))
86 platform
.add_verilog_include_path(os
.path
.join(vdir
, "rtl"))
88 def do_finalize(self
):
89 assert hasattr(self
, "reset_address")
90 self
.specials
+= Instance("serv_rf_top", **self
.cpu_params
)