FutureDynasty在下文中我们一般简称FD。
FD工程创建
在FD解压后的目录里,双击FutureDynasty.exe启动FD软件
启动前会让你先选择一个目录作为FD的Workspace,为了方便学习后面的教程,建议以我们提供的demo_riscv下的wkspace目录作为Workspace。
在选完后wkspace目录下会多出来一个.metadata的目录这个就是存储workspace的设置的。如果不想每次启动都选工作空间,可以勾选上面的 Use this as the default and do not ask again 复选框。
点击完Launch后软件就会启动
在建立 workspace 后,进入 FD 环境,通过 File > New > Project,选择 C Project,如图所示。
在下一页中选择 C Managed Build,继续进入工程类型选择界面。在其中选择 Anlogic SDK project for softcore SoC,
注意:在下一步中,将选择软核的类型和优化配置,紧凑型软核选择 Light,标准型软核选择 Medium。 如果需要优化软核固件运行的速度,推荐使用-O2 等级的优化;如需优化软核固件的尺寸,推荐使用- Os 等级的优化。
完成工程向导后,工程窗口将自动导入样例工程,
FD工程设置
可以在工程属性中对工程优化参数进行调整。在左侧工程栏中右击工程,选择 Properties。在打开的窗口中逐级展开 C/C++ Build -> Setting,展开下图中的页面。
页面中有几个较为关键的子页面:
Target Processor 页面用于设定编译文件的指令集支持(轻量级不应勾选 RVM/RVA/RVC 支持,标 准型核应当勾选 RVM/RVC 两个指令集扩展的支持)
Optimization 选项卡中用于选择固件编译阶段采取的优化手段。其中, Optimization Level 中的设定的相关说明与建工程时的软核配置页面一致,在此不再赘述。建议勾选“Function Segments”和 “Data Segments”选项,将该选项勾选之后可以将函数和数据分段,方便在后续的链接步骤中去除未用到的函数和数据以减小固件体积。
在 GNU RISC-V Cross C++ Linker 选项卡中,我们可以选择使用的链接脚本(Script File),并且可以在该页面开启去除未使用的段的选项(需要配合前述的在编译步骤中拆分分段的选项)
本步骤中我们提供了三个版本的 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 容量的示例如图所示
Linker 脚本修改示例
TCM 内存容量查询示例
经过上述配置,对工程进行编译,输出最终的二进制文件,如图所示。
FD工程编译
在工程栏hello_world工程这里点右键,选择Build Project
或者菜单栏选择Build Project
编译完成后会在Console输出如下内容
FD生成mif
在FD菜单栏点击 AnlogicTools –> Create Mif
在窗口中填写 ROM 长度(应当与硬件工程定义的 TCM 的大小一致,否则 TD 软件无法读入)。点击 Create 后将在对应的文件夹内生成用于装入码流的 MIF 文件和用于仿真的 HEX 文件。 ROM Offset 用于在固件开始前填充固定长度的 0,一般无需使用。
MIF 文件生成界面
针对FD 2024.07之后的版本已经没有了Create Mif, 改为在编译选项里选择,步骤如下:
1. 在工程上右键选择属性
2. 在build c++勾选生成
3. 重新编译生成就可以在工程的build目录看到生成了MIF文件。
在工程的Debug目录下就能看到最终生成的mif文件。
而这个文件就是我们在TD工程中指定的TCM0_INITFILE的值。
我们打开提供的TD工程,在demo_riscv目录的如下路径中
将TCM0_INITFILE改为上文FD生成的mif路径,这里为了便于工程管理,我们用的是相对路径。
编译FPGA工程,并进行JTAG下载。
这样我们的FPGA里面就有了一个RISCV的核,这个时候我们就可以在FD上面进行软件的运行和调试了,在接下来的步骤里我们不需每次都去编译TD工程,只要FPGA工程没改动过,我们在FD里面作的软件代码的修改可以直接通过JTAG下载或者调试。
FD项目在线运行
从模板创建的项目会根据项目类型自动生成相应的配置
如果需要也可以自行修改相应的参数,修改完成点击 Run 即可启动运行
从串口可以看到输出
FD项目调试
右键项目 Debug As -> Debug Configurations… 可配置调试参数
或者左键点击选中项目后 Run -> Debug Configurations…
从模板创建的项目会根据项目类型自动生成相应的调试配置
如果需要也可以自行修改相应的调试参数,
上图调试选项框中Startup 一页中的红框内容默认勾选,表示程序启动调试后会停在main函数处,修改完成点击 Run 即可启动调试。
可以看到程序停留在了main函数的第一行。