Pass through full address for unaligned operations
Signed-off-by: Alex Forencich <alex@alexforencich.com>
This commit is contained in:
@@ -476,7 +476,7 @@ class AxiMasterWrite(Region, Reset):
|
|||||||
|
|
||||||
cycles = (len(cmd.data) + (cmd.address % num_bytes) + num_bytes-1) // num_bytes
|
cycles = (len(cmd.data) + (cmd.address % num_bytes) + num_bytes-1) // num_bytes
|
||||||
|
|
||||||
cur_addr = aligned_addr
|
cur_addr = cmd.address
|
||||||
offset = 0
|
offset = 0
|
||||||
cycle_offset = aligned_addr-word_addr
|
cycle_offset = aligned_addr-word_addr
|
||||||
n = 0
|
n = 0
|
||||||
@@ -563,7 +563,10 @@ class AxiMasterWrite(Region, Reset):
|
|||||||
|
|
||||||
await self.w_channel.send(w)
|
await self.w_channel.send(w)
|
||||||
|
|
||||||
cur_addr += num_bytes
|
if k == 0:
|
||||||
|
cur_addr = aligned_addr + num_bytes
|
||||||
|
else:
|
||||||
|
cur_addr += num_bytes
|
||||||
cycle_offset = (cycle_offset + num_bytes) % self.byte_lanes
|
cycle_offset = (cycle_offset + num_bytes) % self.byte_lanes
|
||||||
|
|
||||||
resp_cmd = AxiWriteRespCmd(cmd.address, len(cmd.data), cmd.size, cycles, cmd.prot, burst_list, cmd.event)
|
resp_cmd = AxiWriteRespCmd(cmd.address, len(cmd.data), cmd.size, cycles, cmd.prot, burst_list, cmd.event)
|
||||||
@@ -870,7 +873,7 @@ class AxiMasterRead(Region, Reset):
|
|||||||
|
|
||||||
burst_list = []
|
burst_list = []
|
||||||
|
|
||||||
cur_addr = aligned_addr
|
cur_addr = cmd.address
|
||||||
n = 0
|
n = 0
|
||||||
|
|
||||||
burst_length = 0
|
burst_length = 0
|
||||||
@@ -915,7 +918,10 @@ class AxiMasterRead(Region, Reset):
|
|||||||
self.log.info("Read burst start arid: 0x%x araddr: 0x%08x arlen: %d arsize: %d arprot: %s",
|
self.log.info("Read burst start arid: 0x%x araddr: 0x%08x arlen: %d arsize: %d arprot: %s",
|
||||||
arid, cur_addr, burst_length-1, cmd.size, cmd.prot)
|
arid, cur_addr, burst_length-1, cmd.size, cmd.prot)
|
||||||
|
|
||||||
cur_addr += num_bytes
|
if k == 0:
|
||||||
|
cur_addr = aligned_addr + num_bytes
|
||||||
|
else:
|
||||||
|
cur_addr += num_bytes
|
||||||
|
|
||||||
resp_cmd = AxiReadRespCmd(cmd.address, cmd.length, cmd.size, cycles, cmd.prot, burst_list, cmd.event)
|
resp_cmd = AxiReadRespCmd(cmd.address, cmd.length, cmd.size, cycles, cmd.prot, burst_list, cmd.event)
|
||||||
self.tag_context_manager.start_cmd(arid, resp_cmd)
|
self.tag_context_manager.start_cmd(arid, resp_cmd)
|
||||||
|
|||||||
@@ -286,7 +286,10 @@ class AxiLiteMasterWrite(Region, Reset):
|
|||||||
offset += 1
|
offset += 1
|
||||||
|
|
||||||
aw = self.aw_channel._transaction_obj()
|
aw = self.aw_channel._transaction_obj()
|
||||||
aw.awaddr = word_addr + k*self.byte_lanes
|
if k == 0:
|
||||||
|
aw.awaddr = cmd.address
|
||||||
|
else:
|
||||||
|
aw.awaddr = word_addr + k*self.byte_lanes
|
||||||
aw.awprot = cmd.prot
|
aw.awprot = cmd.prot
|
||||||
|
|
||||||
if not self.wstrb_present and strb != self.strb_mask:
|
if not self.wstrb_present and strb != self.strb_mask:
|
||||||
@@ -494,7 +497,10 @@ class AxiLiteMasterRead(Region, Reset):
|
|||||||
|
|
||||||
for k in range(cycles):
|
for k in range(cycles):
|
||||||
ar = self.ar_channel._transaction_obj()
|
ar = self.ar_channel._transaction_obj()
|
||||||
ar.araddr = word_addr + k*self.byte_lanes
|
if k == 0:
|
||||||
|
ar.araddr = cmd.address
|
||||||
|
else:
|
||||||
|
ar.araddr = word_addr + k*self.byte_lanes
|
||||||
ar.arprot = cmd.prot
|
ar.arprot = cmd.prot
|
||||||
|
|
||||||
await self.ar_channel.send(ar)
|
await self.ar_channel.send(ar)
|
||||||
|
|||||||
Reference in New Issue
Block a user