From e72d6efd48d197342826725b42db0ebff41425cc Mon Sep 17 00:00:00 2001 From: Ruige Lee Date: Tue, 17 Jun 2025 11:15:13 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E8=AF=B4=E6=98=8E=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/scala/backBoard/shin/README.md | 91 +++++++++++++++++++ .../scala/backBoard/shin/SlaveParser.scala | 7 +- .../scala/backBoard/shin/SlaveRecParser.scala | 6 +- 3 files changed, 94 insertions(+), 10 deletions(-) create mode 100644 src/main/scala/backBoard/shin/README.md diff --git a/src/main/scala/backBoard/shin/README.md b/src/main/scala/backBoard/shin/README.md new file mode 100644 index 0000000..eb83275 --- /dev/null +++ b/src/main/scala/backBoard/shin/README.md @@ -0,0 +1,91 @@ +# 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 上行接收解析器 +##### 状态机 + * 0:STATE_IDLE 空闲 + * 1:STATE_HEADER 包头 + * 2:STATE_SUBMSG_HEADER 子报文头 + * 3:STATE_PAYLOAD_DATA 子报文数据 + * 4:STATE_CRC CRC校验 + * 5:STATE_ERROR 错误状态 + * 6:STATE_WAIT 等待状态 + +##### 逻辑及行为 + * 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缓冲区,准备用于发送转发 + * 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 上行发送生成器 + + diff --git a/src/main/scala/backBoard/shin/SlaveParser.scala b/src/main/scala/backBoard/shin/SlaveParser.scala index 9113e9d..6478673 100644 --- a/src/main/scala/backBoard/shin/SlaveParser.scala +++ b/src/main/scala/backBoard/shin/SlaveParser.scala @@ -91,12 +91,11 @@ abstract class SlaveParserBase extends Module{ val STATE_IDLE = 0.U //空闲 - val STATE_HEADER = 1.U //长度/ /保留2bits //包类型 + val STATE_HEADER = 1.U //包头 val STATE_SUBMSG_HEADER = 2.U //子报文头 val STATE_PAYLOAD_DATA = 3.U //子报文数据 val STATE_CRC = 4.U //CRC校验 val STATE_ERROR = 5.U // - val STATE_WAIT = 6.U @@ -297,8 +296,6 @@ abstract class SlaveParserBase extends Module{ downRecFifo(0).io.deq <> downSendGen.io.data(0) downRecFifo(1).io.deq <> downSendGen.io.data(1) - downRecParser.io.resp := ( downRecParser.io.stateCurr === STATE_WAIT ) & (~isDownSubMsgValid(0) & ~isDownSubMsgValid(1)) - //子报文上行发送 @@ -332,8 +329,6 @@ abstract class SlaveParserBase extends Module{ upRecFifo(0).io.deq <> upSendGen.io.data(0) upRecFifo(1).io.deq <> upSendGen.io.data(1) - upRecParser.io.resp := ( upRecParser.io.stateCurr === STATE_WAIT ) & (~isUpSubMsgValid(0) & ~isUpSubMsgValid(1)) - } diff --git a/src/main/scala/backBoard/shin/SlaveRecParser.scala b/src/main/scala/backBoard/shin/SlaveRecParser.scala index fceea55..689e5de 100644 --- a/src/main/scala/backBoard/shin/SlaveRecParser.scala +++ b/src/main/scala/backBoard/shin/SlaveRecParser.scala @@ -27,12 +27,11 @@ class SlaveRecParser extends Module{ val crc = Module(new crc32_8) val STATE_IDLE = 0.U //空闲 - val STATE_HEADER = 1.U //长度/ /保留2bits //包类型 - val STATE_SUBMSG_HEADER = 2.U //子报文设备索引 //子报文类型 + val STATE_HEADER = 1.U //包头 + val STATE_SUBMSG_HEADER = 2.U //子报文头 val STATE_PAYLOAD_DATA = 3.U //子报文数据 val STATE_CRC = 4.U //CRC校验 val STATE_ERROR = 5.U // - val STATE_WAIT = 6.U val stateNext = Wire(UInt(4.W)); io.stateNext := stateNext @@ -185,7 +184,6 @@ class SlaveRecParser extends Module{ Mux( lengthCnt === (4 - 1).U & isCrcPass, STATE_IDLE, STATE_ERROR ), STATE_CRC ), ( stateCurr === STATE_ERROR ) -> Mux( io.resp, STATE_IDLE, STATE_ERROR ), - ( stateCurr === STATE_WAIT ) -> Mux( io.resp, STATE_IDLE, STATE_WAIT ) ))