泛型中的 VHDL 常量

VHDL constant in generics

entity blabla is
generic(
       register_width : integer := 32;
       --Assuming register_width > 4
       constant AVAILABLE_FOR_USER : integer := register_width - 4 --allowed in 2008     
       );
port   (
           clk : in std_logic;  
           rst : in std_logic;
           reg : out std_logic_vector(AVAILABLE_FOR_USER-1 downto 0) 
        );
end blabla;

如果实例可以覆盖它,那么在通用块中使用常量的原因是什么?

有没有一种方法可以基于泛型创建一个在实例化过程中不能被覆盖的常量?

或者我上面的例子,每次我想使用常量时,我​​都可以替换计算,但这看起来并不优雅,如果我的条件发生变化,它可能会导致大量返工和可能的错误,因为代码会增加

我无法回答为什么会这样,但可能是语言进化的结果。

但是解决这个问题的一种方法是将内部常量命名为 PRIVATE_...,并告诉用户不要映射这些常量;如果用户真的想破坏功能,则有很多选择,因此如果给予合理的指导,用户将正确实例化可能是一个合理的设计标准。

但是如果你想确定私有常量没有被修改,那么断言是一个选择;即使它重复计算:

architecture syn of blabla is
begin
 assert register_width - 4 = AVAILABLE_FOR_USER;
end architecture;

这里是计算一次的解法:

library IEEE;
use IEEE.std_logic_1164.all;

entity blabla is
generic(
       register_width : integer := 32
       );
port   (
           clk : in std_logic;  
           rst : in std_logic;
           reg : out std_logic_vector(register_width - 5 downto 0) 
        );
end blabla;

architecture blabla of blabla is
  constant AVAILABLE_FOR_USER : integer := reg'LEFT+1;   
  signal SOME_INTERNAL_SIGNAL : std_logic_vector(AVAILABLE_FOR_USER-1 downto 0);

http://www.edaplayground.com/x/4AYF