Skip to content

Commit 69b8dc9

Browse files
committed
fix: add logic to support unalign access
1 parent 8733b3d commit 69b8dc9

File tree

1 file changed

+31
-12
lines changed

1 file changed

+31
-12
lines changed

rtl/tc_l2/src/main/scala/axi4/AXI4Bridge.scala

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -296,17 +296,16 @@ class AXI4Bridge() extends Module with AXI4Config {
296296
| (Fill(4, instSizeDouble) & "b0111".U(4.W))
297297
)
298298

299-
protected val instAddrEnd = WireDefault(UInt(4.W), instAddrOpA + instAddrOpB)
300-
protected val instOverstep = WireDefault(instAddrEnd(3, ALIGNED_INST_WIDTH) =/= 0.U)
301-
302-
instAxiLen := Mux(instTransAligned.asBool(), (TRANS_LEN - 1).U, Cat(Fill(7, "b0".U(1.W)), instOverstep))
299+
protected val instAddrEnd = WireDefault(UInt(4.W), instAddrOpA + instAddrOpB)
300+
protected val instOverstep = WireDefault(instAddrEnd(3, ALIGNED_INST_WIDTH) =/= 0.U)
303301
protected val instAxiSize = AXI_INST_SIZE
304302
protected val instAxiAddr = Cat(io.inst.addr(AxiAddrWidth - 1, ALIGNED_INST_WIDTH), Fill(ALIGNED_INST_WIDTH, "b0".U(1.W)))
305303
protected val instAlignedOffsetLow = Wire(UInt(OFFSET_INST_WIDTH.W))
306304
protected val instAlignedOffsetHig = Wire(UInt(OFFSET_INST_WIDTH.W))
307305
protected val instMask = Wire(UInt(MASK_INST_WIDTH.W))
308306

309-
instAlignedOffsetLow := Cat(OFFSET_INST_WIDTH.U - Fill(ALIGNED_INST_WIDTH, "b0".U(1.W)), io.inst.addr(ALIGNED_INST_WIDTH - 1, 0)) << 3
307+
instAxiLen := Mux(instTransAligned.asBool(), (TRANS_LEN - 1).U, Cat(Fill(7, "b0".U(1.W)), instOverstep))
308+
instAlignedOffsetLow := Cat(OFFSET_INST_WIDTH.U, io.inst.addr(ALIGNED_INST_WIDTH - 1, 0)) << 3
310309
instAlignedOffsetHig := AxiInstDataWidth.U - instAlignedOffsetLow
311310
instMask := (
312311
(Fill(MASK_INST_WIDTH, instSizeByte) & Cat(Fill(8, "b0".U(1.W)), "hff".U(8.W)))
@@ -396,14 +395,19 @@ class AXI4Bridge() extends Module with AXI4Config {
396395
when(
397396
(io.mem.addr >= UartBaseAddr && io.mem.addr <= UartBoundAddr) ||
398397
(io.mem.addr >= SpiBaseAddr && io.mem.addr <= SpiBoundAddr) ||
398+
(io.mem.addr >= FlashBaseAddr && io.mem.addr <= FlashBoundAddr) ||
399399
(io.mem.addr >= ChiplinkBaseAddr && io.mem.addr <= ChiplinkBoundAddr)
400400
) {
401-
memTransAligned := io.mem.addr(ALIGNED_PERIPH_MEM_WIDTH - 1, 0) === 0.U
402-
memAddrOpA := Cat(0.U, io.mem.addr(ALIGNED_PERIPH_MEM_WIDTH - 1, 0))
403-
memOverstep := memAddrEnd(3, ALIGNED_PERIPH_MEM_WIDTH) =/= 0.U
404-
memAxiSize := 2.U
405-
memAxiAddr := Cat(io.mem.addr(AxiAddrWidth - 1, ALIGNED_PERIPH_MEM_WIDTH), Fill(ALIGNED_PERIPH_MEM_WIDTH, "b0".U(1.W)))
406-
memAlignedOffsetLow := Cat(OFFSET_PERIPH_MEM_WIDTH.U - Fill(ALIGNED_PERIPH_MEM_WIDTH, "b0".U(1.W)), io.mem.addr(ALIGNED_PERIPH_MEM_WIDTH - 1, 0)) << 3
401+
// memTransAligned := io.mem.addr(ALIGNED_PERIPH_MEM_WIDTH - 1, 0) === 0.U
402+
memTransAligned := true.B
403+
memAddrOpA := Cat(0.U, io.mem.addr(ALIGNED_PERIPH_MEM_WIDTH - 1, 0))
404+
// memOverstep := memAddrEnd(3, ALIGNED_PERIPH_MEM_WIDTH) =/= 0.U
405+
memOverstep := false.B
406+
memAxiSize := 2.U
407+
// memAxiAddr := Cat(io.mem.addr(AxiAddrWidth - 1, ALIGNED_PERIPH_MEM_WIDTH), Fill(ALIGNED_PERIPH_MEM_WIDTH, "b0".U(1.W)))
408+
memAxiAddr := io.mem.addr
409+
// need to limit the bitlen!!!!
410+
memAlignedOffsetLow := Cat(io.mem.addr(ALIGNED_PERIPH_MEM_WIDTH - 1, 0), 0.U, 0.U, 0.U)
407411
memAlignedOffsetHig := AxiPerifDataWidth.U - memAlignedOffsetLow
408412
memMask := (
409413
(Fill(MASK_PERIPH_MEM_WIDTH, memSizeByte) & Cat(Fill(8, "b0".U(1.W)), "hff".U(8.W)))
@@ -416,13 +420,21 @@ class AXI4Bridge() extends Module with AXI4Config {
416420
memMaskHig := memMask(MASK_PERIPH_MEM_WIDTH - 1, AxiPerifDataWidth)
417421
memStrbLow := memStrb << io.mem.addr(ALIGNED_PERIPH_MEM_WIDTH - 1, 0)
418422
memStrbHig := memStrb >> (AxiPerifDataWidth / 8).U - io.mem.addr(ALIGNED_PERIPH_MEM_WIDTH - 1, 0)
423+
424+
// when(io.mem.wdata =/= 0.U) {
425+
// printf(p"[axi4] flash access\n")
426+
// printf(p"[axi4]memAlignedOffsetLow = 0x${Hexadecimal(memAlignedOffsetLow)}\n")
427+
// printf(p"[axi4]io.mem.addr = 0x${Hexadecimal(io.mem.addr)}\n")
428+
// printf(p"[axi4]io.mem.wdata = 0x${Hexadecimal(io.mem.wdata)}\n")
429+
// printf(p"[axi4]io.mem.wdata << memAlignedOffsetLow = 0x${Hexadecimal(io.mem.wdata << memAlignedOffsetLow)}\n\n")
430+
// }
419431
}.otherwise {
420432
memTransAligned := io.mem.addr(ALIGNED_MEM_WIDTH - 1, 0) === 0.U
421433
memAddrOpA := Cat(0.U, io.mem.addr(ALIGNED_MEM_WIDTH - 1, 0))
422434
memOverstep := memAddrEnd(3, ALIGNED_MEM_WIDTH) =/= 0.U
423435
memAxiSize := 3.U
424436
memAxiAddr := Cat(io.mem.addr(AxiAddrWidth - 1, ALIGNED_MEM_WIDTH), Fill(ALIGNED_MEM_WIDTH, "b0".U(1.W)))
425-
memAlignedOffsetLow := Cat(OFFSET_MEM_WIDTH.U - Fill(ALIGNED_MEM_WIDTH, "b0".U(1.W)), io.mem.addr(ALIGNED_MEM_WIDTH - 1, 0)) << 3
437+
memAlignedOffsetLow := Cat(OFFSET_MEM_WIDTH.U, io.mem.addr(ALIGNED_MEM_WIDTH - 1, 0)) << 3
426438
memAlignedOffsetHig := AxiDataWidth.U - memAlignedOffsetLow
427439
memMask := (
428440
(Fill(MASK_MEM_WIDTH, memSizeByte) & Cat(Fill(8, "b0".U(1.W)), "hff".U(8.W)))
@@ -435,6 +447,13 @@ class AXI4Bridge() extends Module with AXI4Config {
435447
memMaskHig := memMask(MASK_MEM_WIDTH - 1, AxiDataWidth)
436448
memStrbLow := memStrb << io.mem.addr(ALIGNED_MEM_WIDTH - 1, 0)
437449
memStrbHig := memStrb >> ((AxiDataWidth / 8).U - io.mem.addr(ALIGNED_MEM_WIDTH - 1, 0))
450+
// when(io.mem.wdata =/= 0.U) {
451+
// printf(p"[axi4] ram access\n")
452+
// printf(p"[axi4]memAlignedOffsetLow = 0x${Hexadecimal(memAlignedOffsetLow)}\n")
453+
// printf(p"[axi4]io.mem.addr = 0x${Hexadecimal(io.mem.addr)}\n")
454+
// printf(p"[axi4]io.mem.wdata = 0x${Hexadecimal(io.mem.wdata)}\n")
455+
// printf(p"[axi4]io.mem.wdata << memAlignedOffsetLow = 0x${Hexadecimal(io.mem.wdata << memAlignedOffsetLow)}\n\n")
456+
// }
438457
}
439458

440459
protected val memAxiUser = Fill(AxiUserLen, "b0".U(1.W))

0 commit comments

Comments
 (0)