我正在从磁盘读取 4 KiB(1Ki x 32 位)True-Dual-Port RAM 的初始 RAM 值。因为我的 Lattice ECP5 设备只有 18 位宽的嵌入式块 RAM (EBR),所以将 2 个 RAM 组合起来以匹配 32 位的字长。
我的ocram.mem
文件有 4 条数据线,每条线有 8 个十六进制数字(=> 32 位字线)。
该文件如下所示:
@000
44332211
88776655
CCBBAA99
00FFEEDD
我的读取函数在 LSE 日志中报告了这些行:
INFO - synthesis: d:/git/poc/src/mem/mem.pkg.vhdl(144): Note: "44332211". VHDL-1533
INFO - synthesis: d:/git/poc/src/mem/mem.pkg.vhdl(144): Note: "88776655". VHDL-1533
INFO - synthesis: d:/git/poc/src/mem/mem.pkg.vhdl(144): Note: "CCBBAA99". VHDL-1533
INFO - synthesis: d:/git/poc/src/mem/mem.pkg.vhdl(144): Note: "00FFEEDD". VHDL-1533
因此,第一行按预期跳过,以下行字符串也可以。在行读取和 char 到 std_logic_vector 的转换之后,我再次将我的 2D STD_LOGIC 矩阵输出到 LSE 日志中:
INFO - synthesis: d:/git/poc/src/mem/ocram/ocram_tdp.vhdl(123): Note: "Memory: =>
0100 0100 0011 0011 0010 0010 0001 0001
1000 1000 0111 0111 0110 0110 0101 0101
1100 1100 1011 1011 1010 1010 1001 1001
0000 0000 1111 1111 1110 1110 1101 1101
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 00 .... 000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
". VHDL-1533
可以看到,这些值仍然没有受到损害。
合成完成没有错误。
所以我开始在 Lattice Diamond 中进行地图和 P&R。平面图视图向我展示了 2 个使用过的嵌入式块 RAM - 这是预期的。但是当我点击 RAM 时,INIT 值看起来很奇怪。
RAM0 INITVAL_00 = 0x0000...000000000000003FF332EE221DD110CC
RAM0 INITVAL_01 = 0x0000...00000000000000000000000000000000
RAM0 INITVAL_.. = 0x.......................................
RAM0 INITVAL_3F = 0x0000...00000000000000000000000000000000
RAM1 INITVAL_00 = 0x0000...00000000000002EDD02A990265502211
RAM1 INITVAL_01 = 0x0000...00000000000000000000000000000000
RAM1 INITVAL_.. = 0x.......................................
RAM1 INITVAL_3F = 0x0000...00000000000000000000000000000000
我承认我的一些价值观,但不是全部。我在 EBR 或 ECP5 文档中没有找到任何线索。
- 初始值如何映射到 RAM?