一、背景
一般智能网卡的统计计数内容包括但不限于光口的收发包统计、pcie接口读写请求个数的计数等,都是由各个系统模块传出来1bit计数总线,接到统计模块,统计模块一个时钟检测一次,如果为1,计数器就加一。一般网卡都是长时间运行的,所以计数位宽都会很大,一般常用的是64bit位宽计数器,来保证长时间计数不会溢出,保证统计计数的正确性。这样如果直接用64bit计数器计数的话,资源开销无疑是巨大的
二、实现方式
这里实现的时候计数器用一个小位宽的,实际计数值存在芯片的ram缓存中,芯片内部有一个统计处理单元,轮循处理每一个计数,处理时需要先从缓存中读出上一次的计数值,再加上当前计数器的增量,回写到缓存中,最后并将计数器重新计数。等待下一次处理。相当于计数器只记录“增量”。模块示意图如下图所示
按照上面思路现将512个计数组成一组,那么4096个计数就划分成8组。使用时就直接例化成8份就可以。计数缓存这里用的是双口ram。即这个缓存有两个操作接口,可以在两个端口同时读写。
这里用的计数器的位宽是12bit的,那么计数记到4096时候,计数值就会回滚到0。因为轮循512个计数器是需要消耗一定时间的,处理一个cnt,首先从ram里读出一个数据,需要2个时钟周期,再和cnt相加,需要一个时钟周期,再回写到ram里,需要1个时钟周期,总共4个时钟周期。总共512个计数器,轮循一圈共消耗2048个时钟周期。所以就算统计计数一直在计数,保证计数溢出前处理,将增量回写到ram里。统计处理单元处理流程如下图所示。
更新统计占用了ram的一个端口,读统计就从ram的另一个端口读出。读统计的接口只需要传递一个ram地址,就可以读出统计计数。
资源利用情况,一个12bit的计数器,大约是消耗12个alm,那么总共大概使用4096*12=49,152个。相较于之前节省了大概200,000多个alm,节省效果还是非常明显。ram资源消耗大约4096*64=262,144bit,大约是14个M20K,对于intel的agilex027器件,总共13272个m20k,影响也是微乎其微的。
三优势体现
本技术主要是基于智能网卡的一种优化后的硬件统计的实现方式,在技术上具有很大的优势,下面列出其突出点。
一是节约资源,使用了逻辑资源加ram资源混合架构,大幅度减少逻辑资源的消耗。
二是功能上和完全由逻辑资源搭的计数器方式打平,统计性能也不会有任何的损失。
三是方便布局布线,时序可以好收敛。Ram和逻辑资源相互穿插,有利于EDA工具的布局布线,容易时序收敛。