如何处理这种情况:
entity foo is
generic (
num_instances : natural := 8
);
port (
data_in_per_instance : in std_logic_vector(num_instances-1 downto 0);
data_out_per_instance : out std_logic_vector(num_instances-1 downto 0)
);
end foo;
architecture bar of foo is
component do_stuff is
port(
din : in std_logic;
dout : out std_logic
);
end component do_stuff;
signal sig_per_instance : std_logic_vector(num_instances-1 downto 0);
begin
L1: for i in 0 to num_instances-1 generate
L2: do_stuff
port map(
din => data_in_per_instance(i),
dout => data_out_per_instance(i)
);
end generate;
end bar;
此处的问题是,如果num_instances
减少为0,则在评估信号范围(num_instances-1 downto 0)
时会出现错误....
这周围有优雅的方式吗?我能想到的就是使用像max(num_instances-1,0)
这样的函数来防止这个问题(但是合成可能不会给我我想要的东西,即什么都没有。)
是否有某种方法可以更加无缝地处理这种情况?
答案 0 :(得分:2)
一个简单的答案是将for-generate语句包装在if-generate中,if num_instances /= 0 generate ...
不幸的是if-generate没有其他部分,但是没有什么可以阻止你添加第二个if num_instances = 0 generate ...
语句处理这种特殊情况。
或者,您可以使用if-generate包装for-generate的问题部分。
编辑:需要if ... generate
保护正确的信号声明。
AHA!您可能已经发现VHDL的合法用法(根据我的经验)很少使用“块”语句!
块语句可能包含信号声明,并且可以包含在generate。
中所以这是有效的VHDL:
Normality : block is
-- signal declarations here
begin
-- concurrent code here
end block Normality;
它可以合法地包含在生成语句中......
答案 1 :(得分:1)
具有空范围的std_logic_vector
(例如3 downto 4
)是完全合法的 - 它被LRM称为“空范围”。如果您创建一个,那么(至少使用Modelsim)您将收到警告,这通常被视为不良形式。为了消除这些,那么Brian的block
建议就是你要做的。
类似地,for..generate
将导致空循环而没有实例。没有警告。
我很感兴趣为什么你想要一个没有实例的块?我会num_instances
一个positive
来逼迫他们中的至少一个,但实际上这可能不是你想要的!