增加看门狗17,加强看门狗中断条件
This commit is contained in:
@@ -73,7 +73,7 @@ class CommonRegisterBundle extends Bundle{
|
|||||||
|
|
||||||
val wdtStatus = UInt(32.W)
|
val wdtStatus = UInt(32.W)
|
||||||
val wdtEnable = UInt(32.W)
|
val wdtEnable = UInt(32.W)
|
||||||
val wdtTarCnt = Vec( 17, UInt(32.W) )
|
val wdtTarCnt = Vec( 18, UInt(32.W) )
|
||||||
|
|
||||||
val timeStamp = UInt(64.W)
|
val timeStamp = UInt(64.W)
|
||||||
val mstDeltaTime = UInt(32.W)
|
val mstDeltaTime = UInt(32.W)
|
||||||
@@ -181,7 +181,7 @@ class InterfaceIO extends Bundle{
|
|||||||
|
|
||||||
val interrupt = Output(Bool())
|
val interrupt = Output(Bool())
|
||||||
|
|
||||||
val wdtTrigger = Input(Vec(17, Bool()))
|
val wdtTrigger = Input(Vec(18, Bool()))
|
||||||
|
|
||||||
val downRecStat = Input(new Stat_IO_Bundle)
|
val downRecStat = Input(new Stat_IO_Bundle)
|
||||||
val upRecStat = Input(new Stat_IO_Bundle)
|
val upRecStat = Input(new Stat_IO_Bundle)
|
||||||
@@ -670,7 +670,7 @@ trait InterfaceMCUop{ this: InterfaceBase =>
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
val wdtStatus = for( i <- 0 until 17 ) yield { RegInit(false.B) }
|
val wdtStatus = for( i <- 0 until 18 ) yield { RegInit(false.B) } //1+16+1
|
||||||
cReg.wdtStatus := Cat( wdtStatus.reverse )
|
cReg.wdtStatus := Cat( wdtStatus.reverse )
|
||||||
|
|
||||||
for( i <- 0 until 8 ){
|
for( i <- 0 until 8 ){
|
||||||
@@ -685,7 +685,7 @@ trait InterfaceMCUop{ this: InterfaceBase =>
|
|||||||
wdtStatus(8+i) := true.B
|
wdtStatus(8+i) := true.B
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for( i <- 0 until 1 ){
|
for( i <- 0 until 2 ){
|
||||||
when( isEnW & addrw === "h402".U & dataw.extract(i) ){
|
when( isEnW & addrw === "h402".U & dataw.extract(i) ){
|
||||||
wdtStatus(16+i) := false.B
|
wdtStatus(16+i) := false.B
|
||||||
} .elsewhen(io.wdtTrigger(16+i) & cReg.wdtEnable.extract(16+i)){
|
} .elsewhen(io.wdtTrigger(16+i) & cReg.wdtEnable.extract(16+i)){
|
||||||
@@ -695,12 +695,12 @@ trait InterfaceMCUop{ this: InterfaceBase =>
|
|||||||
|
|
||||||
cReg.wdtEnable :=
|
cReg.wdtEnable :=
|
||||||
Cat(
|
Cat(
|
||||||
RegEnable( dataw.extract(0), 0.U, isEnW & addrw === "h406".U ),
|
RegEnable( dataw(1,0), 0.U, isEnW & addrw === "h406".U ),
|
||||||
RegEnable( dataw, 0.U, isEnW & addrw === "h405".U ),
|
RegEnable( dataw, 0.U, isEnW & addrw === "h405".U ),
|
||||||
RegEnable( dataw, 0.U, isEnW & addrw === "h404".U ),
|
RegEnable( dataw, 0.U, isEnW & addrw === "h404".U ),
|
||||||
)
|
)
|
||||||
|
|
||||||
for( i <- 0 until 17 ){
|
for( i <- 0 until 18 ){
|
||||||
cReg.wdtTarCnt(i) :=
|
cReg.wdtTarCnt(i) :=
|
||||||
Cat(
|
Cat(
|
||||||
RegEnable( dataw, 0.U, isEnW & addrw === ( "h40b".U (16.W) + (4*i).U ) ),
|
RegEnable( dataw, 0.U, isEnW & addrw === ( "h40b".U (16.W) + (4*i).U ) ),
|
||||||
@@ -989,7 +989,8 @@ trait InterfaceSystem{ this: InterfaceBase =>
|
|||||||
|
|
||||||
|
|
||||||
//看门狗溢出
|
//看门狗溢出
|
||||||
when( io.wdtTrigger.reduce(_|_) ){
|
val isWdtTrigAndEnable = (0 until 18).map{ i => (io.wdtTrigger(i) & cReg.wdtEnable(i))}.reduce(_|_)
|
||||||
|
when( isWdtTrigAndEnable ){
|
||||||
intStatus(4) := true.B
|
intStatus(4) := true.B
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1046,7 +1047,7 @@ trait InterfaceSystem{ this: InterfaceBase =>
|
|||||||
(io.intMstTrig(0) & cReg.intEnable(0)) | //主站发送完成
|
(io.intMstTrig(0) & cReg.intEnable(0)) | //主站发送完成
|
||||||
(io.intMstTrig(1) & cReg.intEnable(1)) | //主站接收完成
|
(io.intMstTrig(1) & cReg.intEnable(1)) | //主站接收完成
|
||||||
false.B | //主站发送周期到了
|
false.B | //主站发送周期到了
|
||||||
(~RegNext(io.wdtTrigger.reduce(_|_), false.B) & io.wdtTrigger.reduce(_|_) & cReg.intEnable(4)) | //主站接收看门狗溢出
|
(~RegNext(isWdtTrigAndEnable, false.B) & isWdtTrigAndEnable & cReg.intEnable(4)) | //主站接收看门狗溢出
|
||||||
(0 until 8).map{ i => io.intSlvTrig(i) & cReg.intEnable(8+i)}.reduce(_|_) | //从站SM请求
|
(0 until 8).map{ i => io.intSlvTrig(i) & cReg.intEnable(8+i)}.reduce(_|_) | //从站SM请求
|
||||||
(0 until 4).map{ i => io.intTransEnd(i) & cReg.intEnable(16+i)}.reduce(_|_) | //传输完成请求 16,17,18,19
|
(0 until 4).map{ i => io.intTransEnd(i) & cReg.intEnable(16+i)}.reduce(_|_) | //传输完成请求 16,17,18,19
|
||||||
io.intHWTrig(0) | //下行接收硬件错误
|
io.intHWTrig(0) | //下行接收硬件错误
|
||||||
|
|||||||
@@ -377,7 +377,7 @@ trait ShinTopSlave{ this: ShinTopBase =>
|
|||||||
|
|
||||||
trait ShinTopWatchDog{ this: ShinTopBase =>
|
trait ShinTopWatchDog{ this: ShinTopBase =>
|
||||||
|
|
||||||
|
//看门狗1~16,SM监控
|
||||||
val isWdtSMEnable = for( _ <- 0 until 16 ) yield { RegInit(false.B) }
|
val isWdtSMEnable = for( _ <- 0 until 16 ) yield { RegInit(false.B) }
|
||||||
val wdtSMCnt = for( _ <- 0 until 16 ) yield { Reg(UInt(32.W)) }
|
val wdtSMCnt = for( _ <- 0 until 16 ) yield { Reg(UInt(32.W)) }
|
||||||
|
|
||||||
@@ -407,27 +407,42 @@ trait ShinTopWatchDog{ this: ShinTopBase =>
|
|||||||
interface.io.wdtTrigger(i+1) := wdtSMCnt(i) === interface.io.cReg.wdtTarCnt(i+1)
|
interface.io.wdtTrigger(i+1) := wdtSMCnt(i) === interface.io.cReg.wdtTarCnt(i+1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//看门狗0 发送后回包是否超时
|
||||||
|
val isWdtRec2RtnEnable = RegInit(false.B)
|
||||||
|
val wdtRec2RtnCnt = Reg(UInt(32.W))
|
||||||
|
|
||||||
val isWdtRecEnable = RegInit(false.B)
|
when(
|
||||||
val wdtRecCnt = Reg(UInt(32.W))
|
(upCDRIn.io.axis.fire & upCDRIn.io.axis.bits.tlast) |
|
||||||
|
~interface.io.cReg.wdtEnable.extract(0)
|
||||||
when( upCDRIn.io.axis.fire & upCDRIn.io.axis.bits.tlast ){
|
){
|
||||||
isWdtRecEnable := false.B
|
isWdtRec2RtnEnable := false.B
|
||||||
} .elsewhen( ~isWdtRecEnable & downCDROut.io.axis.fire & interface.io.cReg.wdtEnable.extract(0) ){
|
} .elsewhen( ~isWdtRec2RtnEnable & downCDROut.io.axis.fire & interface.io.cReg.wdtEnable.extract(0) ){
|
||||||
isWdtRecEnable := true.B
|
isWdtRec2RtnEnable := true.B
|
||||||
}
|
}
|
||||||
|
|
||||||
when( isWdtRecEnable & (wdtRecCnt < interface.io.cReg.wdtTarCnt(0)) ){
|
when( isWdtRec2RtnEnable & (wdtRec2RtnCnt < interface.io.cReg.wdtTarCnt(0)) ){
|
||||||
wdtRecCnt := wdtRecCnt + 1.U
|
wdtRec2RtnCnt := wdtRec2RtnCnt + 1.U
|
||||||
} .elsewhen( ~isWdtRecEnable ){
|
} .elsewhen( ~isWdtRec2RtnEnable ){
|
||||||
wdtRecCnt := 0.U
|
wdtRec2RtnCnt := 0.U
|
||||||
}
|
}
|
||||||
|
|
||||||
// assert( wdtRecCnt < interface.io.cReg.wdtTarCnt(0), "Assert Failed! wdtRecCnt is larger than wdtTarCnt, Special situation?" )
|
// assert( wdtRecCnt < interface.io.cReg.wdtTarCnt(0), "Assert Failed! wdtRecCnt is larger than wdtTarCnt, Special situation?" )
|
||||||
|
|
||||||
interface.io.wdtTrigger(0) := wdtRecCnt === interface.io.cReg.wdtTarCnt(0)
|
interface.io.wdtTrigger(0) := wdtRec2RtnCnt === interface.io.cReg.wdtTarCnt(0)
|
||||||
|
|
||||||
|
//看门狗17
|
||||||
|
val wdtRec2RecCnt = Reg(UInt(32.W))
|
||||||
|
|
||||||
|
when( interface.io.cReg.wdtEnable.extract(17) & (wdtRec2RecCnt < interface.io.cReg.wdtTarCnt(17)) ){
|
||||||
|
wdtRec2RecCnt := wdtRec2RecCnt + 1.U
|
||||||
|
} .elsewhen(
|
||||||
|
~interface.io.cReg.wdtEnable.extract(17) |
|
||||||
|
downCDRIn.io.axis.fire
|
||||||
|
){
|
||||||
|
wdtRec2RecCnt := 0.U
|
||||||
|
}
|
||||||
|
|
||||||
|
interface.io.wdtTrigger(17) := wdtRec2RecCnt === interface.io.cReg.wdtTarCnt(17)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user