Verilog开源项目——百兆以太网交换机(九)表项管理模块设计
🔈声明:未经作者允许,禁止转载
😃博主主页:王_嘻嘻的CSDN主页
🔑全新原创以太网交换机项目,Blog内容将聚焦整体架构、模块设计方面;更新周期可能会略慢,希望朋友们多多包涵
🧡关注本专题的朋友们可以学习到原创交换机设计的全流程,包括设计与验证(FPGA)。
🚩第一代交换机 — 从零开始 verilog 以太网交换机系列专栏:点击这里
💥第二代交换机 — Atom(百兆以太网交换机)专栏:点击这里
Atom TBM(Table Manager)即交换机表项管理模块,负责根据Packet的源MAC地址、源端口号进行自学习,便于下次遇到相同的MAC地址查询端口号,并定时完成高效的表项老化处理。
此外,Atom创新的使用循环hash和双hash算法来减轻hash冲突的影响。
一、Feature
- 100M时钟下,支持流水,每拍一次hash管理;
- 支持可选的hash冲突管理;
- 支持循环hash模式,循环最多不超过8次(否则性能将有几率不达标);
- 支持双hash模式;
- 支持表项自学习、查询、表项老化管理;
二、概述
TBM(Table manager)为MAC table的管理模块,负责对MAC地址和Port映射的表项管理。主要功能为当DB请求Port查询后,判断MAC addr是否存在于表项,并自学习,记录Src MAC addr和Src Port的映射关系,同时在MAC table空闲时刻,进行表项的老化管理。
Atom在TBM中额外增加了SHA-256和SM-3的Hash算法,并支持Hash冲突避免,当发生Hash冲突后,Atom可以选择循环SHA-256、循环SM-3直至找到空闲位置,或者双Hash模式,同时计算SHA-256或者SM-3来寻找空位。
三、接口
四、功能设计
a)Hash算法
Atom共支持两种Hash算法:SHA-256和SM-3。
- 当用户不启用双Hash模式解决Hash冲突时,可以自由选择其中一种Hash算法对MAC地址进行映射。
- 当用户启用双Hash模式后,TBM将同时用SHA-256和SM-3进行MAC地址映射,并根据策略选择空闲地址自学习和查询。
b)Hash冲突
在Port映射的查询过程中,如果发生Hash冲突后,简单丢弃冲突的MAC地址,直接广播将极大的降低Packet传输效率,而过于复杂的Hash冲突解决方案又会降低查询速率,所以平衡性能的解决Hash冲突的方式在自学习和查询过程中将极为重要。
Hash冲突处理流程如上图所示:
- 当DB请求查询Port时,首先同时计算SHA-256、SM-3的Hash值;
- 若主Hash算法没有发生Hash冲突,则成功完成这次请求;
- 若主Hash算法发生Hash冲突,查询用户配置,是否开启Hash避免模式;
- 若没有配置Hash避免,则这次请求失败(学习和查询),作为广播包处理;
- 若配置Hash循环模式:(n为用户配置的循环上限,不可大于8)
a) 循环次数<n时,使用前一次的Hash值作为新一次Hash算法的输入,再次计算Hash值;
b) 循环次数=n时,退出循环,这次请求失败(学习和查询),作为广播包处理; - 若配置双Hash模式:
a) 副Hash算法没有发生Hash冲突,成功完成这次请求;
b) 副Hash算法发生Hash冲突,这次请求失败(学习和查询),作为广播包处理;
c)映射查询
Atom的自学习流程和查询过程总体和上一代Switch类似,流程如下:
- 收到DB请求后,先计算Src MAC Addr的Hash值,判断是否冲突,若冲突则先存入SFIFO中,等待controller空闲时处理;否则学习成功,将Src Port、Src MAC Addr、Hash次数存入表项;
- 处理查询操作,计算Dst MAC Addr的Hash值,若冲突,则执行冲突避免策略,如果时Hash循环模式,同样存入SFIFO中,等待controller下次空闲处理;否则需要MAC Addr和Hash次数完全一致才判断命中;
- 当DB req和internal SFIFO都存在请求时,优先处理internal req;
d)老化管理
Atom将采用触发式的老化剔除模式,避免不断请求刷新TTL,浪费功耗。TBM通过一个2048-bits的bitmap记录MAC table每个表项是否有效,并且在MAC table的表项中会同时记录最近一次MAC addr查询成功的时间。
通过上述方式可以在没有自学习和查询请求时,间接插入老化请求,剔除过久没有触发的表项,不需要单次连续扫描实现,为此表项内容如上图所示:包含48-bits的MAC addr,4-bits的目的端口,12-bits的表项触发时间戳。
在每次查询成功或老化成功时,会同时维护一个Mac table context bitmap,在每次system timer跳动时(单位为1us),触发scan controller进行bitmap的扫描,将存活的bit addr扫描出来,并缓存到SFIFO中。
- 如果在1us内扫描结束,那么scan controller停止,等待下1us的触发;
- 若扫描时间超过1us,那么直接开始下一次扫描;
当aging req读到对应表项后,将表项内的trigger timestamp和sys timer比较,若sys timer > trigger timerstamp + cfg_ttl,则老化剔除,否则不进行任何操作。
若有不专业或错误之处,欢迎指正!
具体电路实现及验证环境代码会在准备完毕后开源,目前暂时不能给出,请见谅
搜索关注我的微信公众号【IC墨鱼仔】,获取我的更多IC干货分享!