VHDL – 为什么不允许在生成循环中使用变量

我知道,变量只允许在进程中使用,但为什么不允许在生成循环中使用它们.
合成这样的构建体没有问题,因为它们之前被评估过.

没有这个限制,代码可以更具可读性.

lbl1: for i in data_out'range generate
    lbl2a: component comp_a 
        port map(
            clk => clk,
            out => out(0)(i)
            in_a => data_in(i*w + offset to i*w + w + offset));
    lbl2b: component comp_b
        port map(
            clk => clk,
            out => out(1)(i)
            in_b => data_in(i*w + offset to i*w + w + offset));
    .
    . 
    . 
    lbl2n: component comp_n
        port map(
            clk => clk,
            out => out(n)(i)
            in_n => data_in(i*w + offset to i*w + w + offset));
end generate lbl1;

或者只是写

lbl1: for i in data_out'range generate
    variable lower : integer := i*w + offset;
    variable upper : integer := i*w + w + offset;
    lbl2a: component comp_a 
        port map(
            clk => clk,
            out => out(0)(i)
            in_a => data_in(lower to upper));
    lbl2b: component comp_b
        port map(
            clk => clk,
            out => out(1)(i)
            in_b => data_in(lower to upper));
    .
    . 
    . 
    lbl2n: component comp_n
        port map(
            clk => clk,
            out => out(n)(i)
            in_n => data_in(lower to upper));
end generate lbl1;

代码不是来自任何一个例子,它可能在任何时候失败,但我认为你明白我的意思.它更容易阅读和维护.生成的变量可能超出生成过程之外的范围.

那么有什么理由为什么这是不允许的,或者它只是以前的vhdl标准的历史人工制品?

最佳答案
如果您想声明某些内容,则需要在声明性区域中.生成语句有点特殊,因为它不需要开头;你可以(你有)使用:

GenerateLoop : for i in data_out'range generate
  -- Code here
end generate;

如果您想将事物声明为循环的一部分,则必须具有声明性区域,使用generate语句,它将如下所示:

GenerateLoop : for i in data_out'range generate
  -- Declarative region
begin
  -- Code here
end generate;

您应该能够在此声明区域中声明事物.请注意,您需要使用信号或常量(看起来像常量更合适)而不是变量.

转载注明原文:VHDL – 为什么不允许在生成循环中使用变量 - 代码日志