🔍 搜索帖子 / 资讯 / 芯片型号…
论坛/全国大学生集成电路创新创业大赛/NucleiStudio + HbirdV2-SoC 在 FPGA 上的完整实现流程分享
NucleiStudio + HbirdV2-SoC 在 FPGA 上的完整实现流程分享
全国大学生集成电路创新创业大赛 作者 阿月浑子 发布于 2021-07-26 14:39(1901 天前) 8196 浏览

大家好,这里是Supernova,队伍编号为CICC2796,这是本队在大赛上的第七篇技术分享帖。

如果不使用JTAG调试烧写程序或者没有FLASH来存放代码,仅借助纯FPGA的资源,依然可以完成E203的下板实现(通过BRAM来存放机器码)。

流程如下:

首先在IDE上完成程序编译,参考如下帖子:https://www.rvmcu.com/community-topic-id-386.html

可以生成.verilog文件,此文件可以用$readmemx的方式仿真,但是不建议综合时使用此函数。所以我们需要将.verilog文件转换为可写入FPGA BRAM的.coe文件,这里我们为大家分享我们自己写的转换脚本:下载:verilog2coe

我们在调用BRAM的时候需要对齐时钟,在地址有效的下一个时钟周期数据有效,所以需要取消勾选IP选项中的 primitives output register。

通常来说,将机器码写入BRAM后的仿真结果和下板测试是一致的,直接通过烧写bit流就可以了。


需要注意的两点:

时钟建议时钟按照要求选择高速16MHz,低速32.768kHz,不要随意修改。

DTCM的大小不建议修改。


祝各位比赛顺利!


全部回复 8
m
markman1063 天前 · 1 楼

可以给一个 .verilog文件和转换后的。coe文件内容前面几行的对比么

谢谢

匿
1875 天前 · 2 楼
回复 阿月浑子:

“地址是根据写入数据位宽定的”对的,我就是觉得你们可能这里没设置好

感谢大佬指点(。・ω・。)ノ♡

阿月浑子
阿月浑子1875 天前 · 3 楼
回复 匿名用户:

我大概懂了,原来是不太理解RAM的结构,比如这个bram,地址是根据写入数据位宽定的,读出数据位宽可以比写入位宽大,比如写入设置为1byte,读出设置为8byte,这样读数据时可以在任意1byte数据为起始一口气读出包括之后的连续8byte数据。另外还有个掩码的定义,可以在输入输出位宽一致时选择性一次写入多少byte数据。(了解后才发现都是基本常识,但我就是不会哈哈哈)

“地址是根据写入数据位宽定的”对的,我就是觉得你们可能这里没设置好

阿月浑子
阿月浑子1875 天前 · 4 楼
回复 匿名用户:

感谢分享!我最近在学习移植蜂鸟的riscv,在使用您们提供的verilog文件转coe文件的脚本生成coe文件后,发现数据仍是2个16位数相邻。但是BRAM的IP核貌似不管位宽设置为多少都只取这相邻的16位,最终导致地址和数据不匹配,目前我暂时例化了8个一模一样的模块然后通过偏移地址的方式使每一个模块输出相邻的8位数据,姑且是能让代码跑起来了,不过这毕竟不是权宜之计,请问有没有更好的办法呢(我不会python所以不是很方便改脚本)

刚刚才看到你们的评论

匿
1875 天前 · 5 楼
回复 匿名用户:

感谢分享!我最近在学习移植蜂鸟的riscv,在使用您们提供的verilog文件转coe文件的脚本生成coe文件后,发现数据仍是2个16位数相邻。但是BRAM的IP核貌似不管位宽设置为多少都只取这相邻的16位,最终导致地址和数据不匹配,目前我暂时例化了8个一模一样的模块然后通过偏移地址的方式使每一个模块输出相邻的8位数据,姑且是能让代码跑起来了,不过这毕竟不是权宜之计,请问有没有更好的办法呢(我不会python所以不是很方便改脚本)

我大概懂了,原来是不太理解RAM的结构,比如这个bram,地址是根据写入数据位宽定的,读出数据位宽可以比写入位宽大,比如写入设置为1byte,读出设置为8byte,这样读数据时可以在任意1byte数据为起始一口气读出包括之后的连续8byte数据。另外还有个掩码的定义,可以在输入输出位宽一致时选择性一次写入多少byte数据。(了解后才发现都是基本常识,但我就是不会哈哈哈)

阿月浑子
阿月浑子1875 天前 · 6 楼


阿月浑子
阿月浑子1875 天前 · 7 楼

你说提到的“2个16位数相邻”我没理解具体是什么样的,实际上我们生成的 .coe 文件是这样的,是应该可以理解成每个地址 8bit 吧

匿
1879 天前 · 8 楼

感谢分享!我最近在学习移植蜂鸟的riscv,在使用您们提供的verilog文件转coe文件的脚本生成coe文件后,发现数据仍是2个16位数相邻。但是BRAM的IP核貌似不管位宽设置为多少都只取这相邻的16位,最终导致地址和数据不匹配,目前我暂时例化了8个一模一样的模块然后通过偏移地址的方式使每一个模块输出相邻的8位数据,姑且是能让代码跑起来了,不过这毕竟不是权宜之计,请问有没有更好的办法呢(我不会python所以不是很方便改脚本)

💡 请 登录 后参与讨论(微信扫码即登录/注册)