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

时间:2014-09-30 21:19:39

标签: vhdl xilinx ghdl

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

编译
  • GHDL 0.31(未设置--std)
  • ISE 14.7(XST和iSim; std = 200x)
  • Vivado(Synth和xSim)
  • Altera Quatus II 13.1以及最后但并非最不重要的
  • QuestaSim 10.0d

如果选项' - std' GHDL理解此代码。没有设定。当我设置' - std'到VHDL-2002我得到错误抱怨for循环中的范围。嗯,在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是FOR I IN 0 TO (slv'length / 4) - 1 LOOP。用户定义的类型T_SLVV_4定义为:

type T_SLVV_4 is array(natural range <>) of std_logic_vector(3 downto 0);

我的代码有8个错误。我可以将其中两个从'length重写为'range,因此剩下6个。但有些这些不能改写......

那么为什么在GHDL和/或VHDL中不允许使用'length进行循环边界计算&gt; = 2002?

1 个答案:

答案 0 :(得分:2)

vhdl - Address of array provided as std_logic_vector - Stack Overflow。这是同一个问题。

 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;

这是同一个问题,但是对于循环的范围而不是子类型指示:

  

hdl -a --std = 02 paebbels.vhdl
  paebbels.vhdl:19:18:通用整数绑定必须是数字文字或属性
  ghdl:编译错误

     

ghdl -a --std = 93 paebbels.vhdl
  paebbels.vhdl:19:18:通用整数绑定必须是数字文字或属性
  ghdl:编译错误

     

ghdl -a --std = 93c paebbels.vhdl
  paebbels.vhdl:19:18:警告:通用整数绑定必须是数字文字或属性

(没有错误,但是一个警告,VHDL实际上没有.std = 93c是你在没有通过标准时获得的,它是一个放松的规则。)

请参阅问题报告IR2073.txt,最近由Tristan Gingold(ghdl的作者,偶然)提出了这个问题。

这导致了P1076-200X(-2008,LCS-2006-32)的语言变更规范(LCS),该规范也允许解释问题报告中规定的-2002标准中的文本。

似乎特里斯坦从未见过LCS或以其他方式实施过它。 IR接受后,他补充了93c标准。您可以在SourceForge上提交有关ghdl-updates的错误报告,或者联系Tristan。也没有什么能够解释-1993标准的变化(尽管有93c)。

这也是逃避问题的简单方法:

    -- FOR I IN 0 TO (slv'length / 4) - 1 LOOP
    for i in Result'range loop

这给了我们:

  

ghdl -a paebbels.vhdl

(没有错误,没有警告)。

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

    -- 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是否改变了标准的含义或只是澄清了它的解释,其目的一直是允许转换为通用整数。