debug: DATA Region has to be aligned for ld/sd to correctly detect 64-bit cores.
This commit is contained in:
parent
b44d5f9386
commit
af6b2d8051
@ -53,10 +53,20 @@ object DsbRegAddrs{
|
|||||||
def EXCEPTION = 0x10C
|
def EXCEPTION = 0x10C
|
||||||
|
|
||||||
def WHERETO = 0x300
|
def WHERETO = 0x300
|
||||||
def ABSTRACT = 0x304
|
// This needs to be aligned for up to lq/sq
|
||||||
def PROGBUF = 0x304 + 8
|
|
||||||
// This shows up in HartInfo
|
|
||||||
def DATA(cfg: DebugModuleConfig) = {PROGBUF + (cfg.nProgramBufferWords * 4)}
|
// This shows up in HartInfo, and needs to be aligned
|
||||||
|
// to enable up to LQ/SQ instructions.
|
||||||
|
def DATA = 0x380
|
||||||
|
|
||||||
|
// We want DATA to immediately follow PROGBUF so that we can
|
||||||
|
// use them interchangeably.
|
||||||
|
def PROGBUF(cfg:DebugModuleConfig) = {DATA - (cfg.nProgramBufferWords * 4)}
|
||||||
|
|
||||||
|
// We want abstract to be immediately before PROGBUF
|
||||||
|
// because we auto-generate 2 instructions.
|
||||||
|
def ABSTRACT(cfg:DebugModuleConfig) = PROGBUF(cfg) - 8
|
||||||
|
|
||||||
def FLAGS = 0x400
|
def FLAGS = 0x400
|
||||||
def ROMBASE = 0x800
|
def ROMBASE = 0x800
|
||||||
@ -540,7 +550,7 @@ class TLDebugModuleInner(device: Device, getNComponents: () => Int)(implicit p:
|
|||||||
val HARTINFORdData = Wire (init = (new HARTINFOFields()).fromBits(0.U))
|
val HARTINFORdData = Wire (init = (new HARTINFOFields()).fromBits(0.U))
|
||||||
HARTINFORdData.dataaccess := true.B
|
HARTINFORdData.dataaccess := true.B
|
||||||
HARTINFORdData.datasize := cfg.nAbstractDataWords.U
|
HARTINFORdData.datasize := cfg.nAbstractDataWords.U
|
||||||
HARTINFORdData.dataaddr := DsbRegAddrs.DATA(cfg).U
|
HARTINFORdData.dataaddr := DsbRegAddrs.DATA.U
|
||||||
HARTINFORdData.nscratch := cfg.nScratch.U
|
HARTINFORdData.nscratch := cfg.nScratch.U
|
||||||
|
|
||||||
//----HALTSUM (and halted registers)
|
//----HALTSUM (and halted registers)
|
||||||
@ -734,7 +744,7 @@ class TLDebugModuleInner(device: Device, getNComponents: () => Int)(implicit p:
|
|||||||
val goReg = Reg(Bool())
|
val goReg = Reg(Bool())
|
||||||
val goAbstract = Wire(init = false.B)
|
val goAbstract = Wire(init = false.B)
|
||||||
val jalAbstract = Wire(init = (new GeneratedUJ()).fromBits(rocket.Instructions.JAL.value.U))
|
val jalAbstract = Wire(init = (new GeneratedUJ()).fromBits(rocket.Instructions.JAL.value.U))
|
||||||
jalAbstract.setImm(ABSTRACT - WHERETO)
|
jalAbstract.setImm(ABSTRACT(cfg) - WHERETO)
|
||||||
|
|
||||||
when (~io.dmactive){
|
when (~io.dmactive){
|
||||||
goReg := false.B
|
goReg := false.B
|
||||||
@ -819,14 +829,14 @@ class TLDebugModuleInner(device: Device, getNComponents: () => Int)(implicit p:
|
|||||||
abstractGeneratedI.rd := (accessRegisterCommandReg.regno & 0x1F.U)
|
abstractGeneratedI.rd := (accessRegisterCommandReg.regno & 0x1F.U)
|
||||||
abstractGeneratedI.funct3 := accessRegisterCommandReg.size
|
abstractGeneratedI.funct3 := accessRegisterCommandReg.size
|
||||||
abstractGeneratedI.rs1 := 0.U
|
abstractGeneratedI.rs1 := 0.U
|
||||||
abstractGeneratedI.imm := DATA(cfg).U
|
abstractGeneratedI.imm := DATA.U
|
||||||
|
|
||||||
abstractGeneratedS.opcode := ((new GeneratedS()).fromBits(rocket.Instructions.SW.value.U)).opcode
|
abstractGeneratedS.opcode := ((new GeneratedS()).fromBits(rocket.Instructions.SW.value.U)).opcode
|
||||||
abstractGeneratedS.immlo := (DATA(cfg) & 0x1F).U
|
abstractGeneratedS.immlo := (DATA & 0x1F).U
|
||||||
abstractGeneratedS.funct3 := accessRegisterCommandReg.size
|
abstractGeneratedS.funct3 := accessRegisterCommandReg.size
|
||||||
abstractGeneratedS.rs1 := 0.U
|
abstractGeneratedS.rs1 := 0.U
|
||||||
abstractGeneratedS.rs2 := (accessRegisterCommandReg.regno & 0x1F.U)
|
abstractGeneratedS.rs2 := (accessRegisterCommandReg.regno & 0x1F.U)
|
||||||
abstractGeneratedS.immhi := (DATA(cfg) >> 5).U
|
abstractGeneratedS.immhi := (DATA >> 5).U
|
||||||
|
|
||||||
nop := ((new GeneratedI()).fromBits(rocket.Instructions.ADDI.value.U))
|
nop := ((new GeneratedI()).fromBits(rocket.Instructions.ADDI.value.U))
|
||||||
nop.rd := 0.U
|
nop.rd := 0.U
|
||||||
@ -857,14 +867,14 @@ class TLDebugModuleInner(device: Device, getNComponents: () => Int)(implicit p:
|
|||||||
GOING -> Seq(WNotify(sbIdWidth, hartGoingId, hartGoingWrEn)),
|
GOING -> Seq(WNotify(sbIdWidth, hartGoingId, hartGoingWrEn)),
|
||||||
RESUMING -> Seq(WNotify(sbIdWidth, hartResumingId, hartResumingWrEn)),
|
RESUMING -> Seq(WNotify(sbIdWidth, hartResumingId, hartResumingWrEn)),
|
||||||
EXCEPTION -> Seq(WNotify(sbIdWidth, hartExceptionId, hartExceptionWrEn)),
|
EXCEPTION -> Seq(WNotify(sbIdWidth, hartExceptionId, hartExceptionWrEn)),
|
||||||
DATA(cfg) -> abstractDataMem.map(x => RegField(8, x)),
|
DATA -> abstractDataMem.map(x => RegField(8, x)),
|
||||||
PROGBUF -> programBufferMem.map(x => RegField(8, x)),
|
PROGBUF(cfg)-> programBufferMem.map(x => RegField(8, x)),
|
||||||
|
|
||||||
// These sections are read-only.
|
// These sections are read-only.
|
||||||
WHERETO -> Seq(RegField.r(32, jalAbstract.asUInt)),
|
WHERETO -> Seq(RegField.r(32, jalAbstract.asUInt)),
|
||||||
ABSTRACT -> abstractGeneratedMem.map{x => RegField.r(32, x)},
|
ABSTRACT(cfg)-> abstractGeneratedMem.map{x => RegField.r(32, x)},
|
||||||
FLAGS -> flags.map{x => RegField.r(8, x.asUInt())},
|
FLAGS -> flags.map{x => RegField.r(8, x.asUInt())},
|
||||||
ROMBASE -> DebugRomContents().map(x => RegField.r(8, (x & 0xFF).U(8.W)))
|
ROMBASE -> DebugRomContents().map(x => RegField.r(8, (x & 0xFF).U(8.W)))
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user