将通用值降低到0时的VHDL信号维度问题

时间:2013-10-21 11:18:27

标签: vhdl fpga

如何处理这种情况:

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)这样的函数来防止这个问题(但是合成可能不会给我我想要的东西,即什么都没有。)
是否有某种方法可以更加无缝地处理这种情况?

2 个答案:

答案 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来逼迫他们中的至少一个,但实际上这可能不是你想要的!