10
10
11
11
from litex .gen import *
12
12
13
+ from litex .soc .interconnect import stream
14
+
13
15
from litex .soc .interconnect import wishbone
14
16
from litex .soc .cores .cpu import CPU , CPU_GCC_TRIPLE_RISCV32
15
17
@@ -62,14 +64,14 @@ def __init__(self, platform, variant="standard"):
62
64
self .ibus = ibus = wishbone .Interface (data_width = 32 , address_width = 32 , addressing = "byte" )
63
65
self .dbus = dbus = wishbone .Interface (data_width = 32 , address_width = 32 , addressing = "byte" )
64
66
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).
66
68
67
69
# uRV Signals.
68
70
# ------------
69
71
im_addr = Signal (32 )
70
- im_rd = Signal (1 )
72
+ im_rd = Signal ()
71
73
im_data = Signal (32 )
72
- im_valid = Signal (1 )
74
+ im_valid = Signal ()
73
75
74
76
dm_addr = Signal (32 )
75
77
dm_data_s = Signal (32 )
@@ -80,9 +82,6 @@ def __init__(self, platform, variant="standard"):
80
82
dm_load_done = Signal ()
81
83
dm_store_done = Signal ()
82
84
83
- rst_count = Signal (8 , reset = 16 )
84
- self .sync += If (rst_count != 0 , rst_count .eq (rst_count - 1 ))
85
-
86
85
# uRV Instance.
87
86
# -------------
88
87
self .cpu_params = dict (
@@ -97,8 +96,8 @@ def __init__(self, platform, variant="standard"):
97
96
p_g_with_compressed_insns = 0 ,
98
97
99
98
# 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 ,
102
101
103
102
# Instruction Mem Bus.
104
103
o_im_addr_o = im_addr ,
@@ -120,55 +119,92 @@ def __init__(self, platform, variant="standard"):
120
119
121
120
# uRV Instruction Bus.
122
121
# --------------------
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"
140
129
)
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
+ # )
142
163
143
164
# uRV Data Bus.
144
165
# -------------
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
+ )
152
185
)
153
186
)
154
- d_fsm .act ("WRITE" ,
187
+ dm_fsm .act ("WRITE" ,
155
188
dbus .stb .eq (1 ),
156
189
dbus .cyc .eq (1 ),
157
190
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 ),
161
194
If (dbus .ack ,
195
+ dm_fifo .source .ready .eq (1 ),
196
+ dm_store_done .eq (1 ),
162
197
NextState ("IDLE" )
163
198
)
164
199
)
165
- d_fsm .act ("READ" ,
200
+ dm_fsm .act ("READ" ,
166
201
dbus .stb .eq (1 ),
167
202
dbus .cyc .eq (1 ),
168
203
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 ),
171
206
If (dbus .ack ,
207
+ dm_fifo .source .ready .eq (1 ),
172
208
dm_load_done .eq (1 ),
173
209
dm_data_l .eq (dbus .dat_r ),
174
210
NextState ("IDLE" )
0 commit comments