PULPino|可在FPGA复现的开源RISC-V芯片系统

把处理器变成可读设计

ETH Zürich与博洛尼亚大学的开放RISC-V平台:从RTL仿真到ZedBoard运行,已有Columbia/都灵理工等独立FPGA实现。含10章图解、开发板套件采购、源码和IP版本要求;明确历史工具链及许可。

alan000

IEEE Transactions on VLSI Systems(底层处理器核论文) 2017

参数信息

RISC-V数据宽度
32 bit

复现文档

01|认识两颗处理器的分工

### 认识两颗处理器的分工

ZedBoard的Zynq包含固定ARM处理器与可编程逻辑。此路线让ARM运行Linux作为装载/控制端,FPGA逻辑实现32位PULPino。PULPino是单核微控制器系统,不是把Linux移植到PULPino,也不等于自己制造了65nm芯片。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/README.md)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![PULPino图解 overview.png](https://cdn.lunlunapp.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/cover/3767d5dba7e545e2a3bc4396e7578937.png)

![PULPino图解 riscy_archi.png](https://cdn.lunlunapp.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/cover/d381db80962d4bdc8898fcb8fbfed937.png)

02|清点开发板套件和全部外设

### 清点开发板套件和全部外设

清点ZedBoard、原配12V电源、SD卡、USB A–micro-B数据线和OTG转接头。后四项通常随同一套件,不重复采购;另备以太网线、读卡器和工作站。基础流程用板载UART与SD启动,无需额外焊接器件或外接JTAG探针。先核型号是XC7Z020-CLG484,不能把Zybo Z7当成旧ZYBO直接替换。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/fpga/README.md)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![PULPino图解 kit.png](https://cdn.lunlunapp.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/cover/1a9cb045f7ee464286adf403b6a89a4b.png)![wiring.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/78c1b9779ef5482c9aa4071072e6b5ce.png)

03|先冻结历史软件环境

### 先冻结历史软件环境

上游FPGA脚本测试Vivado2015.1及配套SDK;主流程包含Python2,ModelSim测试版本>=10.2c,CMake>=2.8且推荐>3.1。优先使用隔离的历史开发环境并遵守厂商许可。确认这些工具和编译器仍能获取;若改用新版工具,把脚本迁移当作单独工作记录,不能宣称已验证兼容。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/README.md)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![versions.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/229b2af03365458381b9958511b54239.png)![build.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/7fcefef3a62946ebbe2c64b7def783dc.png)

04|下载源码并核对所有IP

### 下载源码并核对所有IP

固定顶层提交6631c49ba38a9258da44d6b120d902f7b81f9233,按原更新脚本及ips_list.yml取回IP。顶层clone并不包含全部IP实现;清单许多项为pulpinov1标签,应记录每个实际SHA、许可证和下载结果。旧README有文本文件名与当前yml不一致,依据当前文件和脚本核对,不混入现代CORE-V核直接替换。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/ips_list.yml)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![PULPino图解 versions.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/229b2af03365458381b9958511b54239.png)

![PULPino图解 riscy_archi.png](https://cdn.lunlunapp.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/cover/d381db80962d4bdc8898fcb8fbfed937.png)

05|选择RISCY并匹配编译器

### 选择RISCY并匹配编译器

本页基线选择RISCY、关闭浮点及压缩扩展:原模板USE_ZERO_RISCY=0、RISCY_RV32F=0、RVC=0,GCC_MARCH=IMXpulpv2。需支持该扩展的ETH GCC;不把当前普通riscv64工具链直接代入。若选择zero-riscy,必须同时替换对应模板、编译选项与RTL/FPGA配置,并单独记录结果。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/sw/cmake_configure.riscv.gcc.sh)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![PULPino图解 versions.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/229b2af03365458381b9958511b54239.png)![zeroriscy_archi.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/48d8d86033d54e399b3deef5a1affb9a.png)

06|先通过Hello World的RTL仿真

### 先通过Hello World的RTL仿真

在独立build目录复制并修改官方CMake配置模板,确认顶层相对路径和编译器/ModelSim路径。按原文运行make vcompile,再make helloworld.vsimc;交互界面用helloworld.vsim。示例预期文字为Hello World!!!!!,还要核对正常结束和错误计数。随后按sw说明运行所选回归测试,保存失败项,不能只截成功一行。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/sw/README.md)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![PULPino图解 build.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/7fcefef3a62946ebbe2c64b7def783dc.png)![verify.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/72c8a625a4cd4b9588f1cd62f2efe6de.png)

07|构建ZedBoard镜像

### 构建ZedBoard镜像

编译所有FPGA相关组件时统一设置BOARD=zedboard,包括pulpemu、u-boot、devicetree和spiloader。默认器件为xc7z020clg484-1;核对实际板卡修订和约束。确保Vivado与SDK进入PATH,执行fpga目录原make all流程;它还获取旧Linux、U-Boot和Buildroot依赖。检查综合、实现时序和镜像生成,下载失败不能当作完成。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/fpga/README.md)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![PULPino图解 build.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/7fcefef3a62946ebbe2c64b7def783dc.png)![boot.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/44379505e9724032baca0ed7115e5788.png)

08|准备SD卡并先启动ARM Linux

### 准备SD卡并先启动ARM Linux

使用明确可清空的专用SD卡,按厂家启动介质指南建立启动与根文件系统分区。启动分区放BOOT.BIN、uImage、devicetree.dtb,第二分区解开rootfs.tar。操作前核对目标磁盘,避免覆盖工作站硬盘。断电插卡、按本板手册设置SD启动模式,再接原电源及USB串口。先看到ARM Linux启动并确认本地网络;这一步不证明PULPino已经运行。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/fpga/README.md)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![PULPino图解 boot.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/44379505e9724032baca0ed7115e5788.png)

![PULPino图解 wiring.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/78c1b9779ef5482c9aa4071072e6b5ce.png)

09|通过SPI装载RISC-V应用

### 通过SPI装载RISC-V应用

在ARM工具链下编译spiload,传到Zynq Linux。按前面的RISC-V编译流程生成应用的spi_stim.txt,再传到同一板卡。在Zynq端按原文运行 ./spiload ./spi_stim.txt,装载器会复位PULPino、写入指令/数据RAM并启动。ARM程序与RISC-V程序架构不同,不能交换可执行文件。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/fpga/sw/apps/spiload)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![PULPino图解 boot.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/44379505e9724032baca0ed7115e5788.png)

![PULPino图解 overview.png](https://cdn.lunlunapp.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/cover/3767d5dba7e545e2a3bc4396e7578937.png)

10|验证输出与GPIO,再归档复现记录

### 验证输出与GPIO,再归档复现记录

PULPino的printf经UART送到Zynq ARM;原设计对应Linux的/dev/ttyPS0,可以用终端工具读取,或按spiload超时参数显示输出。核对Hello World结果,再验证GPIO0–7对应SW0–7、8–15对应LD0–7,16–20为按钮。保存真实串口日志、回归汇总、时序报告、顶层与IP版本、板卡照片、工具许可和改动补丁。本站只整理资料,未运行实体FPGA或声称达到论文ASIC能效。

[原版文件与完整操作说明](https://github.com/pulp-platform/pulpino/tree/6631c49ba38a9258da44d6b120d902f7b81f9233/fpga/README.md)

中文图为本站流程示意;处理器原图来自ETH Zürich/University of Bologna,Solderpad0.51,完整许可见模型区。示意不是实机验收截图。

![PULPino图解 verify.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/72c8a625a4cd4b9588f1cd62f2efe6de.png)

![PULPino图解 wiring.png](https://orecord-files.oss-cn-zhangjiakou.aliyuncs.com/sbp/projects/8cbf8de4-0729-4792-8764-61ce46a6967f/files/image/78c1b9779ef5482c9aa4071072e6b5ce.png)