1.简介在2016年的SIGCOMM大会上,HanW发表了一篇名为《P4FPGA: High Level Synthesis for Networking》的论文,实现了从P4语言到Bluespec的编译器。这个P4FPGA的工作是在会议第一天发表在NetPLworkshop上的。P4语言与FPGA的结合引起了业界的关注。因此,本文将分享搭建P4C和P4FPGA联合编译环境的经验。2.编译过程分析***更新后的P4C支持P4_14和P4_16两个版本。首先将P4_14和P4_16编写的P4源程序转换成通用的中间表示IR,再由前端编译器IR生成通用的后端中间表示,***通过生成特定目标平台的代码不同的后端编译器。具体流程如图:其中,P4C源码包含3个后端编译器原型:eBPF、BMv2和p4test。eBPF可以生成可以扩展Berkeley数据过滤程序的C代码;BMv2可以生成JSON文件,可以用来和BMv2进行简单的网络交换模拟;p4test是用于测试的后端编译器。以及其他任意目标平台的后端编译器都可以编写或定制。3、基本环境配置系统:Ubuntu16.04、Ubuntu14.04(以下均在root用户下操作)(1)需要安装boost库。boost库用在P4FPGA的makefile中。如果缺少boost库,编译时会报如下错误信息:/usr/bin/ld:cannotfind-lboost_system/usr/bin/ld:cannotfind-lboost_filesystem(2)boost中使用了其他函数库,so首先需要安装依赖库。apt-getinstallmpi-default-dev#安装mpi库apt-getinstalllibicu-dev #支持正则表达式的UNICODE字符集apt-getinstallpython-dev #需要Python#如果编译有错误:bzlib.h:Nosuchfileordirectoryapt-getinstalllibbz2-dev#如果以上库安装失败,可以尝试更新后再安装。sudoapt-getupdate(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/目录下,执行以下操作:cd/home/boost_1_63_0/./bootstrap.sh#运行bootstrap.sh脚本编译完成后安装,即头文件和生成的库。./b2install#安装boost库安装完成后会在/usr/local/lib和/usr/local/include目录下生成相应的库文件和头文件。(4)测试boost库是否安装成功,参考:http://blog.csdn.net/yhrun/article/details/8099630重要提示:编译成功后运行执行时,如果出现如下信息errorwhileloadingsharedlibraries:libboost_system.so.1.63.0:cannotopensharedobjectfile:Nosuchfileordirectory因为系统在当前注册的搜索路径中找不到需要的共享库。执行如下操作(或在/etc/profile文件中添加):exportLD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib:/usr/local/include4、搭建P4C和P4FPGA联合编译环境(一)下载P4C和P4FPGA源码cd/home/gitclonehttps://github.com/p4lang/p4c.gitclonehttps://github.com/hanw/p4fpga.git(2)关键一:建立p4c和p4fpga打开p4c源码目录Precompile:Javacdp4c./bootstrap.sh运行后,会在p4c目录下生成build和extensions文件夹。创建软链接:ln-s/home/p4fpga/compiler/home/p4c/extensions/c++(注:源码README.md中是ln-sextensions/c++/c++,作者在***sourcecodedirectory没有找到c++目录,所以认为作者没有及时更新)(3)关键二:需要修改p4fpga中的源文件文件一:/home/p4fpga/compiler/src/p4-fpga.cpp编译错误信息:../extensions/c++/src/p4-fpga.cpp:110:17:error:nomembernamed'verbosity'in'FPGAOptions'if(options.verbosity>0)解释:作者认为p4fpga没有随版本更新p4c由于维护,源码中没有找到options相关的verbosity成员,所以这里只做简单的注释处理。p4-fpga.cpp中的注释行110和111://if(options.verbosity>0)//std::cerr<<"Done."<
