【发布时间】:2015-01-24 19:31:15
【问题描述】:
我的合成工具有问题。我正在编写一个模块,并试图使其参数化和可扩展。在我的设计中,我有一个 FSM 和一些计数器。计数器具有参数宽度(它们是数据路径宽度的函数)。问题是我正在使用该计数器来驱动案例陈述。合成器给了我这个错误:
2049990 错误 - (VHDL-1544) 数组类型 case 表达式必须是本地静态子类型
我也尝试过使用子类型,但它不起作用。声明是:
constant LENGTH_COUNTER_WORD : integer := integer(ceil(log2(real(WIDTH_DATA/WIDTH_WORD))));
subtype type_counter_word is std_logic_vector( LENGTH_COUNTER_WORD - 1 downto 0);
signal counter_word : std_logic_vector( LENGTH_COUNTER_WORD - 1 downto 0);
案例:
case type_counter_word'(counter_word) is
when (others => '1') =>
do_stuff();
when others =>
do_other_stuff();
end case;
我无法切换到 VHDL-2008。我读过我可以使用变量,但我想找到一个不同的解决方案,如果它存在的话。我无法想象在合成之前没有任何方法可以为合成器提供参数。
【问题讨论】:
-
哪一行代码会引发错误?另外,你说综合给出了错误......你确定这在模拟中正常工作吗?
-
@BrianDrummond -
case type_counter_word'(counter_word) is引发错误,这不是唯一的综合问题,而是如何确保案例覆盖率,不,它在模拟中不起作用。表达式的类型必须是局部静态的以确保选择覆盖,如果 WIDTH_DATA 或 WIDTH_WORD 是全局静态而非局部静态的泛型,则声明为 type_counter_word 的变量将不起作用。