我当前的 iCE40 FPGA 项目包括一个 8 位(软 IP)微处理器,它连接到由 8 个 2Kx2 块 RAM 组成的 4Kx8 RAM。能够将新程序(用于 8 位微型)加载到 4kx8 RAM 中而无需 FPGA 重新编译或重新路由会很有用。建议的流程需要 a) 分析 FPGA 网表以找出 8 个 2Kx2 块 RAM(组成 4Kx8 RAM)的排列和命名方式。b) 将包含新程序(用于 8 位微)的 Intel hex 文件拆分为 8 个部分。c) 在比特流中找到 8 个 Block RAM 数据段中的每一个,并用新的节目内容替换每个段的当前内容。来自 icestorm 或 yosys 项目的任何人都可以评论这个提议的流程是否可行(或者如果解决方案已经存在)。
编辑:现在 IceStorm 中有一个工具可以做到这一点: icebram
用法示例:
生成用于综合的随机十六进制文件。假设我们有一个 8 位宽 x 512 个字深的内存:icebram -g 8 512 > datafile_syn.hex
运行综合 (Yosys) 和布局布线 (arachne-pnr)。使用$readmemh("datafile_syn.hex", memory);您的Verilog代码初始化内存。
替换生成的 IceStorm .asc 文件中的内存内容: icebram datafile_syn.hex datafile.hex < synout.asc > final.asc
使用 .asc 将最终的 IceStorm .asc 文件打包成二进制比特流icepack。
每当您获得新的datafile.hex.
理论上这当然是可能的,但尚未实现。Afaics 需要进行以下更改:
1) Yosys 的memory_brampass 需要以某种方式存储原始设计中的内存如何分解为单独的 SB_RAM40_4K 单元的信息,最好是将此信息存储在单元的属性中。
2) Arachne-pnr 已经可以创建位置列表。这应该扩展为还编写一个文件,该文件包含来自 1) 中的属性的信息以及相关的放置信息。
3) 必须编写一个工具来使用此信息修补 IceStorm .asc 文件的内存内容。
我可以做 1) 但如果其他人会做 2) 和 3) 那就太好了。