最新有客户在询问soc的片上RAM启动方案。于是有了本篇文章。如果soc不 使用外部存储而是使用片上RAM的话,文档上似乎没有给出详细的说明,那这里我们就来介绍一下。
首先片上RAM启动要在IP上关闭外部存储,如下图,Include the external memory AXI interface。
这里要说,on chip RAM的启动方式与外部存储方式的启动方式有个很大的区别就是不需要bootloader从flash中搬运数据到存储器。on chip RAM启动方式不需要bootloader或者说应用程序就是bootlaoder。
另外,在新版本的sapphire IP中,已经支持把应用程序的hex文件直接添加到IP,相对于老的版本来说方便了很多。这时只需要勾选Overwrite the default SPI flash bootloader with the user application并且在User Application Path中添加用户程序生成的hex文件即可。
但是这样重新编译之后可能不能运行。因为soc RAM的初始化文件默认是工程目录下的bin文件,所以最好把这个工程目录下的bin文件先删除掉,然后再重新编译。当然也可能是别的原因,先不必深究。
在生成IP的过程中应该是把hex文件转换成了4个bin文件,与IP同一个目录。所以每次修改程序并生成hex之后,都要打开IP重新生成IP,这时才会重新生成bin文件。
这样之后重新编译就可以了。
有一个问题:我们每次修改RISCV的工程,重新生成hex文件。都需要重新编译工程,这是很耗时的。所以需要一个办法把修改后的hex——也就是RAM的初始化文件使用一个简单的方法合成bit文件,以避免重新编译。
易灵思Efinity从2023.1.150开始增加了一个功能叫Open BRAM Initial Content Updater。它可以让用户快速更新BRAM初始化的数据而不需要全编译。它是更新elaborated网表的数据,
说明:–optimize-zero-init-rom综合选项是告诉软件优化初始化值为0的ROM的,如果你的ROM初始值是0,又想通过Open BRAM Initial Content Updater工具来修改初始值,需要把–optimize-zero-init-rom选项Disable。
RISCV片上ROM更新
(1)当工程编译完成之后,打开该工具就可以看到可以初始化的BRAM块。其中ram_symbol0,1,2,3就是RISCV的初始化文件。用户只需要选择相应的文件,然后再点击Update memory content就会把初始化文件更新掉,RISCV有4个bin文件,所以要对每个bin文件都进行更新。
至于怎么生成要更新的bin文件呢?请参考embedded_sw/sapphire/tool下面的README-binGen.txt
(2)当4个文件都更新完成之后点击Genarate a new Bitstream,就会有提示是否要重样综合还是继续生成Bitstream的过程,按下图选择Proceed with Bitstream Generation.软件会运行最后一步生成新的bit流。
(3)用新生成的数据流就可以重新下载看效果了。新生成的文件不会影响debug。
一般ROM的初始化
在Efinity的安装目录下提供了一个T20的参考工程。
<Efinity install path>/debugger/demo/helloworlddbg_GOLD
我把它修改成了Ti60F225的demo工程(因为手上没有T20的demo板)
链接:https://pan.baidu.com/s/106I_xipVjXc1sfV9c5982A?pwd=1234
提取码:1234
具体的操作步骤请参考efinity-ug.pdf的About the BRAM Initial Content Updater部分,有详细的说明,这里先不赘述。
没有回复内容