Skip to content

Commit 9449d25

Browse files
committed
soc/cores/cpu/urv: Able to boot LiteX BIOS with im bus connected to synchronous memory.
- Replace im bus wishbone adaptation with synchronous memory (for now and initial tests). - Correctly handle dm bus wishbone adaptation (Added FIFO).
1 parent edb56e7 commit 9449d25

File tree

1 file changed

+76
-40
lines changed

1 file changed

+76
-40
lines changed

litex/soc/cores/cpu/urv/core.py

Lines changed: 76 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
from litex.gen import *
1212

13+
from litex.soc.interconnect import stream
14+
1315
from litex.soc.interconnect import wishbone
1416
from litex.soc.cores.cpu import CPU, CPU_GCC_TRIPLE_RISCV32
1517

@@ -62,14 +64,14 @@ def __init__(self, platform, variant="standard"):
6264
self.ibus = ibus = wishbone.Interface(data_width=32, address_width=32, addressing="byte")
6365
self.dbus = dbus = wishbone.Interface(data_width=32, address_width=32, addressing="byte")
6466
self.periph_buses = [ibus, dbus] # Peripheral buses (Connected to main SoC's bus).
65-
self.memory_buses = [] # Memory buses (Connected directly to LiteDRAM).
67+
self.memory_buses = [] # Memory buses (Connected directly to LiteDRAM).
6668

6769
# uRV Signals.
6870
# ------------
6971
im_addr = Signal(32)
70-
im_rd = Signal(1)
72+
im_rd = Signal()
7173
im_data = Signal(32)
72-
im_valid = Signal(1)
74+
im_valid = Signal()
7375

7476
dm_addr = Signal(32)
7577
dm_data_s = Signal(32)
@@ -80,9 +82,6 @@ def __init__(self, platform, variant="standard"):
8082
dm_load_done = Signal()
8183
dm_store_done = Signal()
8284

83-
rst_count = Signal(8, reset=16)
84-
self.sync += If(rst_count != 0, rst_count.eq(rst_count - 1))
85-
8685
# uRV Instance.
8786
# -------------
8887
self.cpu_params = dict(
@@ -97,8 +96,8 @@ def __init__(self, platform, variant="standard"):
9796
p_g_with_compressed_insns = 0,
9897

9998
# Clk / Rst.
100-
i_clk_i = ClockSignal("sys"),
101-
i_rst_i = ~(ResetSignal("sys") | self.reset | (rst_count != 0)),
99+
i_clk_i = ClockSignal("sys"),
100+
i_rst_i = ResetSignal("sys") | self.reset,
102101

103102
# Instruction Mem Bus.
104103
o_im_addr_o = im_addr,
@@ -120,55 +119,92 @@ def __init__(self, platform, variant="standard"):
120119

121120
# uRV Instruction Bus.
122121
# --------------------
123-
self.i_fsm = i_fsm = FSM(reset_state="IDLE")
124-
i_fsm.act("IDLE",
125-
If(im_rd,
126-
NextValue(im_valid, 0),
127-
NextState("READ")
128-
)
129-
)
130-
i_fsm.act("READ",
131-
ibus.stb.eq(1),
132-
ibus.cyc.eq(1),
133-
ibus.we.eq(0),
134-
ibus.adr.eq(im_addr),
135-
ibus.sel.eq(0b1111),
136-
If(ibus.ack,
137-
NextValue(im_valid, 1),
138-
NextValue(im_data, ibus.dat_r),
139-
NextState("IDLE")
122+
from litex.soc.integration.common import get_mem_data
123+
124+
try:
125+
# FIXME.
126+
rom_init = get_mem_data("build/sim/software/bios/bios.bin",
127+
data_width = 32,
128+
endianness = "little"
140129
)
141-
)
130+
except:
131+
rom_init = []
132+
rom = Memory(32, depth=131072//4, init=rom_init)
133+
rom_port = rom.get_port()
134+
self.specials += rom, rom_port
135+
136+
self.sync += im_valid.eq(1),
137+
self.comb += [
138+
rom_port.adr.eq(im_addr[2:]),
139+
im_data.eq(rom_port.dat_r),
140+
]
141+
142+
# im_addr_d = Signal(32, reset=0xffffffff)
143+
# self.sync += im_addr_d.eq(im_addr)
144+
# self.i_fsm = i_fsm = FSM(reset_state="IDLE")
145+
# i_fsm.act("IDLE",
146+
# If(im_addr != im_addr_d,
147+
# NextValue(im_valid, 0),
148+
# NextState("READ")
149+
# )
150+
# )
151+
# i_fsm.act("READ",
152+
# ibus.stb.eq(1),
153+
# ibus.cyc.eq(1),
154+
# ibus.we.eq(0),
155+
# ibus.adr.eq(im_addr),
156+
# ibus.sel.eq(0b1111),
157+
# If(ibus.ack,
158+
# NextValue(im_valid, 1),
159+
# NextValue(im_data, ibus.dat_r),
160+
# NextState("IDLE")
161+
# )
162+
# )
142163

143164
# uRV Data Bus.
144165
# -------------
145-
self.d_fsm = d_fsm = FSM(reset_state="IDLE")
146-
d_fsm.act("IDLE",
147-
If(dm_store,
148-
NextState("WRITE")
149-
),
150-
If(dm_load,
151-
NextState("READ")
166+
self.dm_fifo = dm_fifo = stream.SyncFIFO(
167+
layout = [("addr", 32), ("we", 1), ("data", 32), ("sel", 4)],
168+
depth = 16,
169+
)
170+
self.comb += [
171+
dm_fifo.sink.valid.eq(dm_store | dm_load),
172+
dm_fifo.sink.we.eq(dm_store),
173+
dm_fifo.sink.addr.eq(dm_addr),
174+
dm_fifo.sink.data.eq(dm_data_s),
175+
dm_fifo.sink.sel.eq(dm_data_select),
176+
]
177+
self.dm_fsm = dm_fsm = FSM(reset_state="IDLE")
178+
dm_fsm.act("IDLE",
179+
If(dm_fifo.source.valid,
180+
If(dm_fifo.source.we,
181+
NextState("WRITE")
182+
).Else(
183+
NextState("READ")
184+
)
152185
)
153186
)
154-
d_fsm.act("WRITE",
187+
dm_fsm.act("WRITE",
155188
dbus.stb.eq(1),
156189
dbus.cyc.eq(1),
157190
dbus.we.eq(1),
158-
dbus.adr.eq(dm_addr),
159-
dbus.sel.eq(dm_data_select),
160-
dbus.dat_w.eq(dm_data_s),
191+
dbus.adr.eq(dm_fifo.source.addr),
192+
dbus.sel.eq(dm_fifo.source.sel),
193+
dbus.dat_w.eq(dm_fifo.source.data),
161194
If(dbus.ack,
195+
dm_fifo.source.ready.eq(1),
196+
dm_store_done.eq(1),
162197
NextState("IDLE")
163198
)
164199
)
165-
d_fsm.act("READ",
200+
dm_fsm.act("READ",
166201
dbus.stb.eq(1),
167202
dbus.cyc.eq(1),
168203
dbus.we.eq(0),
169-
dbus.adr.eq(dm_addr),
170-
dbus.sel.eq(dm_data_select),
204+
dbus.adr.eq(dm_fifo.source.addr),
205+
dbus.sel.eq(dm_fifo.source.sel),
171206
If(dbus.ack,
207+
dm_fifo.source.ready.eq(1),
172208
dm_load_done.eq(1),
173209
dm_data_l.eq(dbus.dat_r),
174210
NextState("IDLE")

0 commit comments

Comments
 (0)