2014-09-30 1 views
1

은 여기 (--std가 설정되지 않은) 루프의 범위에서 GHDL 및/또는 VHDL-2002가 왜 제한적입니까? (</li> <li>Vivado (STD = 200X XST 및 ISIM)

  • ISE 14.7

    • GHDL 0.31로 컴파일 될 수있는 유효 VHDL 코드를 가지고 옵션 경우 신스와 XSIM)
    • 알테라 Quatus II 13.1과 마지막으로
    • QuestaSim 10.0d

    GHDL은 '이 코드를 이해 - std '가 설정되지 않습니다. '--std'를 VHDL-2002로 설정하면 for-loops의 범위에서 오류가 발생합니다.

    -- 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 인 사용자 흠 사전 2002 모드에서이 라인이 이미 경고 :(그래서 여기

    을 던져 나의 기능입니다 정의 된 유형 T_SLVV_4는 다음과 같이 정의됩니다.

    type T_SLVV_4 is array(natural range <>) of std_logic_vector(3 downto 0); 
    

    내 코드에는 8 번째 오류 에서. 나는 그 중 두 개를 'length에서 'range으로 다시 쓸 수 있었고, 6 개가 남았다. 하지만 일부는 다시 쓸 수 없습니다 ...

    GHDL 및/또는 VHDL> = 2002에서 루프 경계 계산이 'length이 아닌 이유는 무엇입니까?

  • 답변

    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 -a --std = 93 paebbels.vhdl
    paebbels.vhdl : 19 : 18 : 유니버설 정수 보운 문자 숫자이거나
    GHDL 속성에 바인딩한다 범용 정수 D는 문자 숫자이거나 속성해야
    GHDL : 컴파일 오류

    GHDL -a --std = 93C paebbels.vhdl
    paebbels.vhdl : 19 : 18 : 경고 : 문자 숫자이거나

    속성해야 범용 정수 바운드

    (오류는 없지만 VHDL에는 실제로없는 경고입니다. std = 93c는 표준을 통과하지 않을 때 얻을 수있는 규칙입니다.

    문제 보고서 IR2073.txt을 참조하십시오. 문제는 가장 최근에 Tristan Gingold (ghdl 작성자)가 가장 최근에 제기했습니다.

    결과 보고서에 지정된대로 -2002 표준의 텍스트를 해석 할 수있는 권한을 부여한 P1076-200X (LCS-2006-32)의 언어 변경 사양 (LCS)이 발생했습니다.

    트리스탄은 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 표준의 의미를 변경하거나 그것의 명확 여부 역사 분쟁이 실제로 거기를 해석, 보편적 인 정수로의 변환을 허용하려는 의도.

    관련 문제