@@ -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