Successfully read PicoRV32 registers
This commit is contained in:
parent
88e3d15dd8
commit
6b9e594b50
|
@ -294,3 +294,11 @@ Another alternative is to use GNU `m4`.
|
||||||
|
|
||||||
You might have overloaded the CSR bus. Move some CSRs to a wishbone
|
You might have overloaded the CSR bus. Move some CSRs to a wishbone
|
||||||
bus module. See /gateware/swic.py for some simple Wishbone bus examples.
|
bus module. See /gateware/swic.py for some simple Wishbone bus examples.
|
||||||
|
This can also happen due to timing errors across the main CPU bus.
|
||||||
|
|
||||||
|
## Accesses to a Wishbone bus memory area do not work
|
||||||
|
|
||||||
|
Try reading 16 words (64 bytes) into the memory area and see if the
|
||||||
|
behavior changes. Many times this is due to the Wishbone Cache interfering
|
||||||
|
with volatile memory. Set the `cached` parameter in the SoCRegion to
|
||||||
|
`False` when adding the slave.
|
||||||
|
|
|
@ -3,10 +3,11 @@
|
||||||
# For license terms, refer to the files in `doc/copying` in the Upsilon
|
# For license terms, refer to the files in `doc/copying` in the Upsilon
|
||||||
# source distribution.
|
# source distribution.
|
||||||
|
|
||||||
all: make_spi
|
all:
|
||||||
|
echo "dummy"
|
||||||
|
|
||||||
make_spi:
|
#make_spi:
|
||||||
cd spi && make codegen
|
# cd spi && make codegen
|
||||||
|
|
||||||
|
|
||||||
#make_bram:
|
#make_bram:
|
||||||
|
|
|
@ -167,7 +167,7 @@ class UpsilonSoC(SoCCore):
|
||||||
pico = PicoRV32(name, origin, origin+0x10)
|
pico = PicoRV32(name, origin, origin+0x10)
|
||||||
self.add_module(name, pico)
|
self.add_module(name, pico)
|
||||||
self.bus.add_slave(name + "_dbg_reg", pico.debug_reg_read.bus,
|
self.bus.add_slave(name + "_dbg_reg", pico.debug_reg_read.bus,
|
||||||
SoCRegion(origin=None, size=pico.debug_reg_read.width, cached=True))
|
SoCRegion(origin=None, size=pico.debug_reg_read.width, cached=False))
|
||||||
|
|
||||||
ram = self.add_blockram(name + "_ram", size=size, connect_now=False)
|
ram = self.add_blockram(name + "_ram", size=size, connect_now=False)
|
||||||
ram_iface = self.add_preemptive_interface(name + "ram_iface", 2, ram)
|
ram_iface = self.add_preemptive_interface(name + "ram_iface", 2, ram)
|
||||||
|
|
|
@ -117,6 +117,7 @@ class ControlLoopParameters(LiteXModule):
|
||||||
self.bus.err.eq(0),
|
self.bus.err.eq(0),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
self.did_write = CSRStatus(8)
|
||||||
self.sync += [
|
self.sync += [
|
||||||
If(self.bus.cyc & self.bus.stb & ~self.bus.ack,
|
If(self.bus.cyc & self.bus.stb & ~self.bus.ack,
|
||||||
Case(self.bus.adr[0:4], {
|
Case(self.bus.adr[0:4], {
|
||||||
|
@ -125,7 +126,8 @@ class ControlLoopParameters(LiteXModule):
|
||||||
0x8: self.bus.dat_r.eq(self.deltaT.storage),
|
0x8: self.bus.dat_r.eq(self.deltaT.storage),
|
||||||
0xC: self.bus.dat_r.eq(self.setpt.storage),
|
0xC: self.bus.dat_r.eq(self.setpt.storage),
|
||||||
0x10: If(self.bus.we,
|
0x10: If(self.bus.we,
|
||||||
self.zset.status.eq(self.bus.dat_w)
|
self.zset.status.eq(self.bus.dat_w),
|
||||||
|
self.did_write.status.eq(self.did_write.status + 1),
|
||||||
).Else(
|
).Else(
|
||||||
self.bus.dat_r.eq(self.zset.status)
|
self.bus.dat_r.eq(self.zset.status)
|
||||||
),
|
),
|
||||||
|
@ -137,7 +139,7 @@ class ControlLoopParameters(LiteXModule):
|
||||||
"default": self.bus.dat_r.eq(0xdeadc0de),
|
"default": self.bus.dat_r.eq(0xdeadc0de),
|
||||||
}),
|
}),
|
||||||
self.bus.ack.eq(1),
|
self.bus.ack.eq(1),
|
||||||
).Elif(self.bus.cyc != 1,
|
).Elif(~self.bus.cyc,
|
||||||
self.bus.ack.eq(0),
|
self.bus.ack.eq(0),
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
@ -146,14 +148,14 @@ class PicoRV32RegisterRead(LiteXModule):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.regs = [Signal(32) for i in range(1,32)]
|
self.regs = [Signal(32) for i in range(1,32)]
|
||||||
self.bus = Interface(data_width = 32, address_width = 32, addressing="byte")
|
self.bus = Interface(data_width = 32, address_width = 32, addressing="byte")
|
||||||
self.width = 0x80
|
self.width = 0x100
|
||||||
|
|
||||||
cases = {"default": self.bus.dat_r.eq(0xdeaddead)}
|
cases = {"default": self.bus.dat_r.eq(0xdeaddead)}
|
||||||
for i, reg in enumerate(self.regs):
|
for i, reg in enumerate(self.regs):
|
||||||
cases[i*0x4] = self.bus.dat_r.eq(reg)
|
cases[i*0x4] = self.bus.dat_r.eq(reg)
|
||||||
|
|
||||||
# self.debug_addr = CSRStatus(32)
|
self.debug_addr = CSRStatus(32)
|
||||||
# self.debug_cntr = CSRStatus(16)
|
self.debug_cntr = CSRStatus(16)
|
||||||
|
|
||||||
# CYC -> transfer in progress
|
# CYC -> transfer in progress
|
||||||
# STB -> data is valid on the input lines
|
# STB -> data is valid on the input lines
|
||||||
|
@ -161,8 +163,8 @@ class PicoRV32RegisterRead(LiteXModule):
|
||||||
If(self.bus.cyc & self.bus.stb & ~self.bus.ack,
|
If(self.bus.cyc & self.bus.stb & ~self.bus.ack,
|
||||||
Case(self.bus.adr[0:7], cases),
|
Case(self.bus.adr[0:7], cases),
|
||||||
self.bus.ack.eq(1),
|
self.bus.ack.eq(1),
|
||||||
#self.debug_addr.status.eq(self.bus.adr),
|
self.debug_addr.status.eq(self.bus.adr),
|
||||||
#self.debug_cntr.status.eq(self.debug_cntr.status + 1),
|
self.debug_cntr.status.eq(self.debug_cntr.status + 1),
|
||||||
).Elif(self.bus.cyc != 1,
|
).Elif(self.bus.cyc != 1,
|
||||||
self.bus.ack.eq(0)
|
self.bus.ack.eq(0)
|
||||||
)
|
)
|
||||||
|
|
|
@ -17,7 +17,7 @@ def check_running():
|
||||||
print("Opcode:", u(machine.mem32[pico0_dbg_insn_opcode]))
|
print("Opcode:", u(machine.mem32[pico0_dbg_insn_opcode]))
|
||||||
|
|
||||||
for num in range(0,31):
|
for num in range(0,31):
|
||||||
print("Register", num + 1, u(machine.mem32[pico0_dbg_reg + num*0x4]))
|
print("Reg", num + 1, ":", u(machine.mem32[pico0_dbg_reg + num*0x4]))
|
||||||
|
|
||||||
def run_program(prog, cl_I):
|
def run_program(prog, cl_I):
|
||||||
# Reset PicoRV32
|
# Reset PicoRV32
|
||||||
|
|
Loading…
Reference in New Issue