2014-03-27 5 views
2

VDHL 2008의 일반 입력 기능을 사용하여 여러 가지 유형의 데이터를 보유 할 수있는 레코드를 만들려고합니다. 나는 그 코드를 합성하려하지 않는다.VHDL 2008 일반 유형 기능을 사용하여 유사 동적 유형 생성

내 테스트 설정은 다음과 같습니다

당신이 볼
library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 
use ieee.math_real.all; 

entity dynrec is 

end entity dynrec; 

architecture dyn of dynrec is 

    type dynrec is record -- this is a test record 
    datatype : type;  -- type of the data field 
    data  : datatype; 
    someval : natural; 
    end record dynrec; 

    signal testsig1, testsig2 : dynrec; 

begin -- architecture dyn 

testsig1 <= (datatype => real,  data => 5.0, someval => 12); 
testsig2 <= (datatype => std_logic, data => '1', someval => 12); 

end architecture dyn; 

은, 난 할 노력하고있어 그 중 하나가 필드의에 따라 서로 다른 유형의 데이터를 보유 할 수있는 기록을 가지고있다. 그러나 컴파일 할 때 다음 오류 때문에 실패합니다.

# ** Error: dynrec.vhd(13): near "type": expecting STRING or IDENTIFIER or << or '(' 
# C:/Programme/Mentor/Modelsim10.0b/win32/vcom failed. 

이 작업을 수행하는 방법은 무엇입니까?

저는 mentorgraphics modelsim 10.0b를 사용하고 있고 vcom dynrec.vhd -2008을 사용하여 컴파일했습니다.

+0

코드를 게시하시기 바랍니다 : 시뮬레이터가 아직 완전히 일반적인 패키지를 지원하지 않는 경우

당신은 하나 http://www.osvvm.org 나 또한

http://www.synthworks.com/downloads에서 OSVVM 패키지를 얻을 수 있습니다, 당신은이 다음을 수행하여 그들을 에뮬레이션 할 수 있습니다 과 일치하는 오류 메시지 : 잘못된 줄은 게시 한 코드의 아무 곳이나 아니다. : –

+0

@BrianDrummond 내가 줄 번호를 편집했는데, 지금 일치한다. –

답변

3

는 지금까지 내가 아는 한, 당신은 이런 식으로 뭔가를해야 할 것입니다 : 당신은 두 가지 유형 레코드의 인스턴스를 만들려면 때문에

package dynrec_pkg is 
    generic (
    datatype : type 
); 

    type dynrec_type is record 
    data  : datatype; 
    someval : natural; 
    end record dynrec_type; 
end package dynrec_pkg; 

--------------------- 

library ieee; 
use ieee.math_real.all; 

package dynrec_pkg_real is new work.dynrec_pkg generic map (datatype => real); 

--------------------- 

library ieee; 
use ieee.std_logic_1164.all; 

package dynrec_pkg_sl is new work.dynrec_pkg generic map (datatype => std_logic); 

--------------------- 

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.math_real.all; 

use work.dynrec_pkg_real.all; 
use work.dynrec_pkg_sl.all; 

entity dynrec is 
end entity dynrec; 

architecture dyn of dynrec is 

    signal testsig1 : dynrec_pkg_real.dynrec_type; 
    signal testsig2 : dynrec_pkg_sl.dynrec_type; 

begin -- architecture dyn 

    testsig1 <= (data => 5.0, someval => 12); 
    testsig2 <= (data => '1', someval => 12); 

end architecture dyn; 

것은, 이것이 가장 좋은 방법이 될 것 같다. 그렇지 않으면 datatype을 엔티티 자체에 대한 일반 사항으로 만들고 추가 패키지를 피할 수 있지만 엔티티에 하나의 동적 유형 만 표시 할 수 있습니다. 물론 datatype1, datatype2 등과 같은 여러 제네릭을 사용할 수 있습니다.

최종 줄은 인라인 제네릭 형식으로 레코드를 정의 할 수 없다는 것입니다. 패키지 및 엔터티와 같은 디자인 요소는 제네릭을 가질 수 있지만 레코드는 포함 할 수 없습니다.

ModelSim은 아직이 기능을 지원하지 않는 것 같습니다. (필자는 10.2c를 사용하고 있습니다.) 편리한 시뮬레이터가 없으므로 구문 수정을 환영합니다. 하지만 일반적인 생각은 건전하다고 생각합니다.

+0

그렇습니다. 그런 방향으로 가고 있습니다.하지만 실제로하고 싶었던 것은 각 레코드에 임의의 유형의 데이터가 포함될 수있는 링크 된 목록이있는 것입니다. 하지만 아마도 VHDL에서는 그렇게되지 않을 것입니다. –

+0

나는 그것을 가능하게하는 우아한 방법을 생각할 수 없다. 여러 가지 데이터 멤버가있는 연결된 목록 노드 유형을 만드는 것과 같은 몇 가지 비효율적 인 해결 방법이 있지만 실제로는 일반적이지 않습니다. (특히 VHDL-2008도 필요하지 않습니다.) – fru1tbat

+0

고려해야 할 한 가지 방법은 형식 표시기와 함께 동적으로 할당 된 문자열을 저장하는 레코드입니다. 그러면 문자열과 "원시"표현 사이를 변환하는 오버 헤드와 오버 헤드가있는 일반 연결 목록을 작성할 수 있습니다.그러나 이러한 유형의 레코드가 필요할 때, 저는 보통 다양한 유형의 모든 필드를 넣고 사용하지 않는 필드의 오버 헤드를 허용합니다. VHDL은 시스템 프로그래밍 언어가 아니므로 일부 작업을 수행하는 것은 어렵다는 점을 인정해야합니다. –

2

일반 패키지 (fru1bat 게시물 참조) + 보호 된 유형에서이 작업을 수행 할 수 있습니다.

OSVVM 패키지는 보호 된 유형을 사용합니다. 위의 일반 패키지와 연결하여 링크 된 목록을 만들 수 있습니다. 링크 된 목록이있는 가장 간단한 패키지는 2014.01 패키지 인 MessagePkg입니다.

package dynrec_pkg_real is 
-- generic (
-- datatype : type 
-- ); 
    subtype datatype is real ;