增加看门狗17,加强看门狗中断条件
This commit is contained in:
@@ -73,7 +73,7 @@ class CommonRegisterBundle extends Bundle{
|
||||
|
||||
val wdtStatus = 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 mstDeltaTime = UInt(32.W)
|
||||
@@ -181,7 +181,7 @@ class InterfaceIO extends Bundle{
|
||||
|
||||
val interrupt = Output(Bool())
|
||||
|
||||
val wdtTrigger = Input(Vec(17, Bool()))
|
||||
val wdtTrigger = Input(Vec(18, Bool()))
|
||||
|
||||
val downRecStat = 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 )
|
||||
|
||||
for( i <- 0 until 8 ){
|
||||
@@ -685,7 +685,7 @@ trait InterfaceMCUop{ this: InterfaceBase =>
|
||||
wdtStatus(8+i) := true.B
|
||||
}
|
||||
}
|
||||
for( i <- 0 until 1 ){
|
||||
for( i <- 0 until 2 ){
|
||||
when( isEnW & addrw === "h402".U & dataw.extract(i) ){
|
||||
wdtStatus(16+i) := false.B
|
||||
} .elsewhen(io.wdtTrigger(16+i) & cReg.wdtEnable.extract(16+i)){
|
||||
@@ -695,12 +695,12 @@ trait InterfaceMCUop{ this: InterfaceBase =>
|
||||
|
||||
cReg.wdtEnable :=
|
||||
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 === "h404".U ),
|
||||
)
|
||||
|
||||
for( i <- 0 until 17 ){
|
||||
for( i <- 0 until 18 ){
|
||||
cReg.wdtTarCnt(i) :=
|
||||
Cat(
|
||||
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
|
||||
}
|
||||
|
||||
@@ -1046,7 +1047,7 @@ trait InterfaceSystem{ this: InterfaceBase =>
|
||||
(io.intMstTrig(0) & cReg.intEnable(0)) | //主站发送完成
|
||||
(io.intMstTrig(1) & cReg.intEnable(1)) | //主站接收完成
|
||||
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 4).map{ i => io.intTransEnd(i) & cReg.intEnable(16+i)}.reduce(_|_) | //传输完成请求 16,17,18,19
|
||||
io.intHWTrig(0) | //下行接收硬件错误
|
||||
|
||||
@@ -375,7 +375,7 @@ trait ShinTopSlave{ this: ShinTopBase =>
|
||||
|
||||
trait ShinTopWatchDog{ this: ShinTopBase =>
|
||||
|
||||
|
||||
//看门狗1~16,SM监控
|
||||
val isWdtSMEnable = for( _ <- 0 until 16 ) yield { RegInit(false.B) }
|
||||
val wdtSMCnt = for( _ <- 0 until 16 ) yield { Reg(UInt(32.W)) }
|
||||
|
||||
@@ -405,27 +405,42 @@ trait ShinTopWatchDog{ this: ShinTopBase =>
|
||||
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)
|
||||
val wdtRecCnt = Reg(UInt(32.W))
|
||||
|
||||
when( upCDRIn.io.axis.fire & upCDRIn.io.axis.bits.tlast ){
|
||||
isWdtRecEnable := false.B
|
||||
} .elsewhen( ~isWdtRecEnable & downCDROut.io.axis.fire & interface.io.cReg.wdtEnable.extract(0) ){
|
||||
isWdtRecEnable := true.B
|
||||
when(
|
||||
(upCDRIn.io.axis.fire & upCDRIn.io.axis.bits.tlast) |
|
||||
~interface.io.cReg.wdtEnable.extract(0)
|
||||
){
|
||||
isWdtRec2RtnEnable := false.B
|
||||
} .elsewhen( ~isWdtRec2RtnEnable & downCDROut.io.axis.fire & interface.io.cReg.wdtEnable.extract(0) ){
|
||||
isWdtRec2RtnEnable := true.B
|
||||
}
|
||||
|
||||
when( isWdtRecEnable & (wdtRecCnt < interface.io.cReg.wdtTarCnt(0)) ){
|
||||
wdtRecCnt := wdtRecCnt + 1.U
|
||||
} .elsewhen( ~isWdtRecEnable ){
|
||||
wdtRecCnt := 0.U
|
||||
when( isWdtRec2RtnEnable & (wdtRec2RtnCnt < interface.io.cReg.wdtTarCnt(0)) ){
|
||||
wdtRec2RtnCnt := wdtRec2RtnCnt + 1.U
|
||||
} .elsewhen( ~isWdtRec2RtnEnable ){
|
||||
wdtRec2RtnCnt := 0.U
|
||||
}
|
||||
|
||||
// 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