2011-11-17 4 views
0

나는 VHDL로 듀얼 포트 레지스터 뱅크를 만들었고 테스트를 통해 작동하는지 테스트하려고합니다. 이 일을 어떻게 하죠? 나는 내가하고 싶은 것을 알고있다. (레지스터 2를 상수로 설정하고, 테스트 프로그램에서 그것을 읽고, 3을 레지스터에 쓰고, 다시 읽어서 같은 결과를 얻는지를 보자.)VHDL 파일을 테스트하는 방법

VHDL을 처음 사용하기 때문에 콘솔이 있는지 또는 테스트 프로그램이 어떻게 구조화되어 있는지 또는 레지스터 파일을 인스턴스화하는 방법 또는 컴파일 할 때 (내가 ' 지금까지 quartus를 사용 해왔음). 당신이 VHDL 설계를 처음 사용하는 경우에는 웹에서 튜토리얼을 시작하거나 "The Designer's Guide to VHDL" 같은 책을 잡는 것이 가장 좋은 선택이 될 수도, 모든

use IEEE.STD_LOGIC_ARITH.all; 
use IEEE.STD_LOGIC_UNSIGNED.all; 

-- Register File 

entity RF is 

port(
    signal clk, we: in std_logic; 
    signal ImmediateValue : in std_logic_vector(15 downto 0); 
    signal RegisterSelectA, RegisterSelectB : in integer range 0 to 15; 

    signal AOut, BOut : out std_logic_vector(15 downto 0) 
); 

end RF 

architecture behavior of RF is 

    array std_logic_vector_field is array(15 downto 0) of std_logic_vector(15 downto 0); 
    variable registers : std_logic_vector(15 downto 0); 

    process (clk, we, RegisterSelectA, RegisterSelectB, ImmediateValue) 
     wait until clk'event and clk = '1'; 
     registers(RegisterSelectA) := ImmediateValue when we = '1'; 
     AOut <= registers(RegisterSelectA); 
     BOut <= registers(RegisterSelectB); 
    end process; 

end behavior; 
+0

입니까? –

답변

5

첫째 :

여기 내 레지스터 파일입니다.

어쨌든, 소프트웨어 설계처럼 VHDL 설계를 테스트하려면 테스트 코드를 작성해야합니다. 하드웨어 설계에서 일반적으로 이러한 테스트는 같은 단위 테스트이지만 종종 "testbenches"이라고합니다.

당신이 준 설계를위한

, 당신이 뭔가를 만들어야합니다 다음 downvote에 대한 이유는 무엇

library ieee.std_logic_1164.all; 
library ieee.numeric_std.all; 

entity test_RF is 
end entity; 

architecture test of test_RF is 
    signal clk, we: std_logic; 
    signal ImmediateValue : std_logic_vector(15 downto 0); 
    signal RegisterSelectA, RegisterSelectB : integer range 0 to 15; 
    signal AOut, BOut : std_logic_vector(15 downto 0) 
begin 

    -- Instantiate the design under test 
    u_RF : entity work.RF 
    port map (
    clk => clk, 
    we => we, 
    ImmediateValue => ImmediateValue, 
    RegisterSelectA => RegisterSelectA, 
    RegisterSelectB => RegisterSelectB, 
    AOut => AOut, 
    BOut => BOut 
); 

    -- create a clock 
    process is 
    begin 
    clk <= '0'; 
    loop 
     wait for 10 ns; 
     clk <= not clk; 
    end loop; 
    end process; 

    -- create one or more processes to drive the inputs and read the outputs 
    process is 
    begin 
    wait until rising_edge(clk); 
    -- do stuff 
    -- use assert to check things 
    -- etc 
    end process; 

end architecture;