PotatoPie 4.0 实验教程(40) —— FPGA实现RISC-V工程创建和调试-Anlogic-安路社区-FPGA CPLD-ChipDebug

PotatoPie 4.0 实验教程(40) —— FPGA实现RISC-V工程创建和调试

FutureDynasty在下文中我们一般简称FD。

FD工程创建

在FD解压后的目录里,双击FutureDynasty.exe启动FD软件

20240421084010785-image

启动前会让你先选择一个目录作为FD的Workspace,为了方便学习后面的教程,建议以我们提供的demo_riscv下的wkspace目录作为Workspace。

20240424120153832-image

在选完后wkspace目录下会多出来一个.metadata的目录这个就是存储workspace的设置的。如果不想每次启动都选工作空间,可以勾选上面的 Use this as the default and do not ask again 复选框。

20240424120106300-image

点击完Launch后软件就会启动

20240421084200187-image

在建立 workspace 后,进入 FD 环境,通过 File > New > Project,选择 C Project,如图所示。

20240420215027627-image

在下一页中选择 C Managed Build,继续进入工程类型选择界面。在其中选择 Anlogic SDK project for softcore SoC

20240421082253348-image

注意:在下一步中,将选择软核的类型和优化配置,紧凑型软核选择 Light,标准型软核选择 Medium。 如果需要优化软核固件运行的速度,推荐使用-O2 等级的优化;如需优化软核固件的尺寸,推荐使用- Os 等级的优化。

20240421082343723-image

完成工程向导后,工程窗口将自动导入样例工程,

20240421082359588-image

FD工程设置

可以在工程属性中对工程优化参数进行调整。在左侧工程栏中右击工程,选择 Properties。在打开的窗口中逐级展开 C/C++ Build -> Setting,展开下图中的页面。

页面中有几个较为关键的子页面:

Target Processor 页面用于设定编译文件的指令集支持(轻量级不应勾选 RVM/RVA/RVC 支持,标 准型核应当勾选 RVM/RVC 两个指令集扩展的支持)

20240421082618490-image

Optimization 选项卡中用于选择固件编译阶段采取的优化手段。其中, Optimization Level 中的设定的相关说明与建工程时的软核配置页面一致,在此不再赘述。建议勾选“Function Segments”和 “Data Segments”选项,将该选项勾选之后可以将函数和数据分段,方便在后续的链接步骤中去除未用到的函数和数据以减小固件体积。

20240421082642460-image

GNU RISC-V Cross C++ Linker 选项卡中,我们可以选择使用的链接脚本(Script File),并且可以在该页面开启去除未使用的段的选项(需要配合前述的在编译步骤中拆分分段的选项)

20240421082732751-image

本步骤中我们提供了三个版本的 linker 脚本,其特性由下表所示

linker 文件特性表

Linker 文件 默认启动地址 备注
linker_ahbtcm.ld 0x8000_0000 两者同为从片内 TCM 启动使用的 linker 脚本。根据软核
使用的总线选择。
length 设置必须等于或小于硬件工程中
配置的
TCM 的大小
linker_axitcm.ld 0xF000_0000
linker_axiemem.ld 0x4000_0000 AXI 外部内存运行使用的 linker 脚本。一般而言,使
用该文件编译的固件必须要使用
TCM 内存放 bootloader
并从外部存储器或者上位机中读入固件跳转运行

如果用户需要修改软核的内存分配,可以修改对应的 linker 脚本文件。其中有三个参数需要用户特别关心: MEMORY LENGTH(分配内存总长度) _stack_size(栈内存尺寸,当用户程序较大时建议适当改大) _heap_size(堆内存尺寸,如果用户有使用 malloc 一类动态内存管理函数需要改大该参数).

以 linker_ahbtcm.ld 文件为案例,下图中展示了三个变量所在的位置。如果固件运行在片内 TCM 中,用户需要格外注意查询硬件工程中 TCM 的容量,如果分配内存总长度超过了硬件上 TCM 的容量,固件运行时极有可能发生异常。一个在硬件工程中查询 TCM 容量的示例如图所示

20240421083314259-image

Linker 脚本修改示例

20240421083338867-image

TCM 内存容量查询示例

经过上述配置,对工程进行编译,输出最终的二进制文件,如图所示。

20240421083432334-image

FD工程编译

在工程栏hello_world工程这里点右键,选择Build Project

20240424085043798-image

或者菜单栏选择Build Project

20240424085154308-image

编译完成后会在Console输出如下内容

20240424085243648-image

FD生成mif

FD菜单栏点击 AnlogicTools –> Create Mif

20240424084345832-image

在窗口中填写 ROM 长度(应当与硬件工程定义的 TCM 的大小一致,否则 TD 软件无法读入)。点击 Create 后将在对应的文件夹内生成用于装入码流的 MIF 文件和用于仿真的 HEX 文件。 ROM Offset 用于在固件开始前填充固定长度的 0,一般无需使用。

20240424085558424-image

MIF 文件生成界面

针对FD 2024.07之后的版本已经没有了Create Mif, 改为在编译选项里选择,步骤如下:

1. 在工程上右键选择属性图片[20]-PotatoPie 4.0 实验教程(40) —— FPGA实现RISC-V工程创建和调试-Anlogic-安路社区-FPGA CPLD-ChipDebug

2. 在build c++勾选生成

图片[21]-PotatoPie 4.0 实验教程(40) —— FPGA实现RISC-V工程创建和调试-Anlogic-安路社区-FPGA CPLD-ChipDebug

3. 重新编译生成就可以在工程的build目录看到生成了MIF文件。

在工程的Debug目录下就能看到最终生成的mif文件。

20240424085540389-image

而这个文件就是我们在TD工程中指定的TCM0_INITFILE的值。

我们打开提供的TD工程,在demo_riscv目录的如下路径中

20240424090030103-image

TCM0_INITFILE改为上文FD生成的mif路径,这里为了便于工程管理,我们用的是相对路径。

20240424085717623-image

编译FPGA工程,并进行JTAG下载。

20240424090851434-image

这样我们的FPGA里面就有了一个RISCV的核,这个时候我们就可以在FD上面进行软件的运行和调试了,在接下来的步骤里我们不需每次都去编译TD工程,只要FPGA工程没改动过,我们在FD里面作的软件代码的修改可以直接通过JTAG下载或者调试。

FD项目在线运行

20240424083526486-image

从模板创建的项目会根据项目类型自动生成相应的配置

20240424085409677-image

如果需要也可以自行修改相应的参数,修改完成点击 Run 即可启动运行

20240424083815496-image

从串口可以看到输出

20240424083744403-image

FD项目调试

右键项目 Debug As -> Debug Configurations… 可配置调试参数

20240424082616621-image

或者左键点击选中项目后 Run -> Debug Configurations…

20240424082630591-image

从模板创建的项目会根据项目类型自动生成相应的调试配置

20240424082838189-image

如果需要也可以自行修改相应的调试参数,

20240424083010262-image

上图调试选项框中Startup 一页中的红框内容默认勾选,表示程序启动调试后会停在main函数处,修改完成点击 Run 即可启动调试。

20240424084129241-image

可以看到程序停留在了main函数的第一行。

请登录后发表评论