我这里有一些有效的 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 中不允许进行循环边界计算?