Files
eb001/src/main/scala/backBoard/shin/README.md
2025-06-17 16:26:09 +08:00

7.1 KiB
Raw Blame History

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 输出模块的错误信息触发中断
状态机

(测试点:应该覆盖所有状态和跳转条件)

  • 0STATE_IDLE 空闲
  • 1STATE_HEADER 包头
  • 2STATE_SUBMSG_HEADER 子报文头
  • 3STATE_PAYLOAD_DATA 子报文数据
  • 4STATE_CRC CRC校验
  • 5STATE_ERROR 错误状态
逻辑及行为
  • STATE_IDLE 在空闲态等待接收CDR解析后的axis格式数据当valid从低跳高进入STATE_HEADER否则一直保持在STATE_IDLE

  • STATE_HEADER

    • 等待axis的fireio.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的fireio.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的fireio.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的fireio.rec.fireio.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的fireio.send.fire否则保持STATE_FRAME_HEADER无动作
    • 等待发送计数到达4-1帧头发送完成
      • 如果为常规包frameInfo.frameStyle === FRAME_STYLE_COMMON
        • 子报文头请求已经到来进入STATE_SUBMSG_HEADER发送子报文头
        • 子报文头请求没有到来进入STATE_WAIT等待子报文头 测试点确认等待期间CDRout数据不会下溢
      • 如果不为常规包一般为嗅探包进入STATE_CRC (测试点: 如果既不是常规包,又不是嗅探包是否会出错)
  • STATE_SUBMSG_HEADER
    • 等待axis的fireio.send.fire否则保持STATE_SUBMSG_HEADER无动作
    • 等待发送计数到达8-1子报文头发送完成进入STATE_SUBMSG_DATA
  • STATE_SUBMSG_DATA
    • 等待axis的fireio.send.fire否则保持STATE_SUBMSG_DATA无动作
    • 等待发送计数到达subMsgInfoSel.length-1.U(子报文负载发送完成)
      • 若同时总负载长度计数frameLenCnt到达帧头请求长度frameInfo.frameLenAim -1.U进入CRC
      • 若还有子报文
        • 子报文头请求已经到来进入STATE_SUBMSG_HEADER发送子报文头
        • 子报文头请求没有到来进入STATE_WAIT等待子报文头 测试点确认等待期间CDRout数据不会下溢
  • STATE_CRC
    • 等待axis的fireio.send.fire否则保持STATE_CRC无动作
    • 当计数到达4-1进入STATE_IDLE,否则保持STATE_CRC
  • STATE_WAIT
    • 当子报文头请求到来io.subMsgReq.valid返回STATE_SUBMSG_HEADER继续处理否则在STATE_WAIT (测试点:是否会产生长时间等待情形而导致流水线溢出)