我这里有一些有效的VHDL代码,可以用
编译如果选项' - 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?
答案 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是否改变了标准的含义或只是澄清了它的解释,其目的一直是允许转换为通用整数。