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字段以确定要执行的相应操作
- 必要时设置结果字段
- 构建最终数据包并将其发送回客户端
下图显示了如何使用操作数和寄存器来执行各种功能:

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.py的IFACE = "eth1"改为IFACE = "nf0" (可以是0-3的任意一个)
尝试添加两个数字 testing> run_test 2 + 3,看看你得到什么。 也可以尝试从命令行设置一个常量寄存器条目,然后提交一个ADD_REG包。 或者提交一个SET_REG包,并从命令行读取值。 或者在lookup_table中添加一个新条目,并提交一个LOOKUP数据包以获得结果。
下面是结果反馈截图:

浙公网安备 33010602011771号