# 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 上行发送生成器