LvNA是国内一个基于Rocket Chip的RISC-V核项目, 为处理器设计和开发提供方便的仿真和上板支持, 跳转链接. 本文将介绍如何在FPGA zcu102上复现LvNA项目, 前半部分是上板步骤, 后面列举了复现时本人遇到的问题, 希望帮助后来的同学缩短调试时间. 文章基于官方提供的上板指导, 和另一位同学的复现指南. 但因为本人的使用环境和已有的两份指导不完全一致, 直接照搬官方指导无法上板, 造成了一些困惑和麻烦, 因此有必要记录本人的详细环境, 遇到的问题和解决办法, 仅供参考.
本文和已有指南的区别及简单原因
官方指南系统性描述了上板步骤, 但是在fpga/boot/README.md里的步骤里, 由用户下载并编译ATF, FSBL和u-boot, 可能因为嵌入的脚本和最新的板子型号对不上, 经测试无法成功上板, 会出现Flash型号识别失败SF: unrecognized JEDEC id bytes
, 详细见常见问题#1. 所以本文采用了Xilinx更推荐的PetaLinux对boot镜像和Linux进行编译和打包, 以避免脚本无法对应的问题.
尤同学的复现指南和本文在环境上有一些区别: 1) 前人复现指南的部分命令基于WSL, 本文的工作机器为Linux环境, 上板串口连接mac机器. 不同的环境并不会造成很大区别. 2) 前人复现指南没有将bitstream放入FSBL, 需要手动加载, 本文使用PetaLinux自动打包后可以直接进入Linux环境. 3) 另外, 本文尽可能沿用了LvNA官方的prm-sw仓库进行RISCV subsystem通信.
环境说明
平台和软件
- LvNA项目commit最新版: (Labeled-RISC-V) f6895ab. (prm-sw) 0f655a9.
- Xilinx Vivado 2019.1
- Xilinx PetaLinux 2019.2 (经测试, 2019.1的PetaLinux无法编译上板, 请查看常见问题#2)
- zcu102 BSP v2019.2
- 工作环境 Ubuntu 18.04 (运行LvNA仿真, Vivado综合, PetaLinux编译)
- 串口调试环境 macOS Monterey 12.5.1
硬件
- FPGA zcu102开发版, rev1.1
步骤
1. 确认LvNA仿真和综合复现成功
请按照LvNA官方README操作, 执行到Run with FPGA结束, 成功生成bitstream, 路径在fpga/board/zcu102/build/<yourname>-zcu102/<yourname>-zcu102.runs/impl_1/system_top.bit
, 后文称<path-to-bitstream>
.
2. SD Card文件准备
请使用本文步骤代替官方boot/README.md.
激活PetaLinux环境,确认没有再要求安装更多的包.
source <path-to-petalinux>/settings.sh
使用PetaLinux创建一个新的boot工程:
petalinux-create -t project -n <yourname> -s <path-to-zcu102-bsp>/xilinx-zcu102-v2019.2-final.bsp
进入Vivado, 生成硬件描述文件: File -> Export -> Export Hardware… 无需勾选Include bitstream. 对于2019.1版本, 生成的文件路径<yourname>-zcu102.sdk/system_top.hdf
. 对于2019.2版本, 生成的文件为XSA, 请按照此部分转换为hdf.
进入工程目录, 导入hdf配置:
cd <yourname>
petalinux-config --get-hw-description=<yourname>-zcu102.sdk/
注意只需要精确到sdk所在目录的路径.
配置过程中会弹出选项, 请按照如下配置:
- select Image Packaging Configuration -> Root filesystem type (EXT (SD/eMMC/QSPI/SATA/USB))
- unchosen Image Packaging Configuration -> Copy final images to tftpboot
配置linux kernel:
petalinux-config -c kernel
配置过程中会弹出选项, 请按照如下配置:
- unchose General setup -> Initial RAM filesystem and RAM disk (initramfs/initrd) support
- unchose Kernel hacking -> Filter access to /dev/mem
导入PS端LvNA额外的device tree blob配置:
1 | cat project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi |
编译Linux kernel:
petalinux-build
打包BOOT.BIN:
petalinux-package --boot --format BIN --fsbl images/linux/zynqmp_fsbl.elf --u-boot --fpga <path-to-bitstream>
将images/linux目录下的BOOT.BIN
和image.ub
拷贝到SD卡的第一个分区.
3. 准备SD卡第二个分区
这部分请参考官方指导.
请注意本文在qemu-debootstrap
指令时遇到segmentation fault, 需切换到非最新版debian, 例如:
sudo qemu-debootstrap --arch arm64 buster /mnt http://ftp.debian.org/debian
4. 串口调试 (PS boot)
确保SD卡已经按照上述步骤准备好:
- 分区1 (mmcblk0p1或sdb1或其他名字), FAT文件系统, 包含BOOT.BIN和image.ub.
- 分区2 (mmcblk0p2或sdb2或其他名字), EXT4文件系统, 包含debian rootfs.
插入SD卡, 调整FPGA板到boot mode, 参考. 或者从官方指导Set your board to SD boot mode这里继续.
准备串口连接的驱动:
https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
连接USB线从FPGA J83口到macOS, 通过ls /dev/tty.*
查看串口设备名, 例如/dev/tty.SLAB_USBtoUART
. 一共有四个设备, 出现boot log的设备名随机. 本人设备表为
1 | ls /dev/tty.SLAB_USBtoUART* |
串口的波特率为115200. mac端访问方式如下:
- minicom:
minicom -D /dev/tty.SLAB_USBtoUART
- screen:
screen /dev/tty.SLAB_USBtoUART 115200
- (收费) Serial 2: https://www.decisivetactics.com/products/serial/. 软件自带串口驱动, 如果mac驱动安装失败可以尝试.
请确保按照官方指导, 可以访问PS部分的debian Linux, 正确的boot log串口输出如下:
1 | Xilinx Zynq MP First Stage Boot Loader |
PS端账号名和密码均为root.
请确保PS端使用SD卡第二分区的文件系统, 而非initramfs. 只有前者可以在SD卡上保存文件更改.
5. 串口调试 (PL boot)
请提前准备prm-sw代码, 放到debian分区的/home/root
目录下.
prm-sw有一处dtb内容需修改, 补充以下内容, 完整文件请参考(https://github.com/Gallium70/labeled-RISC-V-boot/blob/main/zcu102.dts)
1 | serial@60000000 { |
常见问题
1. 按照官方LvNA boot教程 PS boot提示Flash型号识别失败SF: unrecognized JEDEC id bytes
请按照本文使用PetaLinux生成BOOT.BIN文件.
2. 使用PetaLinux生成的BOOT.BIN, boot log卡在FSBL两行.
请检查PetaLinux和bsp版本, 使用2019.2
3. PetaLinux使用提示ERROR: Failed to generate meta-plnx-generated layer
详细的错误报告在build/config.log
中, 请检查是否缺少依赖.
如果不是依赖缺失, 可以尝试换用python2.0环境. 使用virtualenv
创建python2.0环境, 并使用source
命令进入环境再执行petalinux命令.
4. PL启动时提示init_mmap failed
请确保petalinux-config -c kernel
配置时去掉勾选Filter access to /dev/mem
.
5. riscv-linux fpga_defconfig
编译失败
可以移除initramfs.txt里不需要的库, 比如zlib, redis, …
profile直接sudo copy进来,改chmod 755.
6. PL boot时找不到串口端口/dev/ttyUL1
.
petalinux-config
配置时确保没有勾选 DTG settings ->Remove PL from devicetree
.
7. PL boot log在SMP部分挂住
请检查LvNAConfig.scala里的core数量要和PL dtb里的一致.
更多问题, 欢迎讨论.