为何元素为非一致范围数组的数组不被允许?(VHDL场景)
为什么元素为非一致范围数组的数组不被允许?
先看这两段VHDL类型定义:
type pipi is array (natural range <>) of bit; type papa is array (natural range <>) of pipi;
合法的常量声明
下面这个常量声明是合法的:
constant foo : papa := (0 => ('1', '1'), 1 => ('1', '1'));
编译器可以从初始化表达式推导出每个pipi元素的索引约束,最终确定foo的类型是papa(0 to 1),其每个元素都是pipi(0 to 1)类型。
不合法的常量声明
但下面这个声明会被编译器拒绝:
constant foo : papa := (0 => ('1', '1'), 1 => ('1'));
问题出在内部数组的长度不一致:foo(0)对应的是pipi(0 to 1),foo(1)对应的是pipi(0 to 0),两者的索引约束不统一。
原因解析
你提到的pipi(0 to 1)和pipi(0 to 0)确实都是pipi的子类型,但它们不能作为papa的元素,核心原因是:
papa的定义要求所有元素必须属于同一个pipi子类型,而非任意pipi子类型的集合。- 当你声明
foo : papa时,编译器需要推导出一个统一的pipi子类型作为papa的元素类型。如果内部数组的长度不一致,编译器无法确定这个统一的索引约束,因此会判定该声明非法。
换句话说,papa是“元素为固定pipi子类型”的数组,不是“元素为任意pipi子类型”的数组。只有当所有内部数组的索引约束一致时,编译器才能确定这个固定的子类型,声明才会合法。
内容的提问来源于stack exchange,提问作者Aaron Linnell
相关产品推荐
相关产品推荐

