补充说明文档
This commit is contained in:
91
src/main/scala/backBoard/shin/README.md
Normal file
91
src/main/scala/backBoard/shin/README.md
Normal 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 上行接收解析器
|
||||||
|
##### 状态机
|
||||||
|
* 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 上行发送生成器
|
||||||
|
|
||||||
|
|
||||||
@@ -91,12 +91,11 @@ abstract class SlaveParserBase extends Module{
|
|||||||
|
|
||||||
|
|
||||||
val STATE_IDLE = 0.U //空闲
|
val STATE_IDLE = 0.U //空闲
|
||||||
val STATE_HEADER = 1.U //长度/ /保留2bits //包类型
|
val STATE_HEADER = 1.U //包头
|
||||||
val STATE_SUBMSG_HEADER = 2.U //子报文头
|
val STATE_SUBMSG_HEADER = 2.U //子报文头
|
||||||
val STATE_PAYLOAD_DATA = 3.U //子报文数据
|
val STATE_PAYLOAD_DATA = 3.U //子报文数据
|
||||||
val STATE_CRC = 4.U //CRC校验
|
val STATE_CRC = 4.U //CRC校验
|
||||||
val STATE_ERROR = 5.U //
|
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(0).io.deq <> downSendGen.io.data(0)
|
||||||
downRecFifo(1).io.deq <> downSendGen.io.data(1)
|
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(0).io.deq <> upSendGen.io.data(0)
|
||||||
upRecFifo(1).io.deq <> upSendGen.io.data(1)
|
upRecFifo(1).io.deq <> upSendGen.io.data(1)
|
||||||
|
|
||||||
upRecParser.io.resp := ( upRecParser.io.stateCurr === STATE_WAIT ) & (~isUpSubMsgValid(0) & ~isUpSubMsgValid(1))
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -27,12 +27,11 @@ class SlaveRecParser extends Module{
|
|||||||
val crc = Module(new crc32_8)
|
val crc = Module(new crc32_8)
|
||||||
|
|
||||||
val STATE_IDLE = 0.U //空闲
|
val STATE_IDLE = 0.U //空闲
|
||||||
val STATE_HEADER = 1.U //长度/ /保留2bits //包类型
|
val STATE_HEADER = 1.U //包头
|
||||||
val STATE_SUBMSG_HEADER = 2.U //子报文设备索引 //子报文类型
|
val STATE_SUBMSG_HEADER = 2.U //子报文头
|
||||||
val STATE_PAYLOAD_DATA = 3.U //子报文数据
|
val STATE_PAYLOAD_DATA = 3.U //子报文数据
|
||||||
val STATE_CRC = 4.U //CRC校验
|
val STATE_CRC = 4.U //CRC校验
|
||||||
val STATE_ERROR = 5.U //
|
val STATE_ERROR = 5.U //
|
||||||
val STATE_WAIT = 6.U
|
|
||||||
|
|
||||||
|
|
||||||
val stateNext = Wire(UInt(4.W)); io.stateNext := stateNext
|
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
|
Mux( lengthCnt === (4 - 1).U & isCrcPass, STATE_IDLE, STATE_ERROR ), STATE_CRC
|
||||||
),
|
),
|
||||||
( stateCurr === STATE_ERROR ) -> Mux( io.resp, STATE_IDLE, STATE_ERROR ),
|
( stateCurr === STATE_ERROR ) -> Mux( io.resp, STATE_IDLE, STATE_ERROR ),
|
||||||
( stateCurr === STATE_WAIT ) -> Mux( io.resp, STATE_IDLE, STATE_WAIT )
|
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user