@@ -2,6 +2,7 @@ package treecorel2
22
33import chisel3 ._
44import chisel3 .util ._
5+ import treecorel2 .common .ConstVal ._
56
67object AXI4Bridge {
78 // Burst types
@@ -62,7 +63,7 @@ object AXI4Bridge {
6263 val SIZE_D = " b11" .U (2 .W )
6364}
6465
65- class AXI4Bridge () extends Module with AXI4Config with InstConfig {
66+ class AXI4Bridge () extends Module with AXI4Config {
6667 val io = IO (new Bundle {
6768 val inst : AXI4USERIO = new AXI4USERIO
6869 val mem : AXI4USERIO = new AXI4USERIO
@@ -283,27 +284,31 @@ class AXI4Bridge() extends Module with AXI4Config with InstConfig {
283284 }
284285
285286// ------------------Process Data------------------
286- protected val ALIGNED_WIDTH = 3 // eval: log2(AxiDataWidth / 8)
287- protected val OFFSET_WIDTH = 6 // eval: log2(AxiDataWidth)
288- protected val AXI_INST_SIZE = if (SoCEna ) 2 .U else 3 .U // because the flash only support 4 bytes access
289- protected val AXI_MEM_SIZE = 3 .U
290- protected val MASK_WIDTH = 128 // eval: AxiDataWidth * 2
291- protected val TRANS_LEN = 1 // eval: 1
292- protected val BLOCK_TRANS = false .B
293-
294- // inst data
287+ protected val ALIGNED_INST_WIDTH = log2Ceil(AxiInstDataWidth / 8 )
288+ protected val OFFSET_INST_WIDTH = log2Ceil(AxiInstDataWidth )
289+ protected val MASK_INST_WIDTH = AxiInstDataWidth * 2
290+ protected val AXI_INST_SIZE = if (SoCEna ) 2 .U else 3 .U // because the flash only support 4 bytes access
291+
292+ protected val ALIGNED_MEM_WIDTH = log2Ceil(AxiDataWidth / 8 )
293+ protected val OFFSET_MEM_WIDTH = log2Ceil(AxiDataWidth )
294+ protected val MASK_MEM_WIDTH = AxiDataWidth * 2
295+
296+ protected val TRANS_LEN = 1 // eval: 1
297+ protected val BLOCK_TRANS = false .B
298+
299+ // ================================inst data=======================
295300 // no-aligned visit
296- protected val instTransAligned = WireDefault (BLOCK_TRANS || io.inst.addr(ALIGNED_WIDTH - 1 , 0 ) === 0 .U )
301+ protected val instTransAligned = WireDefault (BLOCK_TRANS || io.inst.addr(ALIGNED_INST_WIDTH - 1 , 0 ) === 0 .U )
297302 protected val instSizeByte = WireDefault (io.inst.size === AXI4Bridge .SIZE_B )
298303 protected val instSizeHalf = WireDefault (io.inst.size === AXI4Bridge .SIZE_H )
299304 protected val instSizeWord = WireDefault (io.inst.size === AXI4Bridge .SIZE_W )
300305 protected val instSizeDouble = WireDefault (io.inst.size === AXI4Bridge .SIZE_D )
301- // opa: 0100xxx
306+ // opa: 0xxx
302307 // opb: b: 0000
303308 // h: 0001
304309 // w: 0011
305310 // d: 0111
306- protected val instAddrOpA = WireDefault (UInt (4 .W ), Cat (0 .U , io.inst.addr(ALIGNED_WIDTH - 1 , 0 )))
311+ protected val instAddrOpA = WireDefault (UInt (4 .W ), Cat (0 .U , io.inst.addr(ALIGNED_INST_WIDTH - 1 , 0 )))
307312 protected val instAddrOpB = WireDefault (
308313 UInt (4 .W ),
309314 (Fill (4 , instSizeByte) & " b0000" .U (4 .W ))
@@ -313,26 +318,26 @@ class AXI4Bridge() extends Module with AXI4Config with InstConfig {
313318 )
314319
315320 protected val instAddrEnd = WireDefault (UInt (4 .W ), instAddrOpA + instAddrOpB)
316- protected val instOverstep = WireDefault (instAddrEnd(3 , ALIGNED_WIDTH ) =/= 0 .U )
321+ protected val instOverstep = WireDefault (instAddrEnd(3 , ALIGNED_INST_WIDTH ) =/= 0 .U )
317322
318323 instAxiLen := Mux (instTransAligned.asBool(), (TRANS_LEN - 1 ).U , Cat (Fill (7 , " b0" .U (1 .W )), instOverstep))
319324 protected val instAxiSize = AXI_INST_SIZE
320- protected val instAxiAddr = Cat (io.inst.addr(AxiAddrWidth - 1 , ALIGNED_WIDTH ), Fill (ALIGNED_WIDTH , " b0" .U (1 .W )))
321- protected val instAlignedOffsetLow = Wire (UInt (OFFSET_WIDTH .W ))
322- protected val instAlignedOffsetHig = Wire (UInt (OFFSET_WIDTH .W ))
323- protected val instMask = Wire (UInt (MASK_WIDTH .W ))
325+ protected val instAxiAddr = Cat (io.inst.addr(AxiAddrWidth - 1 , ALIGNED_INST_WIDTH ), Fill (ALIGNED_INST_WIDTH , " b0" .U (1 .W )))
326+ protected val instAlignedOffsetLow = Wire (UInt (OFFSET_INST_WIDTH .W ))
327+ protected val instAlignedOffsetHig = Wire (UInt (OFFSET_INST_WIDTH .W ))
328+ protected val instMask = Wire (UInt (MASK_INST_WIDTH .W ))
324329
325- instAlignedOffsetLow := Cat (OFFSET_WIDTH .U - Fill (ALIGNED_WIDTH , " b0" .U (1 .W )), io.inst.addr(ALIGNED_WIDTH - 1 , 0 )) << 3
330+ instAlignedOffsetLow := Cat (OFFSET_INST_WIDTH .U - Fill (ALIGNED_INST_WIDTH , " b0" .U (1 .W )), io.inst.addr(ALIGNED_INST_WIDTH - 1 , 0 )) << 3
326331 instAlignedOffsetHig := BusWidth .U - instAlignedOffsetLow
327332 instMask := (
328- (Fill (MASK_WIDTH , instSizeByte) & Cat (Fill (8 , " b0" .U (1 .W )), " hff" .U (8 .W )))
329- | (Fill (MASK_WIDTH , instSizeHalf) & Cat (Fill (16 , " b0" .U (1 .W )), " hffff" .U (16 .W )))
330- | (Fill (MASK_WIDTH , instSizeWord) & Cat (Fill (32 , " b0" .U (1 .W )), " hffffffff" .U (32 .W )))
331- | (Fill (MASK_WIDTH , instSizeDouble) & Cat (Fill (64 , " b0" .U (1 .W )), " hffffffff_ffffffff" .U (64 .W )))
333+ (Fill (MASK_INST_WIDTH , instSizeByte) & Cat (Fill (8 , " b0" .U (1 .W )), " hff" .U (8 .W )))
334+ | (Fill (MASK_INST_WIDTH , instSizeHalf) & Cat (Fill (16 , " b0" .U (1 .W )), " hffff" .U (16 .W )))
335+ | (Fill (MASK_INST_WIDTH , instSizeWord) & Cat (Fill (32 , " b0" .U (1 .W )), " hffffffff" .U (32 .W )))
336+ | (Fill (MASK_INST_WIDTH , instSizeDouble) & Cat (Fill (64 , " b0" .U (1 .W )), " hffffffff_ffffffff" .U (64 .W )))
332337 ) << instAlignedOffsetLow
333338
334- protected val instMaskLow = instMask(AxiDataWidth - 1 , 0 )
335- protected val instMaskHig = instMask(MASK_WIDTH - 1 , AxiDataWidth )
339+ protected val instMaskLow = instMask(AxiInstDataWidth - 1 , 0 )
340+ protected val instMaskHig = instMask(MASK_INST_WIDTH - 1 , AxiInstDataWidth )
336341 protected val instAxiUser = WireDefault (UInt (AxiUserLen .W ), Fill (AxiUserLen , " b0" .U (1 .W )))
337342 protected val instReady = RegInit (false .B )
338343 protected val instReadyNxt = WireDefault (instTransDone)
@@ -352,14 +357,14 @@ class AXI4Bridge() extends Module with AXI4Config with InstConfig {
352357 }
353358 io.inst.resp := instResp
354359
355- // ================================mem data
356- protected val memTransAligned = WireDefault (BLOCK_TRANS || io.mem.addr(ALIGNED_WIDTH - 1 , 0 ) === 0 .U )
360+ // ================================mem data=======================
361+ protected val memTransAligned = WireDefault (BLOCK_TRANS || io.mem.addr(ALIGNED_MEM_WIDTH - 1 , 0 ) === 0 .U )
357362 protected val memSizeByte = WireDefault (io.mem.size === AXI4Bridge .SIZE_B )
358363 protected val memSizeHalf = WireDefault (io.mem.size === AXI4Bridge .SIZE_H )
359364 protected val memSizeWord = WireDefault (io.mem.size === AXI4Bridge .SIZE_W )
360365 protected val memSizeDouble = WireDefault (io.mem.size === AXI4Bridge .SIZE_D )
361366
362- protected val memAddrOpA = WireDefault (UInt (4 .W ), Cat (0 .U , io.mem.addr(ALIGNED_WIDTH - 1 , 0 )))
367+ protected val memAddrOpA = WireDefault (UInt (4 .W ), Cat (0 .U , io.mem.addr(ALIGNED_MEM_WIDTH - 1 , 0 )))
363368 protected val memAddrOpB = WireDefault (
364369 UInt (4 .W ),
365370 (Fill (4 , memSizeByte) & " b0000" .U (4 .W ))
@@ -369,27 +374,40 @@ class AXI4Bridge() extends Module with AXI4Config with InstConfig {
369374 )
370375
371376 protected val memAddrEnd = WireDefault (UInt (4 .W ), memAddrOpA + memAddrOpB)
372- protected val memOverstep = WireDefault (memAddrEnd(3 , ALIGNED_WIDTH ) =/= 0 .U )
377+ protected val memOverstep = WireDefault (memAddrEnd(3 , ALIGNED_MEM_WIDTH ) =/= 0 .U )
373378
374379 memAxiLen := Mux (memTransAligned.asBool(), (TRANS_LEN - 1 ).U , Cat (Fill (7 , " b0" .U (1 .W )), memOverstep))
375380
376- protected val memAxiSize = AXI_MEM_SIZE
377- protected val memAxiAddr = Cat (io.mem.addr(AxiAddrWidth - 1 , ALIGNED_WIDTH ), Fill (ALIGNED_WIDTH , " b0" .U (1 .W )))
378- protected val memAlignedOffsetLow = Wire (UInt (OFFSET_WIDTH .W ))
379- protected val memAlignedOffsetHig = Wire (UInt (OFFSET_WIDTH .W ))
380- protected val memMask = Wire (UInt (MASK_WIDTH .W ))
381+ // flash only support 4 bytes rd(0x3000_0000~0x3fff_ffff)
382+ // periph suport 4 bytes w/r(0x1000_0000~0x1000_1fff)
383+ // chiplink suport 4 bytes w/r(0x4000_0000~0x7fff_ffff)
384+ protected val memAxiSize = Wire (UInt (3 .W ))
385+ when(
386+ (io.mem.addr >= UartBaseAddr && io.mem.addr <= UartBoundAddr ) ||
387+ (io.mem.addr >= SpiBaseAddr && io.mem.addr <= SpiBoundAddr ) ||
388+ (io.mem.addr >= ChiplinkBaseAddr && io.mem.addr <= ChiplinkBoundAddr )
389+ ) {
390+ memAxiSize := 2 .U
391+ }.otherwise {
392+ memAxiSize := 3 .U
393+ }
394+
395+ protected val memAxiAddr = Cat (io.mem.addr(AxiAddrWidth - 1 , ALIGNED_MEM_WIDTH ), Fill (ALIGNED_MEM_WIDTH , " b0" .U (1 .W )))
396+ protected val memAlignedOffsetLow = Wire (UInt (OFFSET_MEM_WIDTH .W ))
397+ protected val memAlignedOffsetHig = Wire (UInt (OFFSET_MEM_WIDTH .W ))
398+ protected val memMask = Wire (UInt (MASK_MEM_WIDTH .W ))
381399
382- memAlignedOffsetLow := Cat (OFFSET_WIDTH .U - Fill (ALIGNED_WIDTH , " b0" .U (1 .W )), io.mem.addr(ALIGNED_WIDTH - 1 , 0 )) << 3
400+ memAlignedOffsetLow := Cat (OFFSET_MEM_WIDTH .U - Fill (ALIGNED_MEM_WIDTH , " b0" .U (1 .W )), io.mem.addr(ALIGNED_MEM_WIDTH - 1 , 0 )) << 3
383401 memAlignedOffsetHig := BusWidth .U - memAlignedOffsetLow
384402 memMask := (
385- (Fill (MASK_WIDTH , memSizeByte) & Cat (Fill (8 , " b0" .U (1 .W )), " hff" .U (8 .W )))
386- | (Fill (MASK_WIDTH , memSizeHalf) & Cat (Fill (16 , " b0" .U (1 .W )), " hffff" .U (16 .W )))
387- | (Fill (MASK_WIDTH , memSizeWord) & Cat (Fill (32 , " b0" .U (1 .W )), " hffffffff" .U (32 .W )))
388- | (Fill (MASK_WIDTH , memSizeDouble) & Cat (Fill (64 , " b0" .U (1 .W )), " hffffffff_ffffffff" .U (64 .W )))
403+ (Fill (MASK_MEM_WIDTH , memSizeByte) & Cat (Fill (8 , " b0" .U (1 .W )), " hff" .U (8 .W )))
404+ | (Fill (MASK_MEM_WIDTH , memSizeHalf) & Cat (Fill (16 , " b0" .U (1 .W )), " hffff" .U (16 .W )))
405+ | (Fill (MASK_MEM_WIDTH , memSizeWord) & Cat (Fill (32 , " b0" .U (1 .W )), " hffffffff" .U (32 .W )))
406+ | (Fill (MASK_MEM_WIDTH , memSizeDouble) & Cat (Fill (64 , " b0" .U (1 .W )), " hffffffff_ffffffff" .U (64 .W )))
389407 ) << memAlignedOffsetLow
390408
391409 protected val memMaskLow = memMask(AxiDataWidth - 1 , 0 )
392- protected val memMaskHig = memMask(MASK_WIDTH - 1 , AxiDataWidth )
410+ protected val memMaskHig = memMask(MASK_MEM_WIDTH - 1 , AxiDataWidth )
393411 protected val memStrb = Wire (UInt ((AxiDataWidth / 8 ).W ))
394412
395413 memStrb := (
@@ -399,8 +417,8 @@ class AXI4Bridge() extends Module with AXI4Config with InstConfig {
399417 | ((Fill (8 , memSizeDouble) & " b1111_1111" .U (8 .W )))
400418 )
401419
402- protected val memStrbLow = WireDefault (UInt ((AxiDataWidth / 8 ).W ), memStrb << io.mem.addr(ALIGNED_WIDTH - 1 , 0 ))
403- protected val memStrbHig = WireDefault (UInt ((AxiDataWidth / 8 ).W ), memStrb >> ((AxiDataWidth / 8 ).U - io.mem.addr(ALIGNED_WIDTH - 1 , 0 )))
420+ protected val memStrbLow = WireDefault (UInt ((AxiDataWidth / 8 ).W ), memStrb << io.mem.addr(ALIGNED_MEM_WIDTH - 1 , 0 ))
421+ protected val memStrbHig = WireDefault (UInt ((AxiDataWidth / 8 ).W ), memStrb >> ((AxiDataWidth / 8 ).U - io.mem.addr(ALIGNED_MEM_WIDTH - 1 , 0 )))
404422
405423 protected val memAxiUser = Fill (AxiUserLen , " b0" .U (1 .W ))
406424 protected val memReady = RegInit (false .B )
0 commit comments