当类型可以被约束时,子类型有什么意义?

What is the point of a subtype when a type can be constrained?

使用从 here

定义的 VHDL 子类型
signal ShortInt: integer range 0 to 255;

subtype SHORT integer range 0 to 255;

我会像这样使用 short:

signal ShortInt: SHORT;

为什么我不把范围放在信号上而完全忽略子类型?

signal ShortInt: integer range 0 to 255;

我看到这里回答了关于子类型及其作用的问题,但我还没有找到像我想问的那样头脑简单的人,为什么要使用子类型?

创建常量集非常方便:

package UartPkg is 
  subtype UartAddrType is std_logic_vector(2 downto 0) ; 

  constant UartTxAddr : UartAddrType := "000" ;
  constant Uart...
end package UartPkg ; 

然后你可以在实体界面上使用它:

use work.UartPkg.all ; 
entity UART is
port (
  Addr : UartAddrType ; 
  . . .

现在考虑一下如果 UART 中的可寻址位置的数量需要增加到 4 位对设计的影响?如果你做对了,你只需要修改你的包。请记住,您的范围可能是“4 到 2”而不是“2 到 0”。

子类型主要是为了清楚和便于以后修改。但是除了 Jim 的回答之外,使用 VHDL 2008 您还可以创建部分约束的子类型,当您有复杂的记录时可以使用它。拿这个:

type reg_if_t is record
  valid : std_logic;
  addr  : std_logic_vector;
  data  : std_logic_vector;
end record;

在每个端口上限制它可能有点麻烦。

entity ent1 is
  port (
    reg_if0 : in reg_if_t( addr( 7 downto 0), data(31 downto 0) );
    reg_if1 : in reg_if_t( addr(15 downto 0), data(15 downto 0) )
  )
end entity;

为什么不在包中声明常用的子类型:

subtype reg_if_a8_t is reg_if_t( addr(7 downto 0), data(open) );  -- data length unconstrained
subtype reg_if_a8_d32_t is reg_if_t( addr(15 downto 0), data(31 downto 0) );
subtype reg_if_a16_d16_t is reg_if_t( addr(15 downto 0), data(15 downto 0) );
subtype reg_if_d32_t is reg_if_t( addr(open), data(31 downto 0) );

现在,有了一个体面的命名约定,用户可以清楚地了解类型的意图:

entity ent1 is
  port (
    reg_if0 : in reg_if_a8_d32_t;
    reg_if1 : in reg_if_a16_d16_t 
  )
end entity;

而且因为它们是相同的基本类型,所以它们都可以使用相同的函数。将其扩展到像 AXI4 接口这样的大总线,您将声明大量子类型!