P4->NetFPGA 实战——Switch Calculator

P4->NetFPGA 实战——Switch Calculator

0.前言

源链接:https://github.com/NetFPGA/P4-NetFPGA-public/wiki/Tutorial-Assignments

1.Switch Calculator功能简介

这是一个简单的教程,演示了P4-> NetFPGA工作流程的许多基本功能。 在这个任务中,您将编写一个P4程序,将NetFPGA SUME开关配置为一个简单的计算器和键值存储。

支持的操作:

  • ADD - 两个数相加返回结果
  • SUBTRACT - 两个数相减返回结果
  • ADD_REG - 把寄存器里面的值加一个操作数,然后在返回结果
  • SET_REG - 设置交换机寄存器里面的值
  • LOOKUP - 在交换机的表中查找给定的key并返回结果

为了要求交换机执行这些操作之一,客户机将在以太网层之上发送一个包含以下头的数据包:

header Calc_h {
    bit<32> op1;
    bit<8> opCode;
    bit<32> op2;
    bit<32> result;
}

op1和op2分别是第一个和第二个操作数,opCode指示执行5个支持的操作中的哪一个,并且在执行所需的计算之后由交换机设置结果字段。 在将最终数据包发送回客户端之前,交换机还应该交换收到的数据包的源MAC地址和目的MAC地址。

总之,交换机将执行以下任务:

  • 从客户端接收和解析数据包
  • 交换源和目标MAC地址
  • 检查opCode字段以确定要执行的相应操作
  • 必要时设置结果字段
  • 构建最终数据包并将其发送回客户端

下图显示了如何使用操作数和寄存器来执行各种功能:

switch_calc_ops.png

2.What to do

要完成此任务,您需要执行以下操作:

1)修改 $SUME_FOLDER/tools/settings.sh以确保P4_PROJECT_NAME环境变量设置为switch_calc。 运行​ source settings.sh


2)完成switch_calc.p4 - 在$ P4_PROJECT_DIR / src / switch_calc.p4中为您提供了一个骨架P4程序。 TopParser和TopDeparser已经完成。 TopPipe(即匹配行为管道)具有定义的所有必要的表和动作。 你的工作是填写控制流程来实现switch_calc程序。 请注意,同一目录下的commands.txt文件填充lookup_table中的条目。

PS:里面已经有一个已经写好的switch_calc_solution.p4,想要直接跑的话,可以直接把内容复制到switch_calc.p4


3)查看gen_testdata.py - 这是生成测试数据(即应用/预期的数据包和元数据)的python脚本,用于验证功能的模拟。 该文件位于$ P4_PROJECT_DIR / testdata /中。

PS:这一步基本没什么用,笔者直接跳过了,只是检查。


4)运行P4-SDNet编译器生成最终的HDL和初始仿真框架:

$ cd $P4_PROJECT_DIR && make

PS:这一步也是让笔者发现了,不需要使用以下两句命令的原因。

$ git pull --tags

$ git checkout v1.1.0


5)运行SDNet模拟:

$ cd $P4_PROJECT_DIR/nf_sume_sdnet_ip/SimpleSumeSwitch

$ ./vivado_sim.bash

PS:运行测试,即用Vivado对生成Verilog代码进行仿真


6)生成可在NetFPGA SUME模拟中使用的来配置表条目的脚本。

$ cd $P4_PROJECT_DIR && make config_writes


7)在包装模块中包装SDNet输出并作为SUME库核心进行安装:

$ cd $P4_PROJECT_DIR && make uninstall_sdnet && make install_sdnet


8)设置SUME模拟。 $ NF_DESIGN_DIR / test / sim_switch_default目录包含一个run.py脚本,负责运行一个SUME模拟,检查出来。 您会看到它读取由gen_testdata.py脚本生成的测试数据包,并将数据包应用于SUME接口。 我们所需要做的就是通过运行make将步骤6中生成的config_writes.py脚本复制到该目录中。

$ cd $NF_DESIGN_DIR/test/sim_switch_default && make


9)运行SUME模拟。 以下命令启动SUME模拟并调用$ NF_DESIGN_DIR / test / sim_switch_default /目录中的run.py脚本:

$ cd $SUME_FOLDER

$ ./tools/scripts/nf_test.py sim --major switch --minor default


10)编译比特流:

$ cd $NF_DESIGN_DIR && make

PS:

  • 这步也是让我发现我license没配置对的原因,因为提示没有配置license,可查看关于SDNet Float License的导入
  • 编译历程差不多要一个半小时,是的没有错,真的很恶心!如果你编译时间很快的话,有一个原因是因为Vivado的license有没有导入,可通过$ vivado $NF_DESIGN_DIR/hw/project/simple_sume_switch.xpr打开工程看提示什么错误,如果是提示license原因可以在导入一次Vivado的license

11)将比特流文件和config_writes.sh脚本复制到$ NF_DESIGN_DIR / bitfiles目录中

$ cd $NF_DESIGN_DIR/bitfiles

$ cp ../hw/project/simple_sume_switch.runs/impl_1/top.bit ./ && mv top.bit ${P4_PROJECT_NAME}.bit

$ cp $P4_PROJECT_DIR/testdata/config_writes.sh ./


12)移动到硬件测试机器并编程FPGA。

$ cd $NF_DESIGN_DIR/bitfiles

$ sudo bash

# bash program_switch.sh

PS:源链接是给出了服务器的配置方法,我们在本机的话,只需执行以上。如果失败提示没有找到nf0-nf3这些设备的话,重启在尝试一次即可。


13)最后一步!!!在真实硬件上测试设计!

$ P4_PROJECT_DIR / sw / CLI目录并运行P4_SWITCH_CLI.py脚本。 这启动了一个交互式命令行界面,您可以使用该界面与您的交换机进行交互(例如,读取/写入寄存器,添加/删除表条目等)。 输入help以查看可用命令的列表。

PS:以上这一步,有一个小坑,在$ P4_PROJECT_DIR / sw / CLI目录下需要将文件seed的权限改为777

转到$ P4_PROJECT_DIR / sw / hw_test_tool目录并运行​$ sudo bash,然后运行switch_calc_tester.py脚本。 这将启动一个命令行工具,您可以使用该工具将数据包提交到交换机并查看其响应。 键入help run_test以查看如何使用该命令。

PS:这一步需要手动改坑,需要将switch_calc_tester.pyIFACE = "eth1"改为IFACE = "nf0" (可以是0-3的任意一个)

尝试添加两个数字 testing> run_test 2 + 3,看看你得到什么。 也可以尝试从命令行设置一个常量寄存器条目,然后提交一个ADD_REG包。 或者提交一个SET_REG包,并从命令行读取值。 或者在lookup_table中添加一个新条目,并提交一个LOOKUP数据包以获得结果。

下面是结果反馈截图:

致此该实验结束!

posted @ 2017-11-23 20:50  考拉小无  阅读(1641)  评论(0)    收藏  举报