微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > FPGA和CPLD > Vivado HLS推动协议处理系统蓬勃发展(下)

Vivado HLS推动协议处理系统蓬勃发展(下)

时间:10-30 来源:互联网 点击:
6 抽取字段和重新对齐字段
  在包处理中,抽取字段和重新对齐字段是最基本的操作之一。由于数据包一般是经过多个时钟周期内通过总线到达模块的,常见的情况是需要的字段要么在它们抵达的数据字中未能对齐,要么分散在多个数据字中(往往两种情况都有)。因此要处理这些字段,必须将它们从数据流中抽取出来,存入缓存然后重新对齐以便处理。
  例5:源MAC地址抽取示例
  1 if (!inData.empty()) {
  2 inData.read(currWord);
  3 switch(wordCount) {
  4 case 0:
  5 MAC_DST = currWord.data.range(47, 0);
  6 MAC_SRC.range(15, 0) = currWord.data.
  range(63, 48);
  7 break;
  8 case 1:
  9 MAC_SRC.range(47 ,16) = currWord.
  data.range(31, 0);
  10 break;
  11 case 2:
  12 ……
  例5是一个非常简单的字段抽取和再对齐示例。这个示例从以太网报头中抽取源MAC地址。数据通过称为“inData”的64位流抵达。在每个时钟周期读入数据(第2行)。随后根据读取的数据字执行合适的语句。因此在第5行中源MAC地址的头16位被抽取出来,并移位到MAC_SRC变量的起始部分。在下一时钟周期中,MAC地址的其余32位抵达总线,然后存入MAC_SRC变量的32位更高位中。
                               
                  7 用多级层级创建系统
  上文讨论了如何使用Vivado HLS实现简单的三级流水线。但是一般的包处理系统可能会包含分布在层级结构中多个层面的多个模块。图2即是这种系统的示例。在本例中,层级结构的第一层由两个模块组成,每个模块下面包括三个子模块。这个示例中的顶层模块与前面介绍的简单系统中顶层模块相似。但包含有三个子模块的较低层模块使用INLINE编译指令来解析函数,将其子模块推送到顶层,如例6所示。
  例6:Vivado HLS中的中间模块
  1 void module2 (stream  &inData,
  stream&outData) {
  2 #pragma HLS INLINE
  3
  4 ………
  因此在Vivado HLS完成综合后,系统基本如图3所示。这样Vivado HLS就能正确地根据这些模块创建数据流架构,完成模块的流水线化,然后同步执行。在嵌入该函数后,各模块和信号保持原来的名称不变。


  8 使用高级语言结构
  高层次综合的主要优势之一在于可以使用高级语言结构来表达复杂对象,与传统RTL设计相比,显著提高了抽象水平。下面的例子是描述一个小型查找表。
  例7中的代码用于内容可寻址存储器(CAM)类定义,它使用类对象创建一个表,供存储和恢复上述原型系统的ARP数据。该类有一个私有成员,这个私有成员是一个由“noOfArpTableEntries”条“arpTableEntry”类型记录组成的阵列。这种类型属于一种数据结构,包括MAC地址、对应的IP地址和用于说明该条记录是否包含有效数据的一个数位。
  例7:CAM类定义
  1 class cam {
  2 private:
  3 arpTableEntry filterEntries[noOfArpTableEntries];
  4 public:
  5 cam();
  6 bool write(arpTableEntry writeEntry);
  7 bool clear(ap_uint clearAddress);
  8 arpTableEntry compare(ap_uint
  searchAddress);
  9 };
  这个类也包括四种在这个表上运算方法(其中一个是构造器)。其中的一个,即比较法,用于实现真正的查找功能。本例通过提供IP地址来返回相应的MAC地址。处理的方法是使用“for”循环查找表中的每一条记录,搜索有相同IP地址的有效记录。然后完整地返回这条记录。如果没有找到,就返回无效记录。为让设计实现II=1的目标,必须完全展开这个循环。
  例8:用于CAM类的比较法
  1 arpTableEntry cam::compare(ap_uint searchAddress)
  {
  2 for (uint8_t i=0; i
  3 if (this->filterEntries.valid == 1 &&
  searchAddress == this->filterEntries.ipAddress)
  4 return this->filterEntries;
  5 }
  6 arpTableEntry temp = {0, 0, 0};
  7 return temp;
  8 }
  上述经验和示例明确说明,用户可以使用Vivado HLS充分发挥高级编程结构的作用,用类似软件的方法描述包处理系统。采用RTL是难以实现的。
  9 10GBps速率下的协议处理
  与传统RTL相比,Vivado HLS可使用C/C++在FPGA上迅速方便地实现协议处理设计,充分发挥高级语言带来的效率提升优势。另外还具有下列优点:使用C函数轻松完成系统构建;数据通过流交换,提供类似FIFO的标准化接口;灵活的流控制和HLS编译指令,便于使用该工具实现需要的架构。借助这些功能,用户无需重写源代码就能够迅速判研多种不同设计方案的利弊。
  出于解释这类设计的基本概念的目的,上文讨论了一种能够应答ping和ARP请求,解析IP地址查询的简单ARP服务器。结果证明用Vivado HLS设计的模块能够以10Gbp乃至更高的线速完成协议处理。
                               
               

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top