高速多端口共享缓存管理模块——集创赛题目
前言
随着近代网络技术的高速发展,40G与100G网络时代到来,这需要交换机和路由器等网络设备具备极高的数据存储能力。要求设计一款支持高速数据存储的SRAM管理模块,避免数据包的长度和存储器数据通道的数量对存储器资源的影响,并且可以通过内存回收动态调整空间节约达到存储资源的目的,提高数据存储效率,提升数据校验纠错的能力。
初赛版本使用的是对32块sram两两分组,2块sram做到共享,调度等操作。晋级区域赛决赛;
区域赛版本对32块sram做到了全共享,但最终只是取得三等奖,也为自己7年比赛生涯画上句号了。在这里特别感谢队友,后期太强大了,一个人搭建起整个全共享的框架。
本文只介绍我做的相关部分,抛砖引玉。
一、架构设计
1、整体框架
我们设计了一款支持16端口同时读写、CRC数据校验、内存共享与回收、优先级队列调度、多端口写入仲裁的SRAM管理IP。我们设计的整体框架如下所示:
重要IO如下所示:
引脚 | 方向 | 位宽 | 描述 |
---|---|---|---|
wr_data_X | 输入 | 32 | 端口X的输入数据信号 |
wr_vld_X | 输入 | 1 | 端口X的输入数据有效信号wr_vld_X=1 wr_data_X有效; |
wr_sop_X | 输入 | 1 | 端口X数据包终止信号 |
wr_eop_X | 输入 | 1 | 端口X写入的反压信号 full_X = 1,表示端口X不能继续发送数据 |
rd_data_X | 输出 | 32 | 端口X输出数据信号 |
rd_vld_X | 输出 | 1 | 端口X输出数据有效信号 |
rd_sop_X | 输出 | 1 | 端口X输出数据包起始信号 |
rd_eop_X | 输出 | 1 | 端口X输出数据包终止信号 |
ready_X | 输入 | 8 | 端口X的优先级队列请求信号, ready_X[7:0]=0x0f表示调度优先级0,1,2,3优先级的包 |
2、数据包格式定义
数据包头部的32bit信息的作用如下
- priority[2:0]:代表当前数据的优先级,优先级位于0~7;
- des[15:0]:代表该数据包的目的端口;
- cnt_byte[10:0]:代表该数据包的字节数量,字节数量位于64~1024;
3、数据写入和读出
数据写入时序图如下图所示:
数据读出时序图如下图所示:
二、模块设计与实现
模块设计主要包含五个模块,重点在自由指针模块、队列控制器模块、内存管理模块。
数据包接收和发送模块只做了位宽匹配,crossbar架构连接等操作,不做重点介绍。
1、内存管理模块—整体数据流
整体数据流示意图如下所示,其中红线表述数据包写入SRAM的数据流操作过程;蓝线表示读取SRAM数据流操作过程;
1.1、写入过程:
1、初始化自由指针0-2048位置写入的数据为:0-2048;
这个表示第一次需要写入sram的话是从0位置开始写,直到写满为止。
2、写入信号来临,从自由指针中读出需要存放的位置,将此位置信息作为sram的写入地址。同时,将此位置信息和该包头的优先级信息存放入队列控制器模块相对应的优先级队列中。
若在存在多个数据包需要读出的情况时,需要根据优先级信息来读出相应队列信息。
1.2、读出过程:
1、数据读出信号先进入队列控制器,表示端口使能,需要读出属于该端口的数据包;
2、从队列控制器中读出的位置信息给到sram用于读出数据,同时将读出的位置信息存放进入自由指针队列中。
注意:此时存放的就不是0-2048存放0-2048的数据,而是0-2048存放当前从队列控制器中读出的位置
2.自由指针模块
重要IO如下所示
引脚 | 方向 | 位宽 | 描述 |
---|---|---|---|
fq_din | 输入 | 16 | 回收已读出的SRAM信元地址 |
fq_dout | 输出 | 16 | 申请的SRAM信元地址 |
为提高SRAM的存储利用率,对SRAM进行16byte单元的资源粒度划分,因此需要自由指针模块对SRAM资源进行管理。自由指针模块是内存管理模块的核心模块之一,即完成对SRAM的信元(16byte资源颗粒)管理。
2片256kbit的SRAM等价于可存储4096个信元的SRAM,因此需要一个深度同样为 4096的自由指针队列管理该SRAM颗粒资源,其指针值为0~4095。
一次写入过程如上图所示;
- 对于sram而言从自由指针中读出的地址作为位置信息,同时写入数据;
- 对于sram_qc而言从自由指针中读出的地址+优先级信息存入便于后续读出。
3、队列控制器模块
队列控制器模块主要完成对8个优先级队列的管理
重要IO如下所示
引脚 | 方向 | 位宽 | 描述 |
---|---|---|---|
qc_din | 输入 | 16 | 从自由指针中读出的地址数据 |
qc_wr | 输入 | 8 | 含有优先级的写使能信号 |
qc_ack | 输入 | 8 | 含有优先级的选通信号 即qc_rd[7:0]的读信号 |
qc_dout | 输出 | 16 | 含有优先级的输出信号 |
一次读出过程如上图所示;
- 对于sram而言从sram_qc中读出的地址作为位置信息,同时读出数据;
- 对于自由指针而言从sram输出数据的地址表示此时空闲进行回收。
3.1、八个优先级的工作模式
队列控制器行为:
- 写数据:当从自由指针模块申请一个SRAM信元资源,则将该信元资源根据信元的优先级,将其存放到相应的优先级队列之中。
- 读数据:当读出一个SRAM信元,需要从队列控制器回收该资源,因此根据外部qc_ack信号经过mux选出该优先级队列。
总结
至此结束,希望秋招顺利~