当 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;
使用 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;