跳转至

第一阶段:开始实验

学习基础的网络知识

在本节中,实验者需要熟悉 IP 和 ARP 协议的基本内容以及路由器的功能和结构。建议实验者使用 Linux 系统搭建一个网络,用 Linux 自带的转发功能,学会用 tcpdump 和 Wireshark 进行抓包分析,尝试使用 Scapy 进行发包实验。

思考

  1. 路由器一般包含哪些模块?本实验需要实现哪些模块?
  2. 路由器需要转发 ARP 报文吗?
  3. 什么样的 IP 分组需要转发,转发的依据是什么?
  4. 转发 IP 分组时需要修改哪些字段?
  5. 如何知道转发后的出接口和目标 MAC 地址?
  6. 直连路由是什么?

参考实验流程

为了让实验者对于本实验有整体的认识,本节列出了本实验路由器的大致组成部分:

  • 网络接口
    • 由实验框架提供
    • 接口:64 位 AXI-Stream
  • 硬件转发引擎
    • 绝大多数 IP 分组通过转发引擎高效转发(数据平面)
    • 主要模块: 转发逻辑转发表(路由表)ARP 缓存
    • 同时,本实验强烈建议 ARP 协议处理 采用硬件实现
  • CPU
    • 功能请参见 《计算机组成原理》实验 要求
    • 运行在 CPU 上的软件处理 RIP 路由协议 (控制平面)
  • 软硬件接口
    • 软件对转发引擎进行管理和配置(路由管理)
    • 网络硬件接口及驱动程序 :软件收发以太网帧、IP 分组
    • 转发表硬件接口及驱动程序 :软件管理和配置转发表内容

其中, 加粗字体 所标识的内容为实验者需要实现的模块。

本实验的参考流程如下,实验者可以参考这一流程开展实验:

  • 熟悉实验平台、开发环境、实验框架
    • 使用 ILA(Integrated Logic Analyzer,Xilinx FPGA 的片内逻辑分析仪)进行抓包分析
    • 使用 Wireshark 进行抓包分析
    • 实现回环功能(~2 行代码)并进行简单测试
    • 尝试使用 Scapy 构造以太网帧、IP 分组
  • 转发引擎部分
    • 实现转发逻辑(减少 TTL、更新校验和、修改源和目的 MAC 地址)
    • 实现硬连线的转发表(如直连 Direct 路由)
    • 实现 ARP 协议及 ARP 缓存
    • 转发引擎初步调试测试
    • 实现转发表,内容可暂时硬编码,同时为软件预留接口
    • 转发引擎调试测试
  • CPU:按照《计算机组成原理》实验要求完成
  • 软硬件接口:逐一实现并测试
  • 软件 RIP 路由协议实现(移植)及系统调试
  • 联合调试:组内互联互通、组间互联互通
  • 实验评测

请注意,为了内容编排上的方便,本文档可能不完全按照上述流程组织。

现在,让我们开始吧!

学习 AXI-Stream 协议

本实验的框架已经将实验板上 SFP 接口的 PHY 以及 MAC 配置好,PHY/MAC 会通过 AXI-Stream 协议与其余逻辑传输以太网帧。

本实验用到了 AXI-Stream 协议的以下信号:

  • valid:发送方是否需要发送数据
  • ready(可选):接收方是否准备好接收数据
  • data:有效载荷(payload),当前周期传输的数据
  • keep(当 data 宽度大于 8 bits 时出现):在最后一个周期,标识各个字节是否有效
  • last:标识包的边界(如一个以太网帧的结束)
  • id(可选):数据来源(如源网络接口)
  • dest(可选):数据目的地(如目的网络接口)

其中,对每个时钟周期,当握手信号(validready)同时为高时,协议发生一次有效的传输,传输一次有效载荷。这一次传输也称为一“拍”。此外,AXI-Stream 协议规定,ready 信号可以依赖于 valid 信号(如 ready 由一个组合逻辑产生,且该组合逻辑的输入之一为 valid),但是 valid 信号不得依赖于 ready,发送方需要发送数据时,将其置 1 即可。同时,发送方将 valid 置 1 后,在一次有效传输发生完成前,其不得重复将 valid 置 0,这意味着发送方需要等待 ready 变为 1 。

本实验用到的 AXI-Stream 的参数为:

  • 宽度:64 bits
  • 时钟频率:125 MHz
  • 接收接口(RX)使用 id 标识源接口
  • 发送接口(TX)使用 dest 标识目标接口

由于 AXI-Stream 协议较常用,Vivado 开发环境中提供了若干 AXI-Stream 相关 IP 核,统称为 AXI-Stream 基础设施,主要包括如下 IP 核:

  • Data Width Converter:变换 AXI-Stream 的数据宽度
  • Clock Converter:转换 AXI-Stream 的时钟
  • Data FIFO:FIFO 缓冲区,同时也有转换时钟的功能
  • Register Slice:可用来切断关键路径
  • 其他 IP 核请见手册:PG085 AXI4-Stream Infrastructure IP Suite v3.0

对于 AXI-Stream 协议的其他参考资料,实验者亦可参见实验框架提供的模块或互联网上的其他开源代码。

思考

  1. AXI-Stream 的 user 信号在这里代表什么意义?

尝试在实验框架中实现 Loopback

Loopback 的意思是环回。在实验框架中,PHY/MAC 会不断接收以太网帧,实验者需要将这些帧原样发回接收接口。为此,实验者需要简单理解 AXI-Stream 接口的使用方式,包括信号的握手和数据的传输过程。

接下来,实验者需要编写一段小的逻辑,用于交换目标 MAC 地址和源 MAC 地址,然后运行仿真并观察输出来验证其正确性。特别地,对于有用的信号,仿真中不应出现 X 和 Z。仿真通过后,实验者可以生成 bitstream 并下载到实验板上。生成过程中,实验者一定要关注并重视 Critical Warning 和 Timing failed 等信息,若有异常,实验者需要及时进行修复。请注意,在后续的实验过程中,如果出现了此类信息,同样需要重视和修复。下载完成后,实验者可以把网络设备连接到实验板的网络接口上,并使用 Wireshark 抓包。抓包时实验者需要进行观察,如果某个以太网帧出现了两次,并且 MAC 地址发生了交换且其他内容不变,说明实现正确,实验者的代码能正常工作。

如果代码在实验板上工作不正常,实验者需要了解 ILA 的使用方式(可以参见配套演示视频),从 AXI-Stream 的接收端开始检查是否收到正确的以太网帧,然后按照数据流的顺序依次检查到 AXI-Stream 的发送端。这一过程可能会比较繁琐,但实验者一定要耐心学会硬件调试的方法,方便后续实验的开展。

思考

  1. 如何处理 AXI-Stream 在发送时 ready 不连续为高的情况?
  2. Vivado 提供的不同仿真模式有什么区别?
  3. 如何查看 Timing 信息?
  4. 如果出现 WNS 为负数,应该做哪些事情?
  5. 什么样的代码会导致仿真中出现 X 和 Z?

最后更新: 2020年10月19日
作者: Harry Chen (13.39%), Wende Tan (86.61%)