一.前言
蜂鸟E203是支持FLASH启动的,可是官方并没有提供 FLASH 启动的仿真环境,只是提供了利用 HBird SDK 进行 FLASH 下载的编译,因此需要自行搭建 FLASH 启动的仿真环境。在这过程中也遇到很多问题,但最终也是成功运行 helloworld 例程,当然也可能有其他的方式,这里只是提供借鉴和参考,也欢迎大家批评和指正!
二.准备
需要我们了解蜂鸟E203的整个仿真过程,能完成ILM启动,运行helloworld。
这里可以参考官方文档以及芯王国博主的关于虚拟机以及蜂鸟E203系列的一些文章。
官方文档: 1. Overview — Hummingbirdv2 E203 Core and SoC 0.2.1 documentation
芯王国:芯王国-优快云博客
三.搭建
1.将QSPI FLASH添加工程中
(1)需要一个QSPI FLASH仿真模型
链接:项目首页 - QSPIFLASHVerilog模型下载:QSPI FLASH Verilog模型下载 - GitCode
(2)新建IOBUF.v文件,将IOBUF.v,MX25L6473F.v(QSPI FLASH仿真模型)文件添加到e203_hbirdv2-master/rtl/e203/soc中
(3)修改MX25L6473F.v文件中的TOP_Add和tVSL(FLASH启动时间),TOP_Add可以改小一点,tVSL(FLASH启动时间)让其在芯片复位运行开始时间之前即可,这里直接改成0。
2.找到e203_hbirdv2-master/tb/tb_top.v文件。
(1)添加qspi内部信号线以及外部引脚线,将内部信号线添加到e203_soc_top模块调用中
(2)利用IOBUF将QSPI引脚信号引出,连接QSPI FLASH模块
(3)修改bootrom脚,使芯片从FLASH启动
(4)修改FLASH读取程序的代码,有两种方式
a.在tb_top.v文件中修改,将原本加载到ITCM的注释掉,改为加载到QSPI FLASH的数组里,readmemh里的路径名为(程序加载的绝对路径/程序.verilog),这里用的是helloworld例程,即为(helloworld的绝对路径/helloworld.verilog),可以在对应位置pwd一下,得到绝对路径。
b.在MX25L6473F.v中修改,将File_Name 的none改为(程序加载的绝对路径/程序.verilog),跟第一种是一样的,只是改的位置不同,两种方式选一个就行。
(5)修改总仿真时间,因为从FLASH运行时间相对较长,需要增加仿真时间
3.编译helloworld例程,方式是FLASHXIP,从FLASH运行。
source setup.sh
echo $PATH
which riscv-nuclei-elf-gcc make rm
make help
cd application/baremetal/helloworld
make dasm SOC=hbirdv2 BOARD=ddr200t CORE=e203 DOWNLOAD=flashxip
4.修改编译后生成的helloworld.verilog文件,将@2000全部替换为@0000,虽然芯片从FLASH启动的地址是0x20000000,但实际在FLASH里保存还是从0x00000000开始的,需要映射好。
5.进入到e203_hbirdv2-master/vsim目录下,开始仿真
make clean
make install
make compile SIM=vcs
make run_test SIM=vcs
最终运行结果:
观看波形:
make wave SIM=vcs
四.总结
FLASH启动的仿真环境,其主要就是两步,
1.将QSPI flash通过蜂鸟E203的QSPI0接口与芯片连接。
2.用hbird-sdk编译出helloworld.verilog文件(下载模式为flashxip),并加载到QSPI flash的数组里。编译过程中下载模式改为flash也是可以的,从flash读出再加载到ILM运行,就是需要将tb_top.v文件的检测代码注释掉,不然仿真代码没运行完会被提前终止,显示FAIL。
其次就是注意一些细节:
(1)修改bootrom,让其从FLASH启动
(2)编译出的.verilog文件地址映射的更改
(3) QSPI flash启动时间要在芯片开始运行之前
后面就是正常的仿真过程。