为什么GHDL和/或VHDL-2002对循环中的范围如此严格?

为什么GHDL和/或VHDL-2002对循环中的范围如此严格?,vhdl,xilinx,ghdl,Vhdl,Xilinx,Ghdl,我这里有一些有效的VHDL代码,可以用 GHDL 0.31(-未设置标准) ISE 14.7(XST和iSim;标准=200x) Vivado(Synth和xSim) Altera Quatus II 13.1和最后但并非最不重要 奎斯塔西姆10.0d 如果未设置选项“--std”,GHDL理解此代码。当我将'--std'设置为VHDL-2002时,我会收到错误,抱怨for循环中的范围。Hmmm在2002年以前的模式下,该行已发出警告:( 这就是我的功能: -- create vector-

我这里有一些有效的VHDL代码,可以用

  • GHDL 0.31(-未设置标准)
  • ISE 14.7(XST和iSim;标准=200x)
  • Vivado(Synth和xSim)
  • Altera Quatus II 13.1和最后但并非最不重要
  • 奎斯塔西姆10.0d
如果未设置选项“--std”,GHDL理解此代码。当我将'--std'设置为VHDL-2002时,我会收到错误,抱怨for循环中的范围。Hmmm在2002年以前的模式下,该行已发出警告:(

这就是我的功能:

-- create vector-vector from vector (4 bit)
FUNCTION to_slvv_4(slv : STD_LOGIC_VECTOR) RETURN T_SLVV_4 IS
    VARIABLE Result     : T_SLVV_4((slv'length / 4) - 1 DOWNTO 0);
BEGIN
    IF ((slv'length MOD 4) /= 0) THEN
        REPORT "to_slvv_4: width mismatch - slv'length is no multiple of 4"
        SEVERITY FAILURE;
    END IF;

    FOR I IN 0 TO (slv'length / 4) - 1 LOOP
        Result(I)   := slv((I * 4) + 3 DOWNTO (I * 4));
    END LOOP;
    RETURN Result;
END FUNCTION;
GHDL错误消息:

D:\VHDL\git\PoC\src\common\vectors.vhdl:249:25:
->  universal integer bound must be numeric literal or attribute
故障线路249为0至(slv'长度/4)-1回路中的I
。用户定义的类型T\u SLVV\u 4定义为:

type T_SLVV_4 is array(natural range <>) of std_logic_vector(3 downto 0);
类型T_SLVV_4是标准逻辑向量(3到0)的数组(自然范围);
我的代码有8个这样的错误。我可以将其中的两个从
'长度
重写到
'范围
,所以剩下6个。但有些错误无法重写

那么,为什么在GHDL和/或VHDL>=2002中不允许使用长度为
的循环边界计算呢?

请参见。这是相同的问题

 1  library ieee;
 2  use ieee.std_logic_1164.all;
 3  
 4  entity paebbels is
 5  end entity;
 6  
 7  architecture foo of paebbels is
 8          
 9      type T_SLVV_4 is array(natural range <>) of std_logic_vector(3 downto 0);
10      -- create vector-vector from vector (4 bit)
11      FUNCTION to_slvv_4(slv : STD_LOGIC_VECTOR) RETURN T_SLVV_4 IS
12          VARIABLE Result     : T_SLVV_4((slv'length / 4) - 1 DOWNTO 0);
13      BEGIN
14          IF ((slv'length MOD 4) /= 0) THEN
15              REPORT "to_slvv_4: width mismatch - slv'length is no multiple of 4"
16              SEVERITY FAILURE;
17          END IF;
18  
19          FOR I IN 0 TO (slv'length / 4) - 1 LOOP
20              Result(I)   := slv((I * 4) + 3 DOWNTO (I * 4));
21          END LOOP;
22          RETURN Result;
23      END FUNCTION;
24  
25  begin
26  end architecture;
这给了我们:

ghdl-a paepbels.vhdl

(无错误,无警告)

还可以使用类型转换来避免此问题:

    -- FOR I IN 0 TO (slv'length / 4) - 1 LOOP
    for i in Result'range loop
    -- FOR I IN 0 TO (slv'length / 4) - 1 LOOP
    --for i in Result'range loop
    for i in 0 to natural(slv'length/4-1) loop
我认为93c的行为是不正确的,但实际上,LCS是改变了标准的含义,还是只是澄清了标准的解释,其目的一直是允许转换为通用整数,这在历史上存在争议