Как я могу протестировать все случаи векторного мультиплексора на VHDL? - PullRequest
0 голосов
/ 07 мая 2020

Это мой первый код VHDL, у меня есть этот мультиплексор (два входа, один бит выбора), который имеет 8-битные векторные входы . Как мне написать функцию тестирования, которая генерирует все возможные векторы?

library IEEE;
use IEEE.std_logic_1164.all;

entity mux is
port(
    in0, in1: in std_logic_vector(7 downto 0);
    sel: in std_logic;
    out0: out std_logic_vector(7 downto 0);
end mux;

architecture dataflow of mux is
begin
    out0<=in1 when sel='1'
    else in0;
end dataflow;

Это тестовый стенд на данный момент:

library IEEE;
use IEEE.std_logic_1164.all;

entity testbench is --empty
end testbench;

architecture tb of testbench is

-- DuT component
component mux is
port(
    in0, in1: in std_logic_vector(7 downto 0); 
sel: in std_logic;
    out0: out std_logic);
end component;

signal tb_sel: std_logic;
signal tb_in0, tb_in1, tb_out0: std_logic_vector(7 downto 0);

begin
-- Connect DuT
DuT: mux port map(tb_in0, tb_in1, tb_sel, tb_out0);

process
begin
    tb_sel <= 0;
    tb_in0 <= "00000000";
    tb_in1 <= "00000000";

    -- TODO: test all possibilities


    end process;
end tb;

1 Ответ

0 голосов
/ 07 мая 2020

Можно использовать что-то вроде этого:

library IEEE;
use IEEE.std_logic_1164.all;
use ieee.numeric_std.all;

entity testbench is --empty
end testbench;

architecture tb of testbench is

signal tb_sel: std_logic;
signal tb_in0, tb_in1, tb_out0: std_logic_vector(7 downto 0);

begin
-- Connect DuT

  DuT: entity work.mux port map(tb_in0, tb_in1, tb_sel, tb_out0);

process
begin
    -- Done: Test all possibilities

    for sel in 0 to 1 loop
      for in0 in 0 to 2 ** tb_in0'length - 1 loop
        for in1 in 0 to 2 ** tb_in1'length - 1 loop
          -- Make stimuli
          if sel = 0 then
            tb_sel <= '0';
          else
            tb_sel <= '1';
          end if;
          tb_in0 <= std_logic_vector(to_unsigned(in0, tb_in0'length));
          tb_in1 <= std_logic_vector(to_unsigned(in1, tb_in1'length));
          -- Wait for output, also to ease viewing in waveforms
          wait for 10 ns;
          -- Test output
          if sel = 0 then
            assert tb_out0 = tb_in0 report "Wrong out0 output value for selected in0 input" severity error;
          else
            assert tb_out0 = tb_in1 report "Wrong out0 output value for selected in1 input" severity error;
          end if;
        end loop;
      end loop;
    end loop;

    report "OK   (not actual failure)" severity FAILURE;
    wait;

    end process;
end tb;

Обратите внимание, что я использовал создание экземпляра по сущности для мультиплексора, чтобы избежать объявления компонента, когда в списке портов действительно была ошибка; ясно показывает, почему писать одно и то же дважды - плохая идея; -)

Также не то, чтобы я включил пакет IEEE numeric_std.

Его, несомненно, можно улучшить по сравнению с тестированием X значения также, но для простого модуля, такого как мультиплексор, приведенное выше тестирование даст необходимое покрытие.

Для более продвинутого тестирования посмотрите OSVVM .

...