当 1st 已经被约束时,如何约束无约束数组中的维度?

How to constrain dimension in uncosntrained array when 1st is already constrained?

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

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);

open 维度是第一个维度时,这很好。但是,如果不受约束的维度不是第一个维度,我该如何约束子类型呢?下面给出维度已经被约束的错误栈ActiveHDL。

Index constraint cannot be applied to constrained type.

subtype slv_array8_t is slv_array_t(7 downto 0)(open);  -- legal
signal some_object : slv_array8_t(31 downto 0);

下面也报同样的错误:

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

那么,实际上是否有一种方法可以将此类型限制在具有 VHDL 2008 的对象中?它甚至进入了 VHDL 2019 吗?

您只需要使用 (open) 来“跳过”约束维度,就像您使用 subtype:

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

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;

https://www.edaplayground.com/x/reNU