搭建P4C与P4FPGA联合编译环境

一、简介

在2016 SIGCOMM大会上HanW发表了一篇名为《P4FPGA: High Level Synthesis for Networking》的论文,该论文实现了一个从P4语言到Bluespec的编译器。这个P4FPGA的工作发表在会议第一天的NetPL workshop上,P4语言与FPGA的结合引起了工业界的重视。因此,本文将分享搭建P4C与P4FPGA联合编译环境的经验。

二、编译流程解析

最新更新的P4C支持P4_14和P4_16两个版本,首先将P4_14和P4_16编写的P4源程序转换成通用的中间表示IR,然后经过前端编译器生成为通用的后端中间表示IR,最后经过不同的后端编译器生成特定目标平台的代码。具体流程如图所示:

其中,P4C源码中包含3个后端编译器原型:eBPF、BMv2和p4test。eBPF能够生成可以扩展Berkeley数据包过滤程序的C代码;BMv2能够生成可以用BMv2进行简单的网络交换仿真的JSON文件;p4test是一个测试用的后端编译器。以及可以编写或定制其他任意的目标平台的后端编译器。

三、基本环境配置

系统:Ubuntu 16.04、Ubuntu14.04(以下均在root用户下操作)
(1)需要安装boost库
在P4FPGA的makefile文件中有使用到boost库,如果缺少boost库编译时会报如下错误信息:

(2)boost中用到了其他函数库,因此需要先安装依赖库。

(3)上述函数库装好之后,就可以编译boost库了。boost下载链接: https://sourceforge.net/projects/boost/files/boost/1.63.0/boost_1_63_0.tar.gz/download解压boost_1_63_0.tar.gz到/home/目录下,执行以下操作:

编译完成后,进行安装,也就是将头文件和生成的库。

安装结束后在/usr/local/lib和/usr/local/include目录下生成相应库文件和头文件。
(4)测试boost库是否安装成功
可参考:http://blog.csdn.net/yhrun/article/details/8099630
重要提示:编译成功后运行执行时,如果出现以下信息
error while loading shared libraries: libboost_system.so.1.63.0: cannot open shared object file: No such file or directory
是因为系统在当前注册的搜索路径中找不到所需的共享库。
执行以下操作(或在/etc/profile文件添加):

四、搭建P4C与P4FPGA联合编译环境

(1)下载P4C与P4FPGA源码

(2)关键一:建立p4c与p4fpga
打开p4c源码目录预编译:

运行完后在p4c目录下会生成build和extensions文件夹。
建立一个软连接:

(注:在源码README.md中为ln -s extensions/c++ /c++,笔者在 最新的源码目录中并未找到c++目录,因此认为是作者未及时更新导致)
(3)关键二:需要修改p4fpga中的源文件
文件一:/home/p4fpga/compiler/src/p4-fpga.cpp
编译报错信息:

说明:笔者认为是由于p4fpga没有随着p4c的版本更新进行维护导致,在与options 相关源码中并为找到verbosity这个成员,因此这里仅做简单注释处理。

将p4-fpga.cpp 中110行和111行注释:

文件二:/home/p4fpga/compiler/src/midend.cpp
编译报错信息:

说明:midend.cpp中第62行没有对应的构造函数UniqueParameters(&refMap),查看 P4C中的相关源码文件,其构造函数为UniqueParameters(&refMap, &typeMap),因此 修改如下:

文件三:/home/p4fpga/compiler/src/profile.cpp
编译报错信息:

说明:在profile.cpp 第17和18行没有成员函数,在P4C相关源码中,IR类并没有 TableProperty成员函数,笔者认为是与之相关的Property成员函数,因此修改如下:

(3)重新编译

编译成功后会在build目录下生成四个不同后端的P4联合编译器:

执行make check –j8结果如下:(由于笔者未安装bmv2环境因此,有一个FAIL)

至此P4C与P4FPGA联合编译环境环境搭建完成。

五、结语

以上是P4C和P4FPGA的联合编译环境的配置,希望能给他人提供帮助,同时也欢迎大家多多进行指正和交流。
参考文献:《P4FPGA: High Level Synthesis for Networking》

作者简介:彭建云,福州大学数学与计算机科学学院2015级软件工程研究生 ,研究方向:P4、SDN数据平面可编程。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。
  • 本文链接http://www.sdnlab.com/18366.html
分享到:
相关文章
4条评论

登录后才可以评论

  1. comment reply 彭建云 2017/01/09 14:04
    对于文件三的修改具体如下: // if (p->is<IR:: TableProperty>()) { // auto pp = p->to<IR:: TableProperty>(); if (p->is<IR::Property>()) { auto pp = p->to<IR::Property>(); (PS:由于小编的疏忽,没有复制完整!)
        1楼
  2. comment reply wyhlr123 2017/01/09 18:23
    步骤很明确,对报错信息的解读和分析也很到位,受教了!
        2楼
  3. comment reply xuwupiaomiao 2017/01/09 18:53
    你好,希望能继续更新后续的工作。
        3楼
  4. comment reply chenchen 2017/02/13 10:11
    楼主的讲解很透彻,很好。这篇参考文献我也看过,但讲述的很简洁。目前正在作这方面的毕设,对如何将使用P4实现硬件交换机数据平面感到很茫然。实验室有zynq7000 FPGA开发板,正无从下手,希望楼主能继续更新。另外,楼主能留个联系方式吗,求教。
        4楼
彭建云 发表于17-01-09
4