You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何元素为非一致范围数组的数组不被允许?(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:08:27