第一阶段:开始实验¶
学习基础的网络知识¶
在本节中,实验者需要熟悉 IPv6(后文简称为 IP)和 ND 协议的基本内容以及路由器的功能和结构。建议实验者使用 Linux 系统搭建一个网络,用 Linux 自带的转发功能,学会用 tcpdump 和 Wireshark 进行抓包分析,尝试使用 Scapy 进行发包实验。
关于 IPv6 的整体描述,请参见 RFC 8200: Internet Protocol, Version 6 (IPv6) Specification。
思考
- 路由器一般包含哪些模块?本实验需要实现哪些模块?
- 路由器需要转发 ND 报文吗?
- 什么样的 IP 分组需要转发,转发的依据是什么?
- 转发 IP 分组时需要修改哪些字段?
- 如何知道转发后的出接口和目标 MAC 地址?
- 直连路由是什么?
参考实验流程¶
为了让实验者对于本实验有整体的认识,本节列出了本实验路由器的大致组成部分:
- 网络接口
- 由实验框架提供
- 接口:64 位 AXI-Stream
- 硬件转发引擎
- 绝大多数 IP 分组通过转发引擎高效转发(数据平面)
- 主要模块: 转发逻辑 、转发表(路由表) 、邻居缓存
- 同时,本实验强烈建议 ND 协议处理 采用硬件实现
- CPU
- 功能请参见 《计算机组成原理》实验 要求
- 运行在 CPU 上的软件处理 RIPng 路由协议 (控制平面)
- 可能需要将 CPU 指令集扩充至 RV32I
- 软硬件接口
- 软件对转发引擎进行管理和配置(路由管理)
- 网络硬件接口及驱动程序 :软件收发以太网帧、IP 分组
- 转发表硬件接口及驱动程序 :软件管理和配置转发表内容
其中, 加粗字体 所标识的内容为实验者需要实现的模块。
本实验的参考流程如下,实验者可以参考这一流程开展实验:
- 熟悉网络配置方法
- 使用一根网线连接两台主机进行组网测试
- 熟悉实验平台、开发环境、实验框架
- 使用 ILA(Integrated Logic Analyzer,Xilinx FPGA 的片内逻辑分析仪)进行抓包分析
- 使用 Wireshark 进行抓包分析
- 实现回环功能(~2 行代码)并进行简单测试
- 尝试使用 Scapy 构造以太网帧、IP 分组
- 转发引擎部分
- 实现转发逻辑(减少 hop limit、修改源和目的 MAC 地址)
- 实现硬连线的转发表(如直连 Direct 路由)
- 实现 ND 协议及邻居缓存
- 转发引擎初步调试测试
- 实现转发表,内容可暂时硬编码,同时为软件预留接口
- 转发引擎调试测试
- CPU:按照《计算机组成原理》实验要求完成,同时可能需要将指令集扩充至 RV32I
- 软硬件接口:逐一实现并测试
- 软件 RIPng 路由协议实现(移植)及系统调试
- 联合调试:组内互联互通、组间互联互通
- 实验评测
请注意,为了内容编排上的方便,本文档可能不完全按照上述流程组织。
现在,让我们开始吧!
学习 AXI-Stream 协议¶
本实验的框架已经将实验板上 SFP 接口的 PHY 以及 MAC 配置好,PHY/MAC 会通过 AXI-Stream 协议与其余逻辑传输以太网帧。
本实验用到了 AXI-Stream 协议的以下信号:
valid
:发送方是否需要发送数据ready
(可选):接收方是否准备好接收数据data
:有效载荷(payload),当前周期传输的数据keep
(当data
宽度大于 8 bits 时出现):在最后一拍,标识各个字节是否有效user
(可选):用户(如 SFP 接口的 IP 核)自定义的带外元数据last
:标识包的边界(如一个以太网帧的结束)id
(可选):数据来源(如源网络接口)dest
(可选):数据目的地(如目的网络接口)
其中,对每个时钟周期,当握手信号(valid
和 ready
)同时为高时,协议发生一次有效的传输,传输一次有效载荷。这一次传输也称为一“拍”。此外,AXI-Stream 协议规定,ready
信号可以依赖于 valid
信号(如 ready
由一个组合逻辑产生,且该组合逻辑的输入之一为 valid
),但是 valid
信号不得依赖于 ready
,发送方需要发送数据时,将其置 1 即可。同时,发送方将 valid
置 1 后,在一次有效传输发生完成前,其不得重复将 valid
置 0,这意味着发送方需要保持 valid
不变,并等待直到 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 协议的其他参考资料,实验者亦可参见实验框架提供的模块或互联网上的其他开源代码。
思考
- 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 的发送端。这一过程可能会比较繁琐,但实验者一定要耐心学会硬件调试的方法,方便后续实验的开展。
思考
- 如何处理 AXI-Stream 在发送时
ready
不连续为高的情况? - Vivado 提供的不同仿真模式有什么区别?
- 如何查看 Timing 信息?
- 如果出现 WNS 为负数,应该做哪些事情?
- 什么样的代码会导致仿真中出现 X 和 Z?