1

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

  • GHDL 0.31(--std 未设置)
  • ISE 14.7(XST 和 iSim;标准 = 200x)
  • Vivado(合成器和 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 个。但有些是无法改写的……

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

4

1 回答 1

2

请参阅vhdl - 作为 std_logic_vector 提供的数组地址 - 堆栈内存溢出。这是同一个问题。

 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:warning: 通用整数绑定必须是数字文字或属性

(没有错误,但有警告,VHDL 实际上没有。std=93c 是你不通过 std 时得到的,这是一个宽松的规则。)

请参阅问题报告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 是否改变了标准的含义或只是澄清了它的解释,其意图一直是允许转换为通用整数。

于 2014-09-30T23:08:32.713 回答