补充说明文档

This commit is contained in:
Ruige Lee
2025-06-17 11:15:13 +08:00
parent 9a85cfd9b4
commit e72d6efd48
3 changed files with 94 additions and 10 deletions

View File

@@ -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 上行接收解析器
##### 状态机
* 0STATE_IDLE 空闲
* 1STATE_HEADER 包头
* 2STATE_SUBMSG_HEADER 子报文头
* 3STATE_PAYLOAD_DATA 子报文数据
* 4STATE_CRC CRC校验
* 5STATE_ERROR 错误状态
* 6STATE_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 上行发送生成器

View File

@@ -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))
}

View File

@@ -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 )
))