一次常规调试中发现上电后交换机多个口同时打流会导致卡死的现象,最后一步步分析问题出现的原因是位宽不够导致的溢出。这让我回想起团队已经量产的某款芯片,也是因为某个寄存器位宽设置过小的原因,导致组播组设置的时候不能超过31,否则就会溢出,只能想办法通过软件来解决这个问题。这次出现问题的交换机是基于共享缓存的架构,希望后面引以为戒,设计每个小的寄存器时都要考虑全面。
背景
在使用verilog进行程序设计时,尤其需要注意数据位宽问题。当我们将程序烧入fpga的时候电路已经固定,不能像C语言那样动态改变数组长度,因此数据位宽设计不恰当会引入意想不到的问题。例如我们使用二进制进行计数时,位宽为5的数据表示范围为0-31,当数据为32时由于位宽不够,实际显示则为0,如果此时你需要对这个数进行大小判断,那么可能会得到错误的结果。笔者在交换机功能调试、解决bug的过程中对此深有体会。
首先我们来看一下交换机对数据的处理流程,网络测试仪发出的数据首先经过接口进入分流模块,我们的交换机支持TT业务(时间触发)和ET业务(普通以太网),本文就ET业务进行分析。以太网帧进入MAC核进行CRC校验,