Как проверить файл VHDL - PullRequest
0 голосов
/ 17 ноября 2011

Я создал банк регистров с двумя портами в VHDL, и я хочу проверить его, чтобы убедиться, что он работает.Как бы я поступил так?Я знаю, что я хочу сделать (установите регистр 2 как константу, прочитайте его в тестовой программе, запишите в регистр 3 и прочитайте его обратно и посмотрите, есть ли у меня такие же результаты).

ТолькоДело в том, что я новичок в VHDL, так что я не знаю, есть ли консоль, или как устроена тестовая программа, или как создать экземпляр файла реестра, или даже что для его компиляции (я использовал quartus, такдалеко).

Вот мой регистрационный файл:

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;

1 Ответ

5 голосов
/ 17 ноября 2011

Прежде всего, если вы новичок в дизайне VHDL, вам лучше всего начать с учебника в Интернете или взять книгу типа «Руководство дизайнера по VHDL» .

В любом случае, так же, как дизайн программного обеспечения, чтобы протестировать дизайн VHDL, вы должны написать некоторый тестовый код. В проектировании аппаратных средств обычно эти тесты похожи на юнит-тестирование, но их часто называют "testbenches" .

Для дизайна, который вы дали, вам нужно создать что-то вроде этого:

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;
...