【高速多端口共享缓存管理模块】


前言

随着近代网络技术的高速发展,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信息的作用如下

  1. priority[2:0]:代表当前数据的优先级,优先级位于0~7;
  2. des[15:0]:代表该数据包的目的端口;
  3. 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选出该优先级队列。

总结

至此结束,希望秋招顺利~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值