diff --git a/src/main/scala/backBoard/ebus/CDRIn.scala b/src/main/scala/backBoard/ebus/CDRIn.scala index ddceefc..b482d2d 100644 --- a/src/main/scala/backBoard/ebus/CDRIn.scala +++ b/src/main/scala/backBoard/ebus/CDRIn.scala @@ -10,7 +10,6 @@ class CDRInIO extends Bundle{ val serDat = Input(Bool()) val overCLK = Input(Bool()) - val initEncryptor = Flipped(Valid(UInt(128.W))) } @@ -19,9 +18,6 @@ abstract class CDRInBase extends Module{ val io: CDRInIO = IO(new CDRInIO) - val encryptor = Module(new Encryptor) - encryptor.io.init := io.initEncryptor - encryptor.io.op.ready := io.axis.fire } @@ -131,9 +127,9 @@ trait CDRInAxis{ this: CDRInBase => val payloadLen = RegInit(0.U(12.W)) when( byteCnt === 0.U & bitCnt === 9.U & stateCurr === STATE_HEADER ){ - payloadLen := Cat( shiftData ^ Mux( encryptor.io.op.valid, encryptor.io.op.bits, 0.U ), 0.U(4.W) ) + payloadLen := Cat( shiftData, 0.U(4.W) ) } .elsewhen( byteCnt === 1.U & bitCnt === 9.U & stateCurr === STATE_HEADER ){ - payloadLen := Cat( payloadLen(11,4), shiftData(7,4) ^ Mux( encryptor.io.op.valid, encryptor.io.op.bits(7,4), 0.U ) ) + payloadLen := Cat( payloadLen(11,4), shiftData(7,4) ) } stateNext := @@ -174,7 +170,7 @@ trait CDRInAxis{ this: CDRInBase => val axis_valid = RegInit(false.B) - val axis_tdata = RegEnable( shiftData ^ Mux( encryptor.io.op.valid, encryptor.io.op.bits, 0.U ), bitCnt === 9.U & ( stateCurr === STATE_HEADER | stateCurr === STATE_PAYLOAD ) ) + val axis_tdata = RegEnable( shiftData, bitCnt === 9.U & ( stateCurr === STATE_HEADER | stateCurr === STATE_PAYLOAD ) ) val axis_tuser = false.B val axis_tlast = RegNext( stateCurr === STATE_PAYLOAD & stateNext === STATE_IDLE, false.B ) diff --git a/src/main/scala/backBoard/ebus/CDROut.scala b/src/main/scala/backBoard/ebus/CDROut.scala index 3ff2a27..5218d55 100644 --- a/src/main/scala/backBoard/ebus/CDROut.scala +++ b/src/main/scala/backBoard/ebus/CDROut.scala @@ -14,7 +14,6 @@ class CDROutIO extends Bundle{ val axis = Flipped(Decoupled(new AXIS_Bundle(8))) val serDat = Output(Bool()) - val initEncryptor = Flipped(Valid(UInt(128.W))) } @@ -22,9 +21,6 @@ class CDROutIO extends Bundle{ class CDROut extends Module{ val io: CDROutIO = IO(new CDROutIO) - val encryptor = Module(new Encryptor) - encryptor.io.init := io.initEncryptor - encryptor.io.op.ready := io.axis.fire def STATE_IDLE = 0.U @@ -72,10 +68,10 @@ class CDROut extends Module{ when( stateCurr === STATE_PREAMBLE ){ shiftData := MuxCase( ETH_PRE, Array( ( byteCnt === 6.U ) -> ETH_SFD, - ( byteCnt === 7.U ) -> Dualb4b5Encoder( io.axis.bits.tdata ^ Mux( encryptor.io.op.valid, encryptor.io.op.bits, 0.U ) ), + ( byteCnt === 7.U ) -> Dualb4b5Encoder(io.axis.bits.tdata), )) } .elsewhen( stateCurr === STATE_PAYLOAD ){ - shiftData := Dualb4b5Encoder(io.axis.bits.tdata ^ Mux( encryptor.io.op.valid, encryptor.io.op.bits, 0.U ) ) + shiftData := Dualb4b5Encoder(io.axis.bits.tdata) } } } diff --git a/src/main/scala/backBoard/shin/Interface.scala b/src/main/scala/backBoard/shin/Interface.scala index 21a62bb..1337edb 100644 --- a/src/main/scala/backBoard/shin/Interface.scala +++ b/src/main/scala/backBoard/shin/Interface.scala @@ -26,8 +26,6 @@ class CommonRegisterBundle extends Bundle{ val spiSel = UInt(2.W) - val encryptKey = UInt(128.W) - val isEncrypt = Bool() val intEnable = UInt(32.W) val intStatus = UInt(32.W) @@ -133,7 +131,6 @@ class InterfaceIO extends Bundle{ val sync = Output(Vec(4, Bool())) - val initEncryptor = Valid(UInt(128.W)) val isSoftReset = Output(Bool()) val intMstTrig = Input(Vec(2, Bool())) @@ -221,12 +218,8 @@ abstract class InterfaceBase extends Module{ - ((0 until 16).map{ i => - (addr === ("h50".U(16.W) + i.U) ) -> cReg.encryptKey( 8*i+7,8*i+0 ) - }) ++ Seq( - (addr === "h60".U ) -> cReg.isEncrypt, (addr === "h70".U ) -> cReg.intEnable(7,0), (addr === "h71".U ) -> cReg.intEnable(15,8), (addr === "h72".U ) -> cReg.intEnable(23,16), @@ -497,14 +490,6 @@ trait InterfaceMCUop{ this: InterfaceBase => cReg.busRate := RegEnable( dataw, "h55".U, isEnW & addrw === "h8".U & cReg.mstOrSlv === 0.U ) cReg.spiSel := RegEnable( dataw(1,0), 0.U, isEnW & addrw === "h9".U & cReg.mstOrSlv === 0.U ) - cReg.encryptKey := - Cat( - (0 until 16).map{ i => - RegEnable( dataw, 0.U, isEnW & addrw === ("h50".U(16.W) + i.U) & cReg.mstOrSlv === 0.U ) - }.reverse - ) - - cReg.isEncrypt := RegEnable( dataw.extract(0), 0.U, isEnW & addrw === "h60".U & cReg.mstOrSlv === 0.U ) mReg.txSM := RegEnable( dataw(2,1), 0.U, isEnW & addrw === "h20".U ) mReg.rxSM := RegEnable( dataw(4,3), 0.U, isEnW & addrw === "h20".U ) @@ -1061,8 +1046,6 @@ with InterfaceEvent sReg.isDevOnRightModify := io.isDevOnRightModify sReg.indexOfRightDev := io.indexOfRightDev - io.initEncryptor.valid := dataw.extract(0) & isEnW & addrw === "h60".U & cReg.mstOrSlv === 0.U //cReg.isEncrypt - io.initEncryptor.bits := cReg.encryptKey } \ No newline at end of file diff --git a/src/main/scala/backBoard/shin/README.md b/src/main/scala/backBoard/shin/README.md new file mode 100644 index 0000000..7cca836 --- /dev/null +++ b/src/main/scala/backBoard/shin/README.md @@ -0,0 +1,146 @@ +# Shin(新)总线设计 + +## ShinTop 顶层模块 + +### 例化模块 +* slaveParser 从站解析模块 +* masterParser 主站解析模块 + +* downCDRIn 下行CDR接收模块 +* upCDRIn 上行CDR接收模块 +* downCDROut 下行CDR发送模块 +* upCDROut 上行CDR发送模块 + +* interface 寄存器逻辑控制模块 + +* sram 分别为8个SM例化4个或2个2k SRAM用于sram FIFO + +``` + val sram = Seq( + for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 4 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, + for( _ <- 0 until 2 ) yield { Module(new ShareSRAM2k) }, + ) +``` + + * smUnit SM的控制模块 + +## SlaveParser从站解析模块 +### 例化模块 + +#### SlaveRecParser 接收解析器 +* downRecParser 下行接收解析器 +* upRecParser 上行接收解析器 + +##### 输入输出 +* rec 输入来自CDRIn模块的axis格式原始数据 +* data 输出解析后的子报文负载 +* stateCurr 用于辅助上级SlaveParser模块 +* frameReq 输出解析的帧头给上级SlaveParser模块 +* subMsgReq 输出解析的子报文头给上级SlaveParser模块 +* resp 清模块的STATE_ERROR状态 +* isError 输出模块的错误信息触发中断 + +##### 状态机 +**(测试点:应该覆盖所有状态和跳转条件)** +* 0:STATE_IDLE 空闲 +* 1:STATE_HEADER 包头 +* 2:STATE_SUBMSG_HEADER 子报文头 +* 3:STATE_PAYLOAD_DATA 子报文数据 +* 4:STATE_CRC CRC校验 +* 5:STATE_ERROR 错误状态 + + + +##### 逻辑及行为 +* STATE_IDLE 在空闲态,等待接收CDR解析后的axis格式数据,当valid从低跳高,进入STATE_HEADER,否则一直保持在STATE_IDLE +* STATE_HEADER + - 等待axis的fire`io.rec.fire`,否则保持STATE_HEADER,无动作 + - 检查tlast不应该出现`io.rec.bits.tlast`,否则进入STATE_ERROR **(测试点)** + - 检查长度计数到达4-1,否则保持STATE_HEADER + + 将包头信息装填入`frameHeader`寄存器 + - 长度计数到达4-1的同时检查`frameHeader.frameStyle` + + 常规包 FRAME_STYLE_COMMON 则进入 STATE_SUBMSG_HEADER + + 嗅探包 FRAME_STYLE_PROBE 则进入 STATE_CRC + + 其它则进入STATE_ERROR **(测试点:会不会影响xxSendGen的行为)** + + 使用`io.frameReq`通知上层模块SlaveParser接收包的到来 + +* STATE_SUBMSG_HEADER + - 等待axis的fire`io.rec.fire`,否则保持STATE_SUBMSG_HEADER,无动作 + - 检查tlast不应该出现`io.rec.bits.tlast`,否则进入STATE_ERROR **(测试点)** + - 检查长度计数到达7-1,否则保持STATE_SUBMSG_HEADER + + 将子报文头信息装填入`subMsgHeader`寄存器 + - 长度计数到达7-1时,进入STATE_PAYLOAD_DATA + + 使用`io.subMsgReq`通知上层模块SlaveParser子报文的到来 + +* STATE_PAYLOAD_DATA + - 等待axis的fire`io.rec.fire`,否则保持STATE_PAYLOAD_DATA,无动作 + - 检查tlast不应该出现`io.rec.bits.tlast`,否则进入STATE_ERROR **(测试点)** + - 检查io.data的数据流是否被外部fifo拒绝`isDataRejErr`,若fifo上溢出进入STATE_ERROR **(测试点)** + - 检查子报文长度计数`frameLenCnt`是否到达子报文头说明长度-1 `subMsgHeader.length - 1.U` + + 未到达,保持STATE_PAYLOAD_DATA + + 已到达,进一步检查帧长度`frameLenCnt`是否达到总报文头说明长度-1 `frameHeader.frameLenAim - 1.U` + * 未到达,进入STATE_SUBMSG_HEADER处理下一个子报文 + * 已到达,进入STATE_CRC做最后CRC校验 + + 将子报文负载数据通过io.data传输给上层SlaveParser存入down/up-RecFifo 的pingpong缓冲区的enq,准备用于发送转发 +* STATE_CRC + - 等待axis的fire`io.rec.fire`和`io.rec.bits.tlast`,否则保持STATE_CRC **(测试点:超长时间tlast不到来)** + - 等待长度计数等于4-1时刻,同时检查`isCrcPass`,若检查通过,回到STATE_IDLE,否则到STATE_ERROR **(测试点:tlast在计数4-1之前到来;tlast在计数4-1之后到来)** +* STATE_ERROR + - 在该状态`io.isError`保持为高,持续触发interface中的 下行/上行 接收错误中断 + - 当interface写清对应中断时,通过`io.resp`让状态机回到STATE_IDLE + + +#### 发送生成器 +* downSendGen 下行发送生成器 +* upSendGen 上行发送生成器 + + + +##### 输入输出 +* data 连接上级模块SlaveParser down/up-RecFifo 的pingpong缓冲区的deq,准备用于发送转发 +* frameReq 连接上级模块SlaveParser请求的帧头结构体 +* subMsgReq 连接上级模块SlaveParser请求的子报文结构体 +* send 输出axis格式的发送输出数据到CDRout模块 +* stateCurr 输出内部状态机状态给上级模块SlaveParser辅助判断(无意义) + +##### 状态机 +**(测试点:应该覆盖所有状态和跳转条件)** +* 0.U: STATE_IDLE 空闲 +* 1.U: STATE_FRAME_HEADER 发送帧头 +* 2.U: STATE_SUBMSG_HEADER 发送子报文头 +* 3.U: STATE_SUBMSG_DATA 发送子报文负载 +* 4.U: STATE_CRC 发送CRC校验 +* 5.U: STATE_WAIT 等待 + +##### 逻辑及行为 +* STATE_IDLE + - 等待帧头请求和确认`io.frameReq.fire`的到来,进入STATE_FRAME_HEADER状态,否则保持STATE_IDLE等待 +* STATE_FRAME_HEADER + - 等待axis的fire`io.send.fire`,否则保持STATE_FRAME_HEADER,无动作 + - 等待发送计数到达4-1(帧头发送完成) + + 如果为常规包`frameInfo.frameStyle === FRAME_STYLE_COMMON`, + * 子报文头请求已经到来,进入STATE_SUBMSG_HEADER发送子报文头 + * 子报文头请求没有到来,进入STATE_WAIT等待子报文头 **(测试点:确认等待期间,CDRout数据不会下溢)** + + 如果不为常规包(一般为嗅探包),进入STATE_CRC **(测试点: 如果既不是常规包,又不是嗅探包是否会出错)** +* STATE_SUBMSG_HEADER + - 等待axis的fire`io.send.fire`,否则保持STATE_SUBMSG_HEADER,无动作 + - 等待发送计数到达8-1(子报文头发送完成),进入STATE_SUBMSG_DATA +* STATE_SUBMSG_DATA + - 等待axis的fire`io.send.fire`,否则保持STATE_SUBMSG_DATA,无动作 + - 等待发送计数到达`subMsgInfoSel.length-1.U`(子报文负载发送完成) + + 若同时总负载长度计数`frameLenCnt`到达帧头请求长度`frameInfo.frameLenAim -1.U`,进入CRC + + 若还有子报文 + * 子报文头请求已经到来,进入STATE_SUBMSG_HEADER发送子报文头 + * 子报文头请求没有到来,进入STATE_WAIT等待子报文头 **(测试点:确认等待期间,CDRout数据不会下溢)** +* STATE_CRC + - 等待axis的fire`io.send.fire`,否则保持STATE_CRC,无动作 + - 当计数到达4-1,进入STATE_IDLE,否则保持STATE_CRC +* STATE_WAIT + - 当子报文头请求到来`io.subMsgReq.valid`,返回STATE_SUBMSG_HEADER继续处理,否则在STATE_WAIT **(测试点:是否会产生长时间等待情形而导致流水线溢出)** + diff --git a/src/main/scala/backBoard/shin/ShinTop.scala b/src/main/scala/backBoard/shin/ShinTop.scala index 415d724..d4318a0 100644 --- a/src/main/scala/backBoard/shin/ShinTop.scala +++ b/src/main/scala/backBoard/shin/ShinTop.scala @@ -58,17 +58,13 @@ abstract class ShinTopBase extends Module{ downCDRIn.io.serDat := io.dDatIn downCDRIn.io.overCLK := io.clk8x - downCDRIn.io.initEncryptor := interface.io.initEncryptor upCDRIn.io.serDat := io.uDatIn upCDRIn.io.overCLK := io.clk8x - upCDRIn.io.initEncryptor := interface.io.initEncryptor io.dDatOut := downCDROut.io.serDat io.uDatOut := upCDROut.io.serDat - downCDROut.io.initEncryptor := interface.io.initEncryptor - upCDROut.io.initEncryptor := interface.io.initEncryptor //override when( slaveParser.io.isLoop & interface.io.cReg.modeSel === false.B){ diff --git a/src/main/scala/backBoard/shin/SlaveParser.scala b/src/main/scala/backBoard/shin/SlaveParser.scala index f90cd96..732d80f 100644 --- a/src/main/scala/backBoard/shin/SlaveParser.scala +++ b/src/main/scala/backBoard/shin/SlaveParser.scala @@ -407,7 +407,6 @@ abstract class SlaveParserBase extends Module{ upRecFifo(0).io.deq <> upSendGen.io.data(0) upRecFifo(1).io.deq <> upSendGen.io.data(1) - }