VHDL综合报错[Synth 8-97]数组索引越界,行为仿真正常求解决
解决Vivado 2017.3综合时数组索引越界的误判问题
这问题我之前碰到过好几次,Vivado 2017.3的综合器在静态分析循环索引时,经常会因为没识别到变量的隐式范围约束,做出“索引可能越界”的误判——哪怕你逻辑上绝对不会触发这个情况,而且行为仿真完全正常。结合你的代码,我给你几个靠谱的解决方向:
1. 给var_col加上显式范围约束
你说var_col被设为24,但如果它的类型是无约束的integer,综合器会默认它可能取到整数的最大值(比如8位变量的话就是255),进而认为K可能会走到255。解决方法很简单:
- 如果
var_col是信号:signal var_col : integer range 0 to 24 := 24; - 如果
var_col是变量:variable var_col : integer range 0 to 24 := 24;
通过显式限定范围,综合器就能明确知道K的上限是24,不会触碰数组的255边界。
2. 显式约束循环变量K的范围
哪怕var_col有约束,有时候综合器还是会“钻牛角尖”。你可以直接给循环变量K加上范围限制,从根源上消除越界可能:
variable K : integer range 0 to 254 := 0; -- 明确K最大只能到254,和数组索引范围一致
3. 给循环条件加双重边界检查
如果不想修改变量类型,也可以在循环条件里额外加一个数组边界的判断,直接告诉综合器K不会超过数组的最大索引:
while (K < var_col) and (K <= 254) loop -- 同时限定K的两个上限
4. 排查是否有其他代码的隐式越界
虽然你说行为仿真正常,但还是要快速扫一眼:有没有其他进程、赋值语句或者子程序,可能会给array_col赋值时用到255这个索引?比如有没有地方用了array_col(255)的写法?如果有的话,哪怕是笔误也会触发这个错误。
附:你的代码片段(方便参考)
出错的循环代码
K := 0; while (K < var_col) loop --var_col is set to 24 if (array_col(K) = '1') then --the error is here tot_col := tot_col + 1 + num_zero; num_zero := 0; else tot_rows := tot_rows; if (tot_col > 0) then num_zero := num_zero + 1; else num_zero := 0; end if; end if; K := K + 1; end loop
数组声明代码
architecture Behavioral of A is subtype my_array is std_logic; type my_array0 is array (0 to 254) of my_array; --other signals declaration begin state_comb: process(sensitivity list) variable array_col : my_array0 := (others => '0');
一般来说,前三个方法里随便选一个就能解决这个问题——毕竟行为仿真正常已经说明你的逻辑是对的,只是综合器的静态分析太保守了。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

