正如user1155120在评论中指出的那样,问题是由于数组元素类型的长度不正确,并且我实际上是先尝试过模拟,我会受到一些非常有用的错误消息的欢迎:
因此,改变线
type lnx1_rom_names is array (integer range <>) of string(1 to 32);
至
type lnx1_rom_names is array (integer range <>) of string(1 to 6);
删除所有错误并模拟产生预期结果 .
此外,字符串必须具有自然索引范围,因此 string(0 to n) 无效,应为 string(1 to n) ;以下所有代码均已相应修改 .
由于我投入(或者可能浪费了)这么多时间来处理这个问题,我认为至少记录我关于字符串连接的发现是不浪费的 .
在合成期间,Vivado决定连接尽可能多的顺序数组元素,以便在尝试将数组元素作为参数传递给错误大小的数组元素时,在本例中为 generic map 成员:
...
type lnx1_rom_names is array (integer range <>) of string(1 to 32);
constant rom_path: lnx1_rom_names := (
0 => "r0.hex",
1 => "r1.hex",
2 => "r2.hex",
3 => "r3.hex",
4 => "r4.hex",
5 => "r5.hex",
6 => "r6.hex",
7 => "r7.hex",
8 => "r8.hex",
);
begin
ucgen: for i in rom_path'range generate
rom0: lnx1_romblk
generic map (
file_name => rom_path(i) -- << rom_path(i) evalues to "r0.hexr1.hexr2.hex ... "
) port map (