乐于分享
好东西不私藏

AI for IC设计实践 :将FPGA环境从Xilinx迁移到Gowin

AI for IC设计实践 :将FPGA环境从Xilinx迁移到Gowin

Sophon是一个紧凑型RISC-V系统,支持RV32I(E)指令集以及一个可以在单周期交换32个通用寄存器堆数据的自定义指令接口。

Sophon面向实时控制应用进行优化,指令延迟、GPIO访问延迟、中断控制延迟(CLIC shv模式)均为1个时钟周期。

当前正在进行第二个版本的重构、优化以及验证增强,完成后RISC-V内核将单独剥离出来并合入到ODL开源仓库。

Sophon初始版本的FPGA验证环境是Xilinx平台(Genesys2/Arty-A7),手工搭建环境花费了不少时间。
这次借助AI的东风将环境迁移到国产FPGA平台(Mac OS开发环境、高云工具链),使用低成本的Sipeed Tang Nano 9K FPGA开发版(8640 LUT4,¥89)。
整个迁移过程分为三个阶段:

第一阶段:搭建Gowin FPGA Flow

本阶段的目标只有一个:最大程度利用AI的自动化能力,把Mac OS下的Gowin FPGA Flow搭建起来。
原始xilinx环境放在fpga目录下,如果直接让AI修改这个目录下的文件来支持Gowin流程,很有可能在改动过程中污染、损坏了原来的环境,因此让AI新建一个fpga/gaoyun目录,后续所有环境搭建都在这个目录下进行。
为了完成这个任务,AI需要自行获取三类信息:
一、Sophon的设计信息
  • 配置信息
  • RTL 文件列表
  • 层次结构
  • 创建FPGA顶层文件
二、Tang Nano 9K开发版的信息
  • FPGA型号
  • 时钟、复位引脚
  • 时钟频率
  • uart引脚映射
  • LED引脚映射
  • GPIO引脚映射
  • 创建约束文件
三、Gowin工具链的使用
  • 创建工程
  • 执行综合、布局布线流程
  • 生成 bitstream
通过分析本地代码库文件、检索工具链版本、联网获取信息等手段,AI顺利获取到上述所有信息并完成Gowin FPGA环境的搭建,生成bitstream。
作为第一次使用Gowin FPGA的工程师,我甚至不需要阅读开发版、工具链的文档,就可以通过AI创建出来一个可执行的FPGA环境。中间遇到有疑问的地方,或者不知道怎么使用工具的地方,跟AI对话就可以解决。
生成bitstream是一个分界点,虽然此时功能还不正确,但是它把Sophon设计移植到了Gowin平台,让后续的调试有了一个起点。

第二阶段:问题定位 - 从 bootrom 到 hello world

第一阶段的bitstream烧写到FPGA开发版之后,如预期一样,跑不起来。
定位问题时,由于AI没有直接操作FPGA开发版的能力,因此需要更多的人工干预,工作模式变成了:人工将bitstream下载到FPGA开发版并观察输出,结果反馈给AI,由AI进行代码的分析以及修改。
一个有代表性的问题就是:复位启动后程序挂死,串口没有输出。
为了定位这个问题,需要先分析Sophon的启动链路:
  1. 复位撤离后内核从bootrom启动
  2. 等待用户从UART使用xmodem协议将指令下载到ITCM
  3. 等待用户从UART使用xmodem协议将数据下载到DTCM
  4. 跳转到 ITCM 执行应用程序
  5. 经过crt.S -> syscalls.c跳转到main函数入口。
中间每一个步骤出错都有可能造成用户代码执行失败,比如:
  • bootrom 启动出错
  • 硬件从bootrom跳转到ITCM的取指令逻辑、时序出错
  • UART 下载出错
  • crt.S 初始化挂死
  • 堆栈溢出
AI通过分析RTL代码和软件代码,准确的识别到这一链路上所有可能造成启动失败的位置,并采用打印调试的方式来定位问题:每运行一段代码,就从 UART 打印一个字符,通过观察程序运行结果来逐步缩小范围。
最终定位到的问题为:在适配Tang Nano 9K时,硬件资源(DTCM/ITCM大小)被裁剪了,而软件没有相应的调整,导致堆栈溢出。
AI的存在显著降低了问题定位的难度、提高了问题修复的速度。

第三阶段:统一FPGA环境

前两个阶段完成之后,Gowin FPGA flow就搭建完成了,最后做一个收尾工作:整理fpga目录结构,统一Xilinx/Gowin两个flow。
新的目录结构:
fpga/Makefilefpga_config.svxilinx/gaoyun/
其中:
  • fpga/xilinx 放 Xilinx FPGA flow
  • fpga/gaoyun 放Gowin FPGA flow
  • fpga/Makefile 作为统一入口
  • fpga/fpga_config.sv 作为配置入口
这样,Xilinx 和 Gowin 变成两个平行的环境。用户在 fpga_config.sv 定义目标板,例如:
`define TANG_NANO_9K
根目录下的Makefile会读取这个配置,然后自动调用对应平台的flow完成综合。
扩展阅读: