首页> 中国专利> 路由器多队列数据包缓存管理与输出队列调度系统

路由器多队列数据包缓存管理与输出队列调度系统

摘要

路由器多队列数据包缓存管理与输出队列调度系统属于因特网主干网核心路由器技术领域。其特征在于用一片FPGA配合片外数据片存储器和链表存储器构成。该FPGA芯片含有:接收外界数据的数据片FIFO存储器及链表管理电路,链表管理电路通过两个接口电路分别和数据片存储器及链表存储器相连,链表管理电路输出经过队列状态存储器的1024个队列状态信息到队列调度电路,队列调度电路把1024个队列中加权和最大的队列调度出来,并将调度出来的队列编号通过调度结果FIFO存储器送到链表管理电路,链表管理电路通过数据片存储器接口电路,将数据片存储器存储的数据片经数据包发送电路输出。系统支持质量服务,数据包速率为2.5Gbps时,能线速处理进出存储器的数据包。

著录项

  • 公开/公告号CN101252536A

    专利类型发明专利

  • 公开/公告日2008-08-27

    原文格式PDF

  • 申请/专利权人 清华大学;

    申请/专利号CN200810103051.1

  • 发明设计人 杨珂;徐明伟;赵有健;全成斌;

    申请日2008-03-31

  • 分类号H04L12/56;H04L12/02;

  • 代理机构

  • 代理人

  • 地址 100084 北京市100084-82信箱

  • 入库时间 2023-12-17 20:41:01

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2013-05-22

    未缴年费专利权终止 IPC(主分类):H04L12/56 授权公告日:20100602 终止日期:20120331 申请日:20080331

    专利权的终止

  • 2010-06-02

    授权

    授权

  • 2008-10-22

    实质审查的生效

    实质审查的生效

  • 2008-08-27

    公开

    公开

说明书

技术领域

路由器多队列数据包缓存管理与输出队列调度系统属于因特网主干网核心路由器的技术领域。

背景技术

在路由器线卡入口,一个数据包按照一定的规则被拆分为多个数据片,然后,通过交换结构,在路由器线卡输出端口,被拆分的多个数据片进行组合,恢复为原来的数据包。为了支持服务质量(Quality of Sevice),在输出端口,不同源端口和优先级的数据片需要各自归入独立的队列进行管理。

数据包分成的一个或多个数据片具有固定的长度,CSIX协议规定信元的长度最长不得超过256个字节。数据包分成的数据片只有最后一个可以小于系统定义的固定长度,其它数据片的长度必须是固定长度。

队列保存有两种常见方法,一种是静态分配缓存方法,该方法为每个队列划分一个固定的区域,这些区域的地址是连续的,即使某个队列的存储区域在某个时刻没有使用,空闲,其它的队列也不能使用它。一种是动态共享分配缓存方法,该方法不为每个队列划分一个固定的区域,所有的存储区域被不同队列动态共享,任何空闲的区域,可以被首先需要使用的队列使用。在支持多优先级的高性能路由器中,采用动态共享分配存储的方法,可以大大地提高缓存的利用效率。

为了支持服务质量,路由器必须采用一定的调度策略,将输出端口缓存中保存的数据包发送到输出端的数据链路。

核心路由器中多队列数据缓存管理与输出队列调度,不同厂家的具体实现方式各不相同,有的使用专门定制的专用集成电路芯片与存储器相连实现,也有的使用FPGA与存储器相连实现。

FPGA(Field Programmable Gate Array)是上世纪80年代末开始使用的大规模可编程数字集成电路器件。它充分利用计算机辅助设计技术进行器件的开发与应用。用户借助于计算机不仅能自行设计专用集成电路芯片,还可在计算机上进行功能仿真和实时仿真,及时发现问题,调整电路,改进设计方案。这样,设计者不必动手搭接电路、调试验证,只须在计算机上操作很短的时间,即可设计出与实际系统相差无几的理想电路。而且,FPGA器件采用标准化结构,体积小、集成度高、功耗低、速度快,可无限次反复编程,因此,成为科研产品开发及其小型化的首选器件,其应用极为广泛。

发明内容

本发明目的在于提供一种核心路由器线卡输出端多队列数据包缓存管理与输出队列调度的实现机制,

其特征在于,它含有一个FPGA芯片,作为该FPGA芯片片外存储器的链表存储器,以及同样作为该FPGA芯片片外存储器的数据片存储器,其中:

数据片存储器,被分成大小相等的2(N+1)个存储块,N一般取不小于8192的自然数,每个存储块存储一个数据包的一个数据片,组成每个存储块的存储单元的地址是连续的;来自同一个输入线卡,具有相同优先权的数据包构成一个队列,每个队列所占用的存储块采用链表的形式进行管理;

链表存储器,用于保存数据片存储器中的所有链表,每一个链表结点保存数据片存储器的一个存储块,链表结点的存储地址和存储块的序列号一一对应,每一个链表结点存储在链表存储器的一个存储单元中,作为链表存储器的存储器,每个存储单元的数据宽度由数据片存储器分成的存储块数量,以及数据片的最大长度决定,具有如下数据结构:

0~N比特位,表示同一队列的下一个链表结点地址,

N+1比特位,表示数据包的边界结点,

N+2比特位,为存储单元使用的指示标识,

N+3~N+K比特位,为数据片长度,K和系统定义的数据片最大值相关,K最大值为8,

其中:

N+2比特位为1,表示该节点对应的存储块存有数据片,该存储器单元已经被使用,否则置0;

N+1比特位为1,表示这是数据包的最后一个数据片,否则置0;

N+3~N+K比特位,保存对应数据片的实际长度,长度以4字节为单位;

链表结点分为:数据片队列链表结点和空链表结点;

FPGA芯片含有:数据片存储器接口电路、数据片FIFO存储器、数据片输入电路、链表管理电路、数据包输出电路、链表存储器接口电路、队列状态存储器、调度结果FIFO存储器,以及队列调度电路,其中:

数据片FIFO存储器,含有外界数据输入端,所连数据片输入电路输出的读数据信息输入端,还含有指向所连外界数据输入端的快满信号;

数据片输入电路,第一个输入端与所连FIFO存储器的数据片输出端相连,第一个输出端与所连链表管理电路的数据片输入端相连,而第二个输入端则与所连链表管理电路的快满信号输出端相连;

队列状态存储器,是由4个双端口的片内RAM存储器组合而成,其数据输入端口和所连链表管理电路的数据输出端相连,若输入的队列含有至少一个完整的数据包,则队列对应的存储单元置1,反之,置0,它的读地址和读信号来自队列调度电路,组成队列状态存储器的每个RAM存储器读写端口地址线、数据线宽度不同,读端口地址线有3根,输出数据位宽为32位,它的写端口,有8根写地址线,但写入数据宽度为1位;

队列调度电路,数据输入端和所连队列状态存储器的数据输出端相连,而该队列调度的数据输出端和所连队列调度电路FIFO存储器的输入端相连;

队列调度结果FIFO存储器,它的输入端和所连队列调度电路的输出端相连,同时它输出快满信号给队列调度电路,它的输出端和链表管理电路相连,而读信号也来自链表管理电路;

数据片存储器接口电路,两个输入端分别和所连数据片输入电路、链表管理电路的数据输出端相连,同时,另外又和数据片存储器相连;

链表存储器接口电路,分别和所连链表管理电路、链表存储器互联;

数据包输出电路,数据包输入端与所连数据片存储器接口电路的输出端相连,另外还有一个数据包输出端和外界相连;

链表管理电路,含有:存储器、寄存器和内部逻辑控制电路,用于管理片外的链表存储器,最多管理1024个链表队列,其中:

存储器,含有:队列含数据片个数存储器、队列含数据包个数存储器、链表队列头地址存储器、链表队列尾地址存储器以及待发送数据片首地址FIFO存储器,其中:

链表队列头地址存储器,是双端口存储器,地址宽度为10位,数据宽度为N+1位,各个存储单元存放不同队列的链表头地址,以便索引某个队列的第一个数据片链表结点地址和相应的数据片;

链表队列尾地址存储器,是双端口存储器,地址宽度为10位,数据宽度为N+1位,各个存储单元存放不同队列的尾地址,以便索引某个队列的最后一个数据片链表结点地址和相应的数据片;

队列含数据片个数存储器,是双端口存储器,地址宽度为10位,数据宽度为N+1位,各个存储单元存放不同队列含数据片个数信息;

队列含数据包个数存储器,是双端口存储器,地址宽度为10位,数据宽度为N+1位,各个存储单元存放不同队列含数据包个数信息;

待发送数据片首地址FIFO存储器,是一个先入先出FIFO队列存储器,数据宽度为N+1比特,深度为8,存储4个数据后,发出快满信号;

寄存器含有:空链表头指针寄存器、空链表下一个头指针寄存器、空链表尾指针寄存器、数据片队列头指针寄存器、数据片队列尾指针寄存器、外存含数据片个数寄存器,每个寄存器的位宽为N+1位,其中:数据片队列头指针指定当前队列第一个数据包的第一个数据片的结点地址,数据片队列尾指针指定当前队列最后一个数据包的最后一个数据片的结点地址;

内部逻辑控制电路,对链表管理电路内的存储器和寄存器进行数据信息和控制信息的交互,同时对所连数据片存储器接口电路、数据片输入电路、链表存储器接口电路、队列状态存储器,以及调度结果FIFO存储器进行控制信息和数据信息的交互;

队列调度电路,由队列加权和更新电路、1024选1数据比较器构成,其中:

队列加权和更新电路,含有:队列调度结果存储器、队列加权和存储器以及加权和计算电路,其中:

队列调度结果存储器,是一个双端口存储器,输入端与1024选1数据比较器的输出端相连,也与加权计算电路相连,从加权计算电路中输入存储器读地址和读信号,输出端和加权计算电路相连,输出队列调度结果;

队列加权和存储器,是一个双端口存储器,与加权计算电路相连,输入输出每个队列的加权和W;

加权计算电路,从队列状态存储器得到两个线卡共128个优先权队列的状态信息,同时根据队列调度结果存储器保存的最后一次1024个队列的调度结果,按以下方式计算出2个线卡128个队列的加权和,对于来自某线卡优先级为m的数据包队列:

若:通过队列调度结果存储器,知道最近一次调度中它没有被选中,但从队列加权和存储器了解其以前加权和为W,且从队列状态存储器输入值了解该队列含有完整未发送的数据包,则优先级为m的队列新的加权和为W+m;

若:最近一次调度它未被选中,以前的加权和为W,该队列不含有未发送数据包,则优先级为m的队列新的加权和为0;

若:最近一次调度被选中,该队列以前的加权和为W,且含有完整未发送的数据包,则优先级为m的队列新加权和为m;

若:最近一次调度被选中,以前的加权和为W,但不含有完整未发送的数据包,则优先级为m的队列的新加权和为0,

加权计算电路输出:每次输出2个线卡号,以及每个线卡64个队列的加权和,它实现来自16个线卡的1024个数据包队列加权和更新;

1024选1比较器含有:加权和比较和当前加权和最大的优先级生成电路,以及16选1数据比较器电路,其中:

加权和比较与当前加权和最大的优先级生成电路,共分两组,每组由延时电路、64选1数据比较器和线卡加权和最大优先级更新电路组成,两个延时电路分别输入0-7线卡号及8-15线卡号,两个64选1数据比较器分别输入相应线卡内64个队列的各自加权和,各自输出来自一个线卡的64个队列中队列加权和的最大值,该最大值是通过来自同一线卡的64个队列中,每个队列的加权和经过俩俩比较以后,得到的;而两个线卡加权和最大优先级更新电路共同输出更新后的16个加权和及16个加权和对应的线卡号;

16选1数据比较器电路,含有两个含优先级输入的8选1数据比较器及一个2选1数据比较器,两个含优先级输入的8选1数据比较器共同输入16个更新后的队列加权和,共同输出其中两个最大的加权和及相应的最大加权和队列编码,而2选1数据比较器则从输入的2个加权和及相应编码中挑选一个最大的输出;

构成64选1的8选1数据比较器和16选1数据比较器电路的含优先级输入的8选1数据比较器都包含28个16位数据比较器,一个多路选择器,16位数据比较器有A和B 2个16位输入数据,复位RESET是16位数据比较器的复位端,如果A大于或等于B,16位数据比较器的输出AgeB为1,否则为0,16位数据比较器完成2个16位数据的比较需要耗费一个时钟周期,对应8选1数据比较器或含优先级输入的8选1数据比较器,让8个输入数据A8~A1,进行俩俩比较,根据所有的比较结果,可以确定8个输入数据中,哪一个最大;如果A8≥A7,A8≥A6,A8≥A5,A8≥A4,A8≥A3,A8≥A2,A8≥A1都成立,则A8就是最大数,否则,若A7≥A6,A7≥A5,A7≥A4,A7≥A3,A7≥A2,A7≥A1都成立,则A7就是最大数,以此类推,通过28个16位数据比较器和一个多路选择器的配合,可以从8个输入数据中选择到一个最大数据,8选1数据比较器完成一次运算需要2个时钟周期;

队列调度电路把从1024选1数据比较器得到的加权和最大的队列及其编码送往调度结果FIFO存储器,由链表管理电路读取后,通过链表管理电路的运行,得到调度成功队列队头数据包的所有数据片在数据片存储器存储的首地址,这些地址保存在待发送数据片首地址FIFO存储器,通过该FIFO存储器,发往数据片存储器接口电路,数据片存储器接口电路从FPGA片外数据片存储器读取数据包的每一个分片,发送到数据包输出电路,通过数据包输出电路输出。

通过上述方法构建的线卡输出端多队列数据包缓存管理与输出队列调度系统,达到的性能指标为:

QOS支持1024个数据包队列;

队列链表式存储共享;

支持加权轮询优先级调度策略; 

每8个时钟周期产生一个队列调度结果;

线卡接收数据包速率为2.5Gbps时,系统能够保证线速处理输入输出数据包。

附图说明

图1 多队列数据包缓存管理与输出队列调度系统的系统结构图;

图2 路由器线卡和交换结构的连接示意图;

说明:多队列数据包缓存管理与输出队列调度系统寓于分片组合成数据包电路之中,是该电路必不可少的组成部分;

图3 共享缓存的多队列数据存储示意图;

说明:一个数据片由一个英文字母加一个阿拉伯数字代表,英文字母相同的数据片属于同一个队列,阿拉伯数字表示当前数据片在各自队列中,被存入存储器的顺序.

图4 空链表队列结构和数据包队列结构;

图5 链表存储器的初始化后效果图;

说明:图中初始化是以存储器被分成64*1024个存储块为例。

图6 链表初始化示意图;

图7 链表管理电路内部功能框图;

图8 队列头或尾地址存储器接口图;

图9 队列数据包或数据片个数存储器接口图;

图10 队列状态存储器接口及其组成的4个双端口存储器接口图;

说明:A1和A2输入输出端口供0~7号线卡使用,B1和B2输入输出端口供8~15号线卡使用

图11 8选1数据比较器功能框图;

说明:图中的比较器都是16位数据比较器;

图12 16位数据比较器接口框图;

说明:如果输入的16位数据A大于或等于16位数据B,则输出值AgeB为1,否则为0,16位数据比较器从数据输入到得到输出结果,需要一个时钟周期;

图13 含优先级输入的8选1数据比较器功能框图;

说明:图中的比较器都是16位数据比较器;

图14 64选1数据比较器功能框图;

图15 1024选1数据比较器功能框图;

图16 队列调度电路功能框图;

图17  队列加权和更新电路功能框图;

具体实施方式

核心路由器线卡输出端多队列数据包缓存管理与输出队列调度调度功能由一片FPGA配合2片存储芯片完成的。

1.整个系统含有:

(1)数据片FIFO存储器,它是一个先入先出队列存储器,它接收外界写入的数据片和数据片输入电路的读数据信号,同时反馈给外界存储器快满信号。

(2)数据片输入电路,它的输入端和链表管理电路的输出端相连,它接收链表管理电路发送的数据片存储器快满信号。

(3)链表存储器,它是FPGA片外存储器,它的输入端口和输出端口都和链表管理电路相连。

(4)数据片存储器,它的输入端、输出端和存储器接口电路相连,它是一个FPGA片外存储器。

(5)队列状态存储器,是由4个双端口的片内RAM存储器组合而成,其数据输入端口和链表管理电路的数据输出端相连,若输入的队列含有至少一个完整的数据包,则队列对应的存储单元置1,反之,置0。它的读信号来自队列调度电路。组成队列状态存储器的每个RAM存储器读写端口地址线、数据线宽度不同。读端口地址线有3根,输出数据位宽为32位;写端口,有8根地址线,但写入数据宽度为1位。

(6)队列调度电路,它的输入端和队列状态存储器的输出端口相连,它还输出读存储器需要的地址信号和读信号给队列状态存储器。

(7)队列调度结果FIFO存储器,它是一个先入先出队列存储器,它的输入端和队列调度电路输出端相连,它的读信号来自链表管理电路。

(8)数据包输出电路,它的输入端和数据片存储器接口电路相连。

(9)数据片存储器接口电路,它的输入端和数据片输入电路、链表管理电路、数据片存储器相连。

(10)链表存储器接口电路,它的输入端和链表管理电路,链表存储器输出端相连。

(11)链表管理电路,它的输入端分别和数据片输入电路、链表存储器接口电路、调度结果FIFO相连。

数据片存储器被分成大小相等的2(N+1)个存储块,N一般取不小于8192的自然数,每个存储块可以存储一个数据片,组成每个存储块的存储单元地址是连续的。一个数据包常常由一个以上的数据片组成,这些数据片保存在不同的存储块中,这些存储块在存储器中的位置可以是互不相邻。为了便于管理,来自同一个输入线卡,具有相同优先级的数据包构成一个队列。每个队列占用的存储块采用链表的形式进行管理。所有的链表保存在链表存储器中,每一个链表结点对应数据片存储器的一个存储块,链表结点的存储地址和存储块的序列号一一对应。也就是说如果一个链表结点在链表存储器中的存储地址是n,它就对应数据片存储器的第n个存储块。

作为链表存储器的存储器,每个存储单元的数据宽度由数据片存储器分成的存储块数量,以及数据片的最大长度决定,链表存储器每个存储单元的数据结构如下:

比特位置N+K~N+3N+2N+1N~0说明数据片长度存储单元使用指示信号数据包边界信号下一个链表结点地址

bitN~bit0位保存同一个队列下一个链表节点的地址,因为系统中数据片存储器被划分为2(N+1)个存储块,所以每个存储块的地址为N+1位。如果链表存储器某个单元对应的存储块存有数据片,则这个存储块被使用了,链表存储器相应存储单元的bitN+2位置1,否则,置0。数据包之间的边界信号,用来将数据包和数据包分隔开来。一个队列中拥有一个以上数据包时,为了便于区别,排在链表队列前面的每个数据包的最后一个信元节点的bitN+1位置1,表示这是数据包的最后一个信元节点,但该队列链表后面还有其它数据包的信元。一个数据包由一个或一个以上的数据片组成。

在数据片的链表信息中,存储有数据片的长度信息,存储单元的bitN++K~bitN+3位保存对应数据片的实际长度,长度以4字节为单位,K和数据片的最大值相关,K最大值为8,表示数据片的最大长度可以定义为128字节。

链表存储器保存的链表结点分两种:数据片队列链表结点和空链表结点。

链表管理电路用来管理片外的链表存储器,它由3个组成部分构成:存储器、寄存器、内部逻辑控制,管理最多1024个链表队列。

链表管理电路包含的存储器有:队列含数据片个数存储器length_ram,队列含数据包个数存储器packet_ram,链表队列头地址存储器head_ram,链表队列尾地址存储器tail_ram,以及待发送数据片首地址FIFO存储器。length_ram、packet_ram、head_ram、tail_ram的地址线都为10位,数据宽度都为N+1位。length_ram、packet_ram、head_ram、tail_ram的每个存储单元,对应一个数据包队列。上述除FIFO外的片内存储器都为双端口存储器,一个输入端口,一个输出端口,两个端口的数据宽度和地址宽度一样。它们的作用分别是:

链表头地址存储器:它的各个存储单元存放不同队列的链表头地址,使用该地址可以索引到某个队列的第一个数据片链表结点地址和相应的数据片。

链表尾地址存储器:它的各个存储单元存放不同队列的尾地址,使用该地址可以索引到某个队列的最后一个数据片链表结点地址和相应的数据片。

数据片个数存储器:它的各个存储单元存放不同队列含数据片的个数信息。

数据包个数存储器:它的各个存储单元存放不同队列含数据包的个数信息。

待发送数据片首地址存储器是一个先入先出队列存储器,它的数据宽度为N+1比特,深度为8,存储4个数据后,就会发出快满信号。

链表管理模块包含的寄存器有:空链表头指针寄存器freespace_linkheader,空链表下一个头指针寄存器nextspace_linkheader,空链表尾指针寄存器freespace_linktail,数据片队列头指针寄存器为s_qn_linkheader,数据片队列尾指针寄存器为s_qn_linktail,外存含数据片个数寄存器cell_number。以上每个寄存器的位宽为N+1位。

空链表头指针freespace_linkheader所指存储单元,存储的下一个空链表结点为nextspace_linkheader。一个链表由一个头指针和一个尾指针指定。数据片队列头指针指定当前队列第一个数据包第一个数据片的结点地址,数据片队列尾指针指定当前队列最后一个数据包最后一个数据片的结点地址。

链表管理电路由内部逻辑控制模块来协调数据信息和控制信息的交互。同时对所连数据片存储器接口电路、数据片输入电路、链表存储器接口电路、队列状态存储器,以及调度结果FIFO存储器进行控制信息和数据信息的交互。

队列状态存储器,它指示每个队列是否有完整的数据包,如果某队列含有一个或一个以上完整的数据包,则对应该队列的存储器单元为1;相反,如果某队列不含有一个完整的数据包,对应该队列的存储器单元为0。队列状态存储器由4个结构一样的双端口存储器组成,每个存储器的结构为:一个输入入端口,一个输出端口,输入和输出端口数据宽度和地址宽度不一样。输入端口含1根数据线,8根地址线;输出端口含32根数据线,3根地址线。

队列调度电路由队列加权和更新电路、1024选1数据比较器构成。队列加权和更新电路根据从队列状态存储器读入的队列状态和1024选1数据比较器输入的当前队列调度结果,更新1024个队列的加权和。

1024选1数据比较器,每个时钟周期它接收队列加权和更新电路输出的2个线卡号以及每个线卡的64个优先级队列的加权和,每8个周期得到16个线卡,1024个队列的更新加权和。每8个周期,1024选1数据比较器电路利用得到更新的各个队列加权和,从1024个队列中调度出一个队列。1024选1数据比较器由加权和比较与当前加权和最大的优先级生成电路、16选1数据比较器电路构成,前者由线卡号延时电路、64选1数据比较器电路、线卡加权和最大优先级更新电路组成;后者由含优先级输入的8选1数据比较器和2选1数据比较器构成。64选1数据比较器从一个线卡的当前64个优先级中挑选一个加权和最高的优先级输出,从数据输入到结果输出,64选1数据比较器需要消耗5个时钟周期。线卡号延时电路完成线卡号输出延时作用,以便系统以流水方式工作时,线卡加权和最大优先级更新电路知道当前需要更新的是哪一个线卡的比较结果。

线卡加权和最大优先级更新电路,为16个线卡中的每个线卡保存一个该线卡当前最大加权和以及该最大加权和对应的优先级记录,并将该记录输出给16选1数据比较器电路。每8个时钟周期,线卡加权和最大优先级更新电路将保存的每个线卡的当前最大加权和以及该最大加权和对应的优先级更新一次,以反映最新的变化情况。

16选1数据比较器由2个含优先级输入的8选1数据比较器和一个2选1数据比较器构成。16选1数据比较器从16个线卡中挑选一个加权和最大的优先级,并将挑选的当前加权和最大的线卡的编号和加权和优先级编号组合输出,也就是队列号输出,该结果就是队列调度结果。

含优先级输入的8选1数据比较器和8选1数据比较器略有不同,前者的输入包括不同的8个加权、各个加权的优先级编码,输出为最大加权值、最大加权的优先级编码、8个加权中的哪一个被选中,例如如果输入的8个加权和a1~a8,通过比较得到a1为最大值,则输出pod_data=a1,则pod_ptr[0]为高电平,pod_ptr[7:1]每一位都是低电平。后者的输入只有8个不同的加权,输出为最大加权值、8个加权中的哪一个被选中。含优先级输入的8选1数据比较器由28个16位数据比较器和16个延时器构成,8选1数据比较器由28个16位数据比较器和8个延时器构成。

64选一数据比较器由9个8选一数据比较器构成。一个8选1数据比较器从输入数据到得到比较结果需要2个时钟周期。

构成64选1的8选1数据比较器和16选1数据比较器电路的含优先级输入的8选1数据比较器都包含28个16位数据比较器,一个多路选择器。16位数据比较器有A和B2个16位输入数据,复位RESET是16位数据比较器的复位端,如果A大于或等于B,16位数据比较器的输出AgeB为1,否则为0。16位数据比较器完成2个16位数据的比较需要耗费一个时钟周期。对应8选1数据比较器或含优先级输入的8选1数据比较器,让8个输入数据A8~A1,进行俩俩比较,根据所有的比较结果,可以确定8个输入数据中,哪一个最大。例如:如果A8≥A7,A8≥A6,A8≥A5,A8≥A4,A8≥A3,A8≥A2,A8≥A1都成立,则A8就是最大数,否则,若A7≥A6,A7≥A5,A7≥A4,A7≥A3,A7≥A2,A7≥A1都成立,则A7就是最大数,以此类推,通过28个16位数据比较器和一个多路选择器的配合,可以从8个输入数据中选择到一个最大数据。8选1数据比较器或含优先级输入的8选1数据比较器完成一次运算需要2个时钟周期。

队列加权和更新电路由队列调度结果存储器、队列加权和存储器以及加权计算电路构成。加权计算电路输出读队列状态存储器需要的读地址信号和读信号,同时接收队列状态存储输出的队列状态数据。输出的队列状态数据用0或1表示对应队列是否有完整数据包。

2.它的工作过程为:

(1)系统的初始化

系统上电后,立即对系统进行初始化。初始化要完成的工作有:

复位系统,将FPGA片内存储器length_ram、packet_ram每个存储单元的值都变为0,外存含数据片个数寄存器清0,所有片内FIFO清空。对链表存储器进行初始化,建立一条覆盖片外数据片存储器所有存储块的空链表,链表结点和存储块一一对应,链表结点地址就是对应存储块的序号,实际指明存储块的位置。

建立空链表的方法比较简单,只需要在链表存储器每个存储单元存储比存储单元的地址大1的数,在2(N+1)-1存储单元不写数,就可以了。此外,链表的头指针freespace-linkheader值为0,nextspace_linkheader值为1,freespace_linktail值为2(N+1)-1。这样,就建立了空链表。

(2)数据片的接收与新链表结点的建立

初始化完成后,系统进入正常工作,外部数据片输入到数据片FIFO。如果链表管理电路没有反馈给数据片输入电路数据片存储器快满信号,数据片输入电路就从数据片FIFO中读取数据片。数据片输入电路提取数据片所属队列信息:4位的源端口号(表明数据包来自哪一个线卡),和6位的数据包优先级号;并将数据片的队列信息发送给链表管理电路。

链表结点需要为一个数据片保存的信息有3种:数据包边界信号、缓存块的序列号以及数据片的长度。

链表管理电路每接收到一个数据片,进行链表结点插入操作。每发送一个数据片,进行链表结点删除操作。

数据包队列总是从s_qn_linktail指针所指方向添加一个数据片,从s_qn_linkheader指针所指方向输出一个数据片。

链表管理电路每接收一个新的数据片队列信息,在内部控制逻辑的作用下,对length_ram存储器进行读操作,将相应队列的数据片个数计算器的值s_queue_length读出来,根据读取得到的值,知道该数据片是否是队列的第一个结点。由于新数据片的加入,队列长度增加了一个单位,所以,接下来系统进行s_queue_length加1操作,再写回到length_ram原来的存储单元。

链表管理电路采用freespace-linkheader所指链表存储单元做为新的链表结点,同时将freespace-linkheader值传送给数据片存储器接口电路,数据片存储器将接收的新数据片存储在freespace-linkheader所指存储块中。

因为空链表的头结点已经成为新数据片结点,所以空链表头指针必须指向新的空链表头结点:freespace-linkheader的值更新为nextspace_linkheader。链表管理电路提供给链表存储器接口电路nextspace_linkheader值,后者利用该值做为地址访问链表存储器,读出存储单元数据值,并将该值赋给nextspace_linkheader值。通过以上操作,nextspace_linkheader更新为原来空链表中nextspace_linkheader所指存储单元下一个链表结点地址域指的存储单元的地址值。

如果新结点是队列的第一个节点,则链表接口电路直接将数据片结点信息写入链表存储器,因为该结点是队列的最后一个结点,所以写入的结点信息中下一个链表结点地址域bitN~bit0部分没有实际作用,通常设为0。在将新结点信息写入链表存储器的同时,链表管理电路将新结点地址写入链表尾地址存储器和链表头地址存储器,这样新的结点即是队列的头结点,也是队列的尾结点。当前链表队列的尾指针s_qn_linktail和头指针s_qn_linkheader都指向该结点。

如果新结点不是队列的第一个节点,链表管理电路通过读链表尾地址存储器,得到数据片待加入链表队列尾指针s_qn_linktail,并将它传送给链表存储器接口电路,后者利用s_qn_linktail地址,访问链表存储器,置s_qn_linktail所指存储单元的下一个链表结点地址域为新链表结点的地址。此外,链表接口电路还将新数据片结点信息写入新链表结点对应的链表存储器存储单元,链表管理电路更新链表尾地址存储器,使当前链表队列的尾指针s_qn_linktail指向新加入结点的链表存储地址。

通过上述过程,就完成新结点加入队列的操作。

链表管理电路接收完一个数据包的所有分片后,更新存储器packet_ram相应存储单元的数据包个数值。同时将队列有完整数据包的信息传送给队列状态存储器,使队列状态存储器相应存储单元置1,说明该队列有完整的数据包。队列调度电路通过读队列状态存储器的输出,知道数据片存储器存有完整的待发送数据包,就会将该数据包队列调度出来,经数据包发送电路发送到外界下一级电路。

(3)加权轮询优先级队列调度

整个FPGA的调度分两种:队列级调度和数据片级调度,队列级调度在队列调度电路中完成,数据片级调度在链表管理电路中完成。队列级调度从1024个队列中挑选一个加权和最大的队列,数据片级调度从获得发送资格的队列中,挑选出排在队头的数据包,并将组成该数据包的所有数据片结点从链表中遍历出来。

每个线卡输出端缓存的1024数据包队列,来自16个不同线卡。队列调度电路,将1024个队列按照来自的不同线卡分成16组,每组64个队列,对应64个优先级,同一组内不同优先级的数据包队列来自于同一个线卡。队列调度电路每8时钟周期从1024个队列中调度出一个队列。

每个时钟周期,队列加权更新电路从队列状态存储器得到两个线卡共128个优先级队列的状态信息,知道这128个队列每个队列是否有待发送的完整数据包,同时根据队列加权更新电路内部存储器保存的最近一次1024个队列调度结果,计算出2个线卡128个队列的加权和。计算方法是:优先级n的队列,最初赋加权值为n。例如线卡1的优先级为m的队列,它的加权计算分四种情况:

(a)通过队列调度结果存储器,知道它在最近一次调度中没有被选中,但从队列加权和存储器得到它以前的加权和为W,队列状态存储器输出值表明该队列含有完整未发送的数据包,通过加权计算电路的计算,优先级为m的队列新的加权和应该为W+m。

(b)它在最近一次调度中没有被选中,从队列加权和存储器得到它以前的加权和为W,队列状态存储器输出值表明该队列不含有完整未发送的数据包,通过加权计算电路的计算,优先级为m的队列新的加权和应该为0。

(c)它在最近一次调度中被选中,队列状态存储器输出值表明该队列含有完整未发送的数据包,尽管从队列加权和存储器得到它以前的加权和为W,通过加权计算电路的计算,优先级为m的队列新的加权和应该为m。

(d)它在最近一次调度中被选中,队列状态存储器输出值表明该队列不含有完整未发送的数据包,尽管从队列加权和存储器得到它以前的加权和为W,通过加权计算电路的计算,优先级为m的队列新的加权和应该为0。

队列加权更新电路每个时钟周期能输出2个线卡所有128个队列的加权和数据。每个时钟周期,加权和比较与当前加权和最大的优先级生成电路,对线卡加权和最大的优先级和它的加权和进行更新。例如,如果8个时钟周期之前,线卡1的加权和最大的优先级为n1,通过64选1数据比较器计算,知道当前线卡1的加权和最大的优先级为n2。则线卡加权和最大优先级更新电路就将线卡1的最大加权和优先级更新为n2。16个线卡,完成一次加权和最大的优先级更新,需要8个时钟周期。

如果调度结果FIFO存储器没有给队列调度电路反馈存储器快满信号,则16选1数据比较器进行队列调度工作:每8个时钟周期,16选1比较器电路利用线卡加权和最大优先级更新电路输出的每个线卡最大加权和、最大加权和对应的优先级编码,从16个线卡中挑选一个加权和最大的线卡和优先级,换句话说,就是从1024个队列中挑选出一个队列,做为调度结果输出。当然如果所有1024个队列都没有完整数据包,也会进行同样的运算过程,只是不会成功调度出任何队列。

(4)数据片的发送与链表结点的删除

由于流水线作业的原因,调度结果和队列实际状态存在一个滞后时间,有可能某个队列已经没有完整数据包了,但仍然被队列调度电路调度成功,这时队列调度电路经调度结果FIFO存储器传送过来的调度结果称为虚调度。发生虚调度时,链路管理电路不会进行任何链表遍历操作。链表管理电路只有在待发送数据片首地址FIFO存储器快满信号无效时,才会读调度结果FIFO存储器。

数据链路管理电路每接收到一个调度结果,就读数据包个数存储器packet_ram,查看看该队列是否确实存在未发送的完整数据包。如果对应队列数据包个数不为0,说明该队列确实存在待发送的数据包,该调度不是虚调度,在将数据包个数存储器相应存储单元的数据包个数减1后再写回该存储器。如果减1后,相应存储单元的数据包个数值为0,则使队列状态存储器相应存储单元置0,说明该队列没有别的完整数据包。

链表管理电路在确知接收到的队列级调度结果不是虚调度之后,开始进行数据片级调度,进行链表遍历操作,将排在该队列队头的数据包的所有数据片地址找到。

链表管理电路利用调度得到的队列号,通过链表头地址存储器找到该队列所在链表头地址s_qn_linkheader,开始数据片级调度。由于一个数据包由一个或一个以上的数据片构成,链表管理电路将队列头地址s_qn_linkheader传送给链表存储器接口电路,找到该队列的头结点,并根据该结点的bitN+1、bitN+2可以知道该结点对应的存储块是否存有数据片,该结点是否是当前数据包的最后一个结点。如果不是最后一个结点,就继续进行链表遍历操作。遍历得到的存有数据片的有效链表结点存储地址写入链表管理电路内部的待发送数据片首地址FIFO存储器。如果该存储器快满了,就暂定数据片结点的遍历,直到快满信号无效时,再继续进行数据片链表结点的遍历操作。此外如果在遍历的过程中如果遇上了数据包边界信号有效,说明当前数据包的所有分片,都遍历出来了,于是,当前队列数据片级调度结束。每个遍历出来的数据片结点,因为它们马上就会成为空结点,所以需要依次添加到空链表的尾部。这样就完成了数据片链表结点删除操作。

数据存储器接口电路利用从待发送数据片首地址FIFO存储器得到的地址,依次将组成数据包的每个数据片读出,通过数据包输出电路输出到数据包发送电路。这种数据片输出方式象流水一样,一个紧接一个不间断。

虽然某个数据片结点从包队列链表中删除了,但实际上该结点对应的数据片有可能还在待发送数据片首地址存储器内保存,它对应的存储块还保存着原来的数据片,所以不能立刻存放新接收的数据片。

为了防止这种新接收的数据片冲掉还会发送的数据片情况出现。寄存器Cell_number对外部数据片存储器内保存的数据片进行计数,如果剩余的存储块,只能再容纳16个数据片时,就给数据片输入电路发出数据片存储器快满信号,数据片输入电路此时不再读入新的数据片。这样在数据包队列链表中删除了,但实际上数据片还没有真正输出的存储块就不会被新接收的数据片占用。

链表管理电路每遍历出一个数据片结点,在内部控制逻辑的作用下,对length_ram存储器进行读操作,将对应队列的数据片个数计算器的值s_queue_length读出来,并将该值减1,再写回到length_ram原来的存储单元。

链表管理电路每遍历出一个数据片结点,就更新链表头地址存储器对应的队列存储单元值,使它指向队列新的头结点地址。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号