您的位置 >> 默认分类

NetFPGA平台系统架构分析(一)——REMOVE_PKT 更新于2010-07-23 02:37:21 文章出处:与非网

关键字:

 

 
       这几天正是全国网络安全竞赛的重要时刻,好多朋友询问有关remove_pkt.v模块的问题(NetFPGA推荐架构中的一个关键模块),我们全国的NetFPGA交流群和Digilent的网站也受到不同程度的轰炸,本着为人民服务和科学无私的奉献精神,受Digilent(China)的Nick委托,特此将此模块单独拎出来研究一下,并分析总结此文,仓促成文,如有错误之处,敬请包涵。
       模块信息如下:
///////////////////////////////////////////////////////////////////////////////
// vim:set shiftwidth=3 softtabstop=3 expandtab:
// $Id: remove_pkt.v 3868 2008-06-04 16:18:03Z grg $
//
// Module: remove_pkt.v
// Project: NF2.1
// Description: implements a round-robin arbiter over the output queues,
//              reads a packet from the SRAM, strips the header and sends it
//              to a tx fifo.
//
//////////////////////////////////////////////////////////////////////////////

 
 
此模块的链接关系如下图所示:
 
 
 
 
 
     由连接关系可以看出,此模块主要同SRAMOutput Queue打交道(群共享有清晰无码大图)。其中主要状态机有两个:RM_STATE_MECHINEHP_DATA_FORWARD_STATE_MACHINE
(自定义名称)。
    一.          模块链接的几个说明:
    1.       wire [DATA_WIDTH+CTRL_WIDTH-1:0] output_fifo_dout[0:NUM_OUTPUT_QUEUES-1];
     output_fifo_dout是一个深度为8,宽度为72的向量,其中的每一个output_fifo_dout[i]代表了output queue中第iqueue的出口,由assign语句赋值。本模块中很多地方都使用了此类技巧。
    2.           reg [SRAM_ADDR_WIDTH-1:0]   lo_addr;
      reg [SRAM_ADDR_WIDTH-1:0]   hi_addr;
 这两个变量中存放了SRAM中当前处理的数据包的起止地址,宽度同样为72bit,其中高低地址都是由reggrp传递而来。
    3.       文件中例化了8个512x72的fifo,作为数据通道传递数据包给tx。
    4.       72-bit宽的数据中,包括了8bit的带外控制信号,定义如下图所示:
 

注:此图来自NetFPGA官网

     其中,控制信号为0xff时表明此时的数据字段为额外包头字段;控制信号为0表示此时的数据字段为数据包内容;0x10表示本包结束。
    二.         状态机
本模块中有两个大的状态机:RM_STATE_MECHINEHP_DATA_FORWORD(自定义名称)。
    1.              RM_STATE_MECHINE
Description:
    本模块的主要功能是不断从SRAM读取数据,72bit位宽数据,以数据包单位。其中,rd_0_data定义如下:
   CTRL     8bit;
   DATA     64bit
     具体到本状态机,共有四个状态:
 
RM_IDLE:等待SRAM中的队列数据(共8个),由SRC_OQ选择。当选中某个队列后,src_oq_empty[src_oq] 表示其是否为空(SRAM);enable_send_pkt[src_oq]表示其所存数据是否可发送(SRAM);output_fifo_empty[src_oq]表示其下一个队列即output queue的相应队列是否为空。如果不满足上述条件,则检查下一个queue,否则转RM_LATCH_ADDR。
 
RM_LATCH_ADDR:将要处理的队列在SRAM中的地址传递给本状态机,其中:
   hi_addr_next为地址最高位;
   lo_addr_next为地址最低位;
    两地址之间为此数据包存放的地址区间。
RM_WAIT_PKT_LEN:此处有个重要变量ld_pkt_len,此为数据包长度的有效位,即此变量为1时,data数据的72个bit中有16bit为此包的长度,本状态就是等待ld_pkt_len为高电平,否则等待;
 
RM_MOVE_PKT:等待此数据包全部取出后,删除SRAM中的相应存储空间内容。
 
 
                                                        1 RM_STATE_MECHINE
 
  2. HP_DATA_FORWARD_STATE_MACHINE
 
    本状态机的主要功能是SRAM中的数据取出并转发到相应的Output Queue中。此状态机共有两个状态:HP_IDLE和HP_WAIT_EOF。
HP_IDLE:此装态的主要功能是检测带外控制信号,并且在检测到数据包额外包头时,将ld_pkt_len位置1,并使能相应的output queue开关;
HP_WAIT_EOF:此状态的主要功能是检测带外控制信号,收到第一个非零的值后结束等待传输数据状态。
    数据的转发主要通过置位使能位来进行。
 
 
 
图2. HP_DATA_FORWARD_STATE_MACHINE
  三. 工作流程
        此模块的主要功能是从SRAM中读取数据(有八个FIFO,每一个仅存一个数据包),去除额外包头后转发到output queue中。
      模块以轮询的方式读取SRAM的各个FIFO状态,如果当前模块为空,则询问下一个FIFO,如此循环,直到当前FIFO数据可以用,则启用读取机制。
        状态机HP_DATA_FORWARD_STATE_MACHINE的HP_WAIT_EOF状态就是不断将output queue相应FIFO使能的一个状态此时数据不断被读取直到收到带外控制信号的第一个非零字节上图所示),则转发完毕。
     鉴于个人水平和叙述能力的限制,今晚8点在NetFPGA全国交流群(94301250)中讨论此模块的问题,敬请光临。