2014-09-30 2 views
1

я здесь некоторый допустимый код VHDL, который может быть скомпилирован сПочему GHDL и/или VHDL-2002 настолько ограничивают диапазоны в циклах?

  • GHDL 0,31 (--std не установлен)
  • ISE 14,7 (XST и Isim; станд = 200x)
  • Vivado (Synth и xSim)
  • Altera Quatus II 13,1 и последнее, но не в последнюю очередь
  • QuestaSim 10.0d

GHDL понимает этот код, если опция «- std 'не задано. Когда я устанавливаю '-std' на VHDL-2002, я получаю ошибки, жалующиеся на диапазоны for-loops. Хммм в предварительном режиме 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 ошибок, таких как th в. Я мог бы переписать два из них от 'length до 'range, так что осталось 6. Но некоторые из них не могут быть переписаны ...

Так почему же расчеты границ петли с 'length не разрешены в GHDL и/или VHDL> = 2002?

ответ

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; 

Это тот же самый вопрос, но для диапазона петли вместо указания подтипа:

ЛВП -a --std = 02 paebbels.vhdl
paebbels.vhdl: 19:18: универсальный целое число должно быть связаны числовой литерал или атрибут
ghdl: Ошибка компиляции

ghdl -a --std = 93 paebbels.vhdl
paebbels.vhdl: 19: 18: универсальный целочисленные Boun д должен быть числовой литерал или атрибут
ghdl: Ошибка компиляции

ghdl -a --std = 93с paebbels.vhdl
paebbels.vhdl: 19: 18: предупреждение: универсальное целое число, связанное должно быть числовой литерал или атрибут

(Нет ошибки, кроме предупреждения, которое на самом деле отсутствует в VHDL. std = 93c - это то, что вы получаете, когда не проходите std, это непринужденное правило.)

См. отчет о проблеме IR2073.txt, с вопросом, поднятым совсем недавно Тристаном Джингольдом (автор ghdl, кстати).

Это привело к спецификации изменения языка (LCS) для P1076-200X (-2008, LCS-2006-32), которая также дала разрешение на интерпретацию текста в стандарте -2002, как указано в Отчете о проблеме.

Казалось бы, Тристан никогда не видел этого LCS или иным образом реализовал его. Он добавил стандарт 93c после того, как был принят ИК. Вы можете отправить отчет об ошибках на ghdl-обновлениях на SourceForge или иным образом связаться с 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 

Я бы претендовать на 93с поведение неправильно, но есть на самом деле исторический спор изменилось ли ЛВП смысл стандарта или просто уточнить это интерпретация, цель которой заключается в том, чтобы разрешить преобразование в универсальное целое.