2013-09-23 9 views
1

죄송합니다.이 웹 사이트를 처음 사용하지만 거의 2 일 동안 답변을 검색했습니다.테스트 벤치 다중 아키텍처

저는 VHDL을 처음 사용하고 있으며, 간단한 16 비트 ALU를 지정하도록 과제가 지정되었습니다. 이 ALU에는 RTL 디자인뿐 아니라 행동 적 아키텍처도 2 가지 아키텍처가 필요합니다. 내가 원하는만큼 완전한 코드를 가지고있다.

내가 알 수없는 것은 내가 ModelSim의 두 아키텍처에서 시뮬레이션을 실행할 수있는 테스트 벤치를 작성하는 방법이다. 두 파일 (테스트 벤치 및 ALU) 잘 컴파일, 그러나 "초기화되지 않은 inout 포트에 드라이버가 없습니다"라는 오류 메시지가 발생합니다.

이 문제에 대해 어떤 코드를 표시해야할지 모르겠습니다. 내 결핵의 시작을 보여줄뿐입니다.

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 
USE ieee.numeric_std.ALL; 

ENTITY tb IS 
END tb; 

ARCHITECTURE behavior OF tb IS 

    signal Clk,Res : std_logic := '0'; 
    signal A,B : signed(15 downto 0) := (others => '0'); 
    signal R1, R2 : signed(31 downto 0) := (others => '0'); 
    signal Op : unsigned(2 downto 0) := (others => '0'); 
    constant Clk_period : time := 10 ns; 

component ALU_16_First 
port(A, B: signed(15 downto 0):=(others => '0'); R: inout signed(31 downto 0):= (others => '0'); Op: in unsigned(2 downto 0) := (others => '0'); Clk, Res: Std_logic); 
end component ALU_16_First; 

component ALU_16_RTL 
port(A, B: in signed(15 downto 0):= (others => '0'); 
    R: inout signed(31 downto 0):= (others => '0'); Op: in unsigned(2 downto 0) := (others => '0'); Clk, Res: Std_logic); 
end component ALU_16_RTL; 

for ALU_Behaviorial: ALU_16_First use entity work.simple_alu(Behavioral); 
for ALU_RTL: ALU_16_RTL use entity work.simple_alu(RTL); 

BEGIN 

    -- Instantiate the Unit Under Test (UUT) 

    ALU_Behaviorial : ALU_16_First PORT MAP (
      A, 
      B, 
      R1, 
      Op, 
      Clk, 
      Res 
     ); 

    ALU_RTL: ALU_16_RTL PORT MAP (
      A, 
      B, 
      R2, 
      Op, 
      Clk, 
      Res 
     ); 

저는이 작업을 제 시간에 끝내기 위해 절박합니다.

감사합니다.

답변

1

러셀이 지적한대로 R 포트가 inout되는 것 외에는 괜찮습니다. 당신이하여 자기 시간을 절약 할 수 있습니다, 앞으로

testProc : process 
begin 
    ... 
    R <= (others => 'Z') ; 

: 어떤 이유로 당신이 양방향으로는 R 포트를 필요로하는 경우, 테스트 벤치에서 적절한 시간 동안 'Z'에 할당해야합니다 구성 요소 선언, 구성 사양 및 구성 요소 인스턴스 대신 직접 엔티티 인스턴스를 사용하여 :

ALU_Behaviorial : use work.simple_alu(Behavioral) 
PORT MAP (
     A => A_tb, 
     B => B_tb, 
     R => R1_tb, 
     Op => Op_tb, 
     Clk => Clk_tb, 
     Res => Res_tb 
    ); 

당신이 구성 요소 선언으로 유지하는 경우, 각 모델에 대해 별도의 구성 요소 이름을 만들 필요가 없습니다. 아키텍처 이름을 엔티티와 연관시키는 것은 구성 사양입니다.

간단한 사양의 경우 직접 엔티티 인스턴스 생성을 사용하고 복잡한 경우에는 구성 선언을 사용하는 것이 좋습니다.

+0

신난다, 나는 항구를 단지 바꿨다. 그런 다음 비 tb 코드를 확인하고 R이 데이터를 가져 오는 방식을 변경했습니다. 나는 거기에서 많은 것을 알아 냈다. 고마워! – addd45

0

명시 적 포트 매핑을 사용하여 구성 요소 인스턴스화에서 어떤 일이 일어나는지 완전히 명확하게 지정하는 것이 좋습니다. 예를 들면 :

ALU_Behaviorial : ALU_16_First PORT MAP (
     A => A_tb, 
     B => B_tb, 
     R1 => R1_tb, 
     Op => Op_tb, 
     Clk => Clk_tb, 
     Res => Res_tb 
    ); 

_tb 신호는 테스트 벤치 신호입니다. 이제 구성 요소에 대한 입력 (A_tb, B_tb, R1_tb, Op_tb, Clk_tb, Res_tb)이 테스트 벤치 아키텍처에 의해 유도되고 있는지 확인하십시오. 테스트 벤치가 이러한 입력을 유도하는 곳은 어디입니까?

또한 R1을 "inout"으로 선택하는 데 충분한 이유가 있습니까? 너는 그냥 꺼내 줄 수 있니? 그것은 당신을 위해 조금 쉬울지도 모르다.

+0

빠른 답장을 보내 주셔서 감사합니다. 솔직히 말하면, 내가 생각할 수있는 좋은 이유는 없습니다. 나는 강사에게서 견본을 나왔다. 내 테스트 벤치에서 구동되는 유일한 신호는 모든 클럭주기를 업데이트하는 op 코드입니다. – addd45