2016-11-23 25 views
3

VHDL 모듈에 인터페이스를 바인딩하려고합니다.SV 인터페이스 신호를 VHDL 유형에 바인딩하는 방법은 무엇입니까?

TYPE dut_fsm_type is (
          IDLE_STATE, 
          WAIT_STATE, 
          IDENTIFY_STATE, 
          LATCH_STATE, 
          DONE_STATE, 
          ERROR_STATE 
         ); 
signal dut_fsm_state  : dut_fsm_type; 
signal prev_dut_fsm_state : dut_fsm_type; 

인터페이스 모듈과 결합 문의 내 인스턴스이 같은 같습니다 : I과 같이 정의에 결합 할 신호는 모듈에서 다음과

bind my_dut my_intf my_intf_0 (.*, 
           .fsm_state  (tb.u_dut.dut_fsm_state), 
           .prev_fsm_state(tb.u_dut.prev_dut_fsm_state) 
          ); 

나는 몰랐다 무엇 길이 내 입력 신호 fsm_state, 그래서 그냥 32 비트로 설정해야합니다. 실제 표현으로

VHDL 계층 참조 (의 VOPT-2245)를 입력 ('dut_fsm_type')가 사용

: 나는 questasim 10.4 컴파일 할 때

interface my_intf (
    input bit[31:0] fsm_state, 
    input bit[31:0] prev_fsm_state 
); 

는, 다음과 같은 메시지가 뜹니다 바인드 문은 패키지에 정의되어야합니다.

어떻게 처리할까요?

+2

모델 104c SE 사용자 가이드 제 9 장 혼합 언어 시뮬레이션 'Verilog 또는 SystemVerilog를 인스턴스화하는 VHDL'섹션 다음에 '공용 VHDL 패키지 사용'의 부제목 '공유 사용자 정의 유형'섹션이 있습니다. * 다음 유형 SystemVerilog-VHDL 경계에서 사용하려는 경우 공통 패키지에 정의해야합니다. * (목록에는 열거 형이 포함됨). VHDL에서 패키지 선언을 공유 할 수 있습니다 (사용법 노트에서 vcom 옵션이 필요함). 유용한 결과를 제공하는 '매뉴얼 읽기'사례. – user1155120

답변

2

필자는 시뮬레이터 Questasim 10.4a에서 작업 할 수있었습니다.

1) 별도의 패키지로 VHDL 코드에서 TYPE 정의를 이동 :

//my_pkg.sv 
typedef enum { 
      IDLE_STATE, 
      WAIT_STATE, 
      IDENTIFY_STATE, 
      LATCH_STATE, 
      DONE_STATE, 
      ERROR_STATE   
      } my_fsm_states; 

3) 내 인터페이스 모듈 :

// File: types_pkg.vhd 
library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_unsigned.all; 
use ieee.numeric_std.all; 

package types_pkg is 
    TYPE dut_fsm_type is (
          IDLE_STATE, 
          WAIT_STATE, 
          IDENTIFY_STATE, 
          LATCH_STATE, 
          DONE_STATE, 
          ERROR_STATE 
         ); 
end types_pkg; 

2) 내 SystemVerilog를 패키지로 내 자신의 enum my_fsm_state을 정의 포트 정의는 내 FSM의 6 개 상태를 수용하기 위해 4 비트의 입력 포트를 가짐

interface my_intf (
    input   clk, 
    input [4:0] fsm_state, 
    input [4:0] prev_fsm_state 
); 

4) 내 바인드 문은 이전이었다

bind my_dut my_intf my_intf_0 (.*, 
           .fsm_state  (tb.u_dut.dut_fsm_state), 
           .prev_fsm_state(tb.u_dut.prev_dut_fsm_state) 
          ); 

5) 이제, 내 인터페이스 모듈에, 내가 m_fsm_states 열거 변수에 fsm_stateprev_fsm_state 캐스팅 정적 캐스트를 사용합니다.

interface my_intf (
    input   clk, 
    input [4:0] fsm_state, 
    input [4:0] prev_fsm_state 
); 

always @(posedge clk) 
begin 
    if (my_fsm_states'(fsm_state) == WAIT_STATE) begin 
    // Do something 
    end 
    else if (my_fsm_states'(fsm_state) == IDLE_STATE) begin 
    // Do something 
    end 
    else if .... // So on.. 

end 

끈적 거리지만 작동합니다. 이 정확하게 작동하지 않았지만 https://www.mentor.com/products/fv/resources/overview/binding-systemverilog-to-vhdl-components-using-questa-f43cc1c4-6607-44e3-8dc0-515bf2c08abc

:

나는이 프로젝트를 알고 여기 백서를 사용했다. 그들은 static_cast 대신 assign을 사용하지만 저에게는 효과적이지 않습니다. 오류 메시지가 할당 대신 전송하도록 요청했습니다.

2

오류 메시지에 따르면 SystemVerilog 측면에서 동등한 형식을 정의해야하며 패키지에 정의해야하는 것처럼 들립니다. 따라서 벨로우즈 패키지를 추가하고 인터페이스 포트를 수정하는 것이 효과적입니다.

package typdef_pkg; 
    typedef enum { 
    IDLE_STATE, 
    WAIT_STATE, 
    IDENTIFY_STATE, 
    LATCH_STATE, 
    DONE_STATE, 
    ERROR_STATE 
    } dut_fsm_type; 
endpackage : typdef_pkg 

interface my_intf (
    input typdef_pkg::dut_fsm_type fsm_state, 
    input typdef_pkg::dut_fsm_type prev_fsm_state 
); 
... 
endinterface 

혼합 언어 시뮬레이션은 까다로운 경향이 있습니다. 나는이 방법이 100 % 확신 할 수는 없지만 올바른 방향으로 인도해야합니다.

+0

당신은 올바른 방향으로 나를 지적했지만 정확하게 지적하지 않았습니다. 나는 내가 어떻게이 일을 처리 할 수 ​​있었는지 보여주는 또 다른 답을 썼다. 그럼에도 도움을 주셔서 감사합니다. – noobuntu

+0

아, 저는 SV 녀석이며 vhdl을 거의 보지 않습니다. 나는'패키지'가 두 언어 사이의 공통적 인 개념이라는 것을 몰랐다. 솔루션에 대한 나의 대답은 기분이 좋았습니다. – Greg