泛型中的VHDL常量
问题描述:
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;
如果实例可以覆盖泛型块,那么在泛型块中使用常量的原因是什么?泛型中的VHDL常量
有没有办法根据实例化过程中无法覆盖的泛型创建常量?
或我上面的例子我可以用每次我想使用常量代替计算,但这看起来并不优雅,如果我的条件改变了,它可能会导致很多返工和代码增长的可能错误
答
我不能回答为什么这样,但可能是语言进化的结果。
但是,处理这种情况的一种方法是命名内部常量,如PRIVATE_...
,并告诉用户不要映射这些;如果用户真的想要破坏功能,则有很多选择,所以如果给出合理的指导,用户可以正确实例化,这可能是一个合理的设计标准。
但是如果你想确定私有常量没有被修改,那么assert是一个选项;即使它的重复计算:
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);
谢谢。这确实有道理 –