Vhdl 当第1个已被约束时,如何约束未训练数组中的维度?

Vhdl 当第1个已被约束时,如何约束未训练数组中的维度?,vhdl,Vhdl,使用VHDL 2008,您可以定义不受约束的类型/子类型。例如: slv_array_t是标准逻辑向量的数组(自然范围); 然后可以创建子类型,其中一个或多个标注保持打开状态,以便稍后约束 子类型slv32_array_t为slv_array_t(打开)(31向下至0); 向某些对象发送信号:slv32_数组_t(7到0); 当打开维度是第一个维度时,这很好。但是,如果无约束维度不是第一个维度,如何约束子类型?以下给出了标注已受约束的ActiveHDL错误 索引约束不能应用于受约束的类型。

使用VHDL 2008,您可以定义不受约束的类型/子类型。例如:

slv_array_t是标准逻辑向量的数组(自然范围);
然后可以创建子类型,其中一个或多个标注保持打开状态,以便稍后约束

子类型slv32_array_t为slv_array_t(打开)(31向下至0);
向某些对象发送信号:slv32_数组_t(7到0);
打开
维度是第一个维度时,这很好。但是,如果无约束维度不是第一个维度,如何约束子类型?以下给出了标注已受约束的ActiveHDL错误

索引约束不能应用于受约束的类型。

子类型slv_数组8_t是slv_数组(从7到0)(打开);--合法的
向某些对象发送信号:slv_阵列8_t(31向下至0);
以下内容也会导致相同的错误:

向某些对象发送信号:slv_阵列8_t(7向下到0)(31向下到0);

那么,有没有一种方法可以用VHDL 2008在对象中约束这种类型?它甚至进入了VHDL 2019吗?

您只需要使用
(open)
来“跳过”受约束的维度,就像您对
子类型所做的那样:

signal some_object : slv_array8_t(open)(31 downto 0);

IEEE库;
使用IEEE.std_logic_1164.all;
实体E是
终端实体E;
E-is的体系结构
slv_数组类型是标准逻辑向量的数组(自然范围);
子类型slv32_array_t为slv_array_t(开放)(31向下至0);
向某些对象发送信号:slv32_数组_t(7到0);
子类型slv_array 8_t是slv_array_t(7到0)(打开);--合法的
向某些对象发送信号2:slv_阵列8_t(打开)(31向下至0);
开始
终端架构A;

向某些对象发送信号:slv\u阵列8\u t(打开)(31向下至0)在5.3.2数组类型、5.3.2.1常规、变量声明的末尾有一个示例。语义在5.3.2.2索引约束和离散范围中进行了描述。我称实体
tricky
,体系结构
no_mcve
,并使用ghdl。6.3子类型声明“子类型指示定义类型标记的基本类型的子类型”中找到了“跳过”的授权机制我为什么不试试这个@用户1155120我甚至打开了LRM的页面:facepalm
library IEEE;
use IEEE.std_logic_1164.all;

entity E is
end entity E;

architecture A of E is
  type slv_array_t is array(natural range <>) of std_logic_vector;
  subtype slv32_array_t is slv_array_t(open)(31 downto 0);
  signal some_object  : slv32_array_t(7 downto 0);
  subtype slv_array8_t is slv_array_t(7 downto 0)(open);  -- legal
  signal some_object2 : slv_array8_t(open)(31 downto 0);
begin
end architecture A;