Verilog开源项目——百兆以太网交换机(五)TCAM单元设计

Verilog开源项目——百兆以太网交换机(五)TCAM单元设计


🔈声明:未经作者允许,禁止转载
😃博主主页:王_嘻嘻的CSDN主页
🔑全新原创以太网交换机项目,Blog内容将聚焦整体架构、模块设计方面;更新周期可能会略慢,希望朋友们多多包涵
🧡关注本专题的朋友们可以学习到原创交换机设计的全流程,包括设计与验证(FPGA)。
🚩第一代交换机  从零开始 verilog 以太网交换机系列专栏:点击这里
💥第二代交换机  Atom(百兆以太网交换机)专栏:点击这里

  Atom支持了包过滤特性,为了支持过滤的多样性,Atom将使用TCAM来存储过滤规则,以实现带优先级的1k条规则匹配,包过滤模块会根据接受包的特征向TCAM发起匹配请求,若匹配成功则进行对应操作,若匹配失败则按部就班的转发

  而为了便于实现,以及资源的平衡,Atom TCAM将使用SRAM实现,并采取分层分列的小块SRAM结构



一、Feature

  • SRAM实现形式;
  • 支持分层,分列的TCAM;
  • 支持pipeline处理,每cycle查询一次规则;
  • 支持添加、查找、删除规则;


二、概述

  Atom TCAM是为了实现PF中包过滤的特性,用来判断接收到的packet是否符合用户下达的某些规则。
在这里插入图片描述

  由于DPI功能过于复杂,所以Atom将DPI简化为包过滤特性,计划支持1K条包过滤规则。使用源地址、目的地址、源端口、目的端口、协议类型、报文长度和TCP flags共128-bits组成固定关键词,所以TCAM大小为128-bits x 1k。

  考虑到额外调用一个TCAM IP对成本和移植性不够友好,我们在此使用SRAM来实现TCAM的功能,并通过分层分列的划分方式减少SRAM的用量。
除了PF通过TCAM查询规则外,也有外部通道支持用户直接添加、删除、查询规则。



a)TCAM原理

  TCAM是一种三态内容寻址存储器,其比CAM增加了X态的内容寻址,x表示不论0、1都能匹配,TCAM寻址过程如下(和哈希表原理一样):

  1. 当搜索内容为‘010’时,TCAM搜索到对应内容的地址为0;
  2. 当搜索内容为‘001’时,TCAM搜索到内容符合‘00x’,对应地址为2;
    在这里插入图片描述


b)TCAM分层分列

  考虑到在工程实现与移植方面,本设计使用SRAM来实现TCAM功能,参考《基于SRAM的硬件搜索引擎设计与实现》[1] 有关想法。

  用SRAM实现TCAM本质是将关键字内容作为SRAM的地址,将TCAM的地址映射为onehot形式的数据,表示是否存在对应关键字信息,具体过程如下图:
在这里插入图片描述
  例如TCAM的第一行数据‘001’,其对应SRAM中第二行的bit0,通过SRAM的行编码表示关键字,SRAM的列编号表示该关键字在TCAM的哪一行中。

  同理,TCAM的第八行数据‘1x1’应该映射到SRAM中‘101’行和‘111’行中的bit7。


  如果直接把128-bits x 1k rules的TCAM通过SRAM实现,将需要极大的SRAM,如果通过分列的方式,能有效的减少SRAM的使用量。
在这里插入图片描述
  如果是不分列的4-bits x 8的TCAM,需要一块8-bits x 16的SRAM来实现;但经过上图分列后的TCAM,只需要两块8-bits x 4的SRAM实现,节省了50%的SRAM使用量。

  而分列的本质意义就是将TCAM进行横向的拆分,拆成多个小TCAM进行并行的内容匹配,再相互&,只有所有小TCAM都匹配上时,才视为匹配成功,这个优化能以指数级降低SRAM深度。

  另一方面,为了更好的适配FPGA中的BRAM,我们将TCAM的行也进行分割,称为分层,具体如Atom TCAM架构图所示,这样一整个TCAM被分为多个小块,能更容易的划分SRAM的大小。每层之间采用优先编码器进行地址的选择,具体如下图所示:

在这里插入图片描述

  例如关键字‘00’同时hit了地址0、2、3、5,但根据优先级原则,TCAM会返回地址0。



c)外部通道

  PF只会发送search请求,而外部通道还可能发送add、delete请求,当发送该类请求时,需要带上对应地址,也就是rule序号,该序号也代表了该rule的优先级。如果是search请求,不需要输入地址。





三、接口

在这里插入图片描述






本次设计主要参考以下两篇论文,侵权必删:

【1】 杨蕊. 基于SRAM的硬件搜索引擎设计与实现[D]. 大连理工大学, 2020. DOI:10.26991/d.cnki.gdllu.2020.002322.
【2】 施自林. 基于SRAM的TCAM存储优化技术研究[D]. 国防科技大学, 2020. DOI:10.27052/d.cnki.gzjgu.2020.000507.





若有不专业或错误之处,欢迎指正!

具体电路实现及验证环境代码会在准备完毕后开源,目前暂时不能给出,请见谅


搜索关注我的微信公众号【IC墨鱼仔】,获取我的更多IC干货分享!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

核心实验:基于Web前端的性能测试分析!

实验简介 本实验主要利用IE和Chrome的F12开发人员工具结合Web前端测试分析相关知识,对常见网站进行基于前端的性能测试分析,本实验将不会使用到测试开发相关技术,而是纯粹意义上的手工测试,但却是很容易找到系统前端性能及设计问…

C++字体库开发

建议根据字体需求,多个组合使用。高度定制可基于freeTypeharfbuzz基础库完成。 GitHub - GNOME/pango: Read-only mirror of https://gitlab.gnome.org/GNOME/pango GitHub - googlefonts/fontview: Demo app that displays fonts with a free/libre/open-source …

实用软件分享-----一款免费的投屏软件(支持手机投屏到电脑)Aiseesoft Phone Mirror 2.2.36 x64

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

天猫商品列表数据接口(Tmall.item_search)

天猫平台商品列表数据接口(taobao.item_search)是天猫开放平台提供的一个API接口,用于获取天猫平台上的商品列表数据。通过该接口,用户可以获取到商品的名称、价格、销量、评价等信息。下面将具体介绍这个接口的各个方面&#xff…

H616连接摄像头

(1)首先将USB摄像头连接到OrangePi开发板的USB接口 (2)通过lsmod命令查看是否加载了uvcvideo模块 lsmod | grep video (3)通过 v4l2-ctl 命令可以看到 USB 摄像头的设备节点信息为/dev/video0 sudo apt u…

剖析DeFi交易产品之UniswapV4:创建池子

本文首发于公众号:Keegan小钢 创建池子的底层函数是 PoolManager 合约的 initialize 函数,其代码实现并不复杂,如下所示: function initialize(PoolKey memory key, uint160 sqrtPriceX96, bytes calldata hookData)externalover…

Redis---保证主从节点一致性问题 +与数据库数据保持一致性问题

保证主从节点一致性问题 Redis的同步方式默认是异步的,这种异步的同步方式导致了主从之间的数据存在一定的延迟,因此Redis默认是弱一致性的。 解决: 1.使用Redisson这样的工具,它提供了分布式锁的实现,确保在分布式环…

【C语言】使用C语言编写并使用gcc编译动态链接库

【C语言】使用C 语言编写并使用 gcc 编译动态链接库 1.背景2.使用C编写代码3.使用gcc编译代码1.背景 在windows下开发很多程序接口被封装到动态链接库供其它开发者使用。 本博客使用C语言编写并使用gcc 编译 一个动态链接库文件FpdSys.dll; 然后使用C/C++/C#/Python去调用动态…

代码生成器使用指南,JeecgBoot低代码平台

JeecgBoot 提供强大的代码生成器,让前后端代码一键生成,实现低代码开发。支持单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用。 同时提供强大模板机制,支持自定义模板,目…

[单master节点k8s部署]15.安全机制

用户访问集群需要认证、授权、准入三个步骤。apiserver是整个集群访问控制的唯一入口。 认证 认证是对用户的身份认证,通常包括用户名密码认证,但是也包括对service account的认证。 限制不同用户访问集群 生成ssl密钥 在/etc/kubernetes/pki/ 目录…

Python 基础 (标准库):heapq (堆)

1. 官方文档 heapq --- 堆队列算法 — Python 3.12.4 文档 2. 相关概念 堆 heap 是一种具体的数据结构(concrete data structures);优先级队列 priority queue 是一种抽象的数据结构(abstract data structures)&…

在非 antd pro 项目中使用 umi OpenAPI

大家好,我是松柏。自从跟着鱼皮哥使用了ant design pro中的OpenAPI插件之后,我已经无法忍受自己写请求后端接口的方法了,所以这篇文章记录一下如何在非ant design pro项目中使用OpenAPI。 安装依赖 首先我们需要安装包umijs/openapi&#x…

上交举办“大模型奥林匹克竞赛”,GPT-4o仅得39分

大模型的奥林匹克竞赛来了! 最近,上交构建了一个全面、极具挑战性的奥赛级别的基准——OlympicArena,从来自62个不同奥林匹克竞赛中筛选出11,163个问题,涵盖数学、物理、化学、生物、地理、天文学和计算机科学等七个学科&#xf…

[22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪

Opencv_CUDA应用之 使用背景相减法进行对象跟踪 背景相减法是在一系列视频帧中将前景对象从背景中分离出来的过程,它广泛应用于对象检测和跟踪应用中去除背景 背景相减法分四步进行:图像预处理 -> 背景建模 -> 检测前景 -> 数据验证 预处理去除…

博客搬家前台申请功能下线通知

尊敬的用户们: 您好! 感谢您一直以来对我们博客平台的关注与支持。为了更好地优化我们的服务质量和用户体验,经过慎重考虑,我们决定将于近期对博客搬家前台申请功能进行下线处理。在此,我们向广大用户表示诚挚的歉意…

仿论坛项目--第一部分相关习题

1.关于IOC注解,说法正确的是 A.autowired用于注入bean,该注解只能写在成员变量的前面 B.Qualifier用于声明bean的名称,该注解只能引用bean的自定义名称 C.Bean用于装配第三方的Bean,不能装配自定义的bean D.Configuration用于声明配置类&…

AD9026芯片开发实录6-example code

官方发布的软件包中,带了一份example code,用于向客户展示API的调用方法以及基于官方的验证版ADRV902X最简单的bring up的流程。 该 example 位于软件包的路径下:“\Adi.Adrv9025.Api\src\c_src\app\example\”。 代码组成: initd…

JavaScript 实用技巧

1. 使用 const 和 let 替代 var 在 ES6 之前,我们通常使用 var 声明变量。但如今,推荐使用 const 和 let,因为它们具有块级作用域,可以避免很多潜在的问题。 const PI 3.14; // 常量,无法重新赋值 let age 25; // …

边界框在目标检测中的作用与应用

目标检测是计算机视觉领域的核心任务之一,旨在从图像或视频中识别和定位感兴趣的目标。边界框(Bounding Box)是目标检测中常用的一种表示方法,用于确定目标在图像中的确切位置。本文将详细探讨边界框的概念、它在目标检测中的角色…

使用ElementUI组件库

引入ElementUI组件库 1.安装插件 npm i element-ui -S 2.引入组件库 import ElementUI from element-ui; 3.引入全部样式 import element-ui/lib/theme-chalk/index.css; 4.使用 Vue.use(ElementUI); 5.在官网寻找所需样式 饿了么组件官网 我这里以button为例 6.在组件中使用…