为什么GHDL和/或VHDL-2002对循环中的范围如此严格?
我这里有一些有效的VHDL代码,可以用为什么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-
- GHDL 0.31(-未设置标准)
- ISE 14.7(XST和iSim;标准=200x)
- Vivado(Synth和xSim)
- Altera Quatus II 13.1和最后但并非最不重要
- 奎斯塔西姆10.0d
-- 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是改变了标准的含义,还是只是澄清了标准的解释,其目的一直是允许转换为通用整数,这在历史上存在争议