Как реализовать файл тестового стенда для мультиплексора 8x1 с шириной строки 32 бита?

Я пишу код VHDL для моделирования мультиплексора 8x1, где каждый вход имеет ширину 32 бита. Итак, я создал массив для моделирования MUX, но теперь я застрял на испытательном стенде, он стал таким сложным. Вот мой исходный файл (я уверен, что в нем так много избыточности) Как я могу заставить тестовый стенд распознавать мой массив (R_in) из файла компонента, а затем как я буду его стимулировать?

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

ENTITY mux8_1 IS
   PORT(Rs  :IN STD_LOGIC_VECTOR(2 DOWNTO 0);
    in0,in1,in2,in3,in4,in5,in6,in7 :IN STD_LOGIC_VECTOR(31 DOWNTO 0);
    R_out   :OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
       );
END mux8_1;

ARCHITECTURE behaviour OF mux8_1 IS

type t_array_mux is array (0 to 7) of STD_LOGIC_VECTOR(31 DOWNTO 0);
signal R_in:t_array_mux;

BEGIN

R_in(0) <= in0;
R_in(1) <= in1;
R_in(2) <= in2;
R_in(3) <= in3;
R_in(4) <= in4;
R_in(5) <= in5;
R_in(6) <= in6;
R_in(7) <= in7;


process(R_in, Rs)
BEGIN

CASE Rs IS

WHEN "000"=>R_out<=R_in(0);
WHEN "001"=>R_out<=R_in(1);
WHEN "010"=>R_out<=R_in(2);
WHEN "011"=>R_out<=R_in(3);
WHEN "100"=>R_out<=R_in(4);
WHEN "101"=>R_out<=R_in(5);
WHEN "110"=>R_out<=R_in(6);
WHEN "111"=>R_out<=R_in(7);
WHEN OTHERS=>R_out<= (others => '0');

END CASE;
END process;
END behaviour;

И вот мой файл тестового стенда «в процессе». Просто игнорируйте часть «стимулирующий процесс». Я знаю, что это неправильно, я просто не мог понять, как написать это для 32-битного сигнала.

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

ENTITY mux8_1_TB IS
END mux8_1_TB;

ARCHITECTURE behaviour OF mux8_1_TB IS

COMPONENT mux8_1
   PORT(Rs  :IN STD_LOGIC_VECTOR(2 DOWNTO 0);
    in0,in1,in2,in3,in4,in5,in6,in7 :IN STD_LOGIC_VECTOR(31 DOWNTO 0);
    R_out   :OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
       );
END COMPONENT;

type t_array_mux is array (0 to 7) of STD_LOGIC_VECTOR(31 DOWNTO 0);

--Inputs
signal R_in:t_array_mux:=(others=>'0');
signal in0,in1,in2,in3,in4,in5,in6,in7 :STD_LOGIC_VECTOR(31 DOWNTO 0):=(others=>'0');
signal Rs  :STD_LOGIC_VECTOR(2 DOWNTO 0):=(others=>'0');

--Outputs
signal R_out:STD_LOGIC_VECTOR(31 DOWNTO 0);

-- Instantiate the Unit Under Test + connect the ports to my signal
BEGIN

R_in(0) <= in0;
R_in(1) <= in1;
R_in(2) <= in2;
R_in(3) <= in3;
R_in(4) <= in4;
R_in(5) <= in5;
R_in(6) <= in6;
R_in(7) <= in7;

uut: mux8_1 PORT MAP(
    Rs=>Rs,
    R_in=>R_in,
    R_out=>R_out
       );

-- Stimulus process (where the values -> inputs are set) 

PROCESS
begin

R_in<="01010101";
    wait for 10 ns;
Rs<="001";
    wait for 10 ns;
Rs<="010";
    wait for 20 ns;
Rs<="011";
    wait for 30 ns;
Rs<="100";
    wait for 40 ns;
Rs<="101";
    wait for 50 ns;
Rs<="110";
    wait for 60 ns;
Rs<="111";
    wait for 70 ns;

END PROCESS;
END;

person Daidase    schedule 20.12.2018    source источник


Ответы (2)


Вам нужно изменить карту портов uut, чтобы вместо R_in у нее были отдельные порты in0 - in7, соответствующие вашему определению компонента mux8_1. Затем сопоставьте сигналы тестового стенда in0 - in7 непосредственно с этими портами:

 uut: mux8_1 port map(
     ...
     in0 => in0,
     in1 => in1,
     ...
     );

Или, если вы хотите сохранить сигнал R_in, сопоставьте карту портов следующим образом:

uut: mux8_1 port map(
         ...
         in0 => R_in(0),
         in1 => R_in(1),
         ...
         );

Это назначение R_in в вашем тестовом стенде неверно:

R_in<="01010101";

R_in определяется как тип t_array_mux, поэтому ему нельзя присвоить значение битового вектора. Он должен быть назначен массиву из 32-битных std_logic_vector. Эту строку действительно следует полностью удалить, так как вы уже выполняете назначения R_in в другом месте вне процесса. Множественные назначения вызовут конфликт сигналов.

Вы инициализируете R_in в своем тестовом стенде следующим образом:

signal R_in:t_array_mux:=(others=>'0');

Ключевое слово others в том виде, в каком вы его использовали, будет работать только для отдельных пользователей std_logic_vector. Вам нужно вложить others для вашего массива std_logic_vector:

signal R_in:t_array_mux:=(others=>(others=>'0'));

Вы захотите присвоить значения своим 32-битным in0 - in7 сигналам, чтобы вы могли видеть результат изменения вашего мультиплексора в симуляторе. Их можно назначать вне стимулирующего процесса. Вы можете назначить их, используя шестнадцатеричную запись (x предшествует "") или просто двоичную:

in0 <= x"12345678"; --hex

or

in0 <= "00010010001101000101011001111000"; --binary

Ваш процесс стимуляции выглядит нормально. При изменении Rs вы ожидаете увидеть другие входные значения в R_out. Вы можете добавить один wait; в конце процесса, иначе процесс будет повторяться до конца сима.

Порты компонентов с пользовательскими типами

В качестве альтернативы, вы можете port map сигнал вашего тестового стенда R_in направить непосредственно на R_in порт вашего компонента, как вы сделали, но это потребует немного больше работы. В вашем определении компонента mux8_1 нет порта R_in. Вы можете добавить порт типа t_array_mux с именем R_in, если вы определите тип t_array_mux в package, который вы затем включаете в свой компонент и файлы тестового стенда

library work;
use work.your_package_name.all;

в дополнение к library IEEE и т. д. Затем вы можете использовать тип t_array_mux в определении порта вашего компонента:

ENTITY mux8_1 IS
  PORT(Rs    : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
       R_in  : IN T_ARRAY_MUX; --User-defined port type
       R_out : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
       );
END mux8_1;

Это позволит вам выполнить сопоставление портов вашего uut так, как оно у вас есть. Вам нужно будет добавить пакет в проект или скомпилировать список в любом инструменте, который вы используете.

person user_007    schedule 20.12.2018
comment
Спасибо, что нашли время, чтобы подробно объяснить, мне удалось изменить тестовый стенд в соответствии с вашими предложениями (удалить R_in все вместе + структуру массива и указать только in0-in7, как я вижу, не нужно будет усложнять вещи дальше на тестовом стенде) и теперь работает. Что касается указания портов компонентов с пользовательскими типами, я обязательно попытаюсь сделать это в будущем. Итак, я был бы признателен за это большое спасибо еще раз! - person Daidase; 21.12.2018

Используя испытательный стенд, вы можете проверить правильность/выходное поведение вашего модуля, задав последовательность входных сигналов, а затем сравнив выходные сигналы с ожидаемым результатом.

  • Во-первых, R_in неизвестен вашему тестовому файлу, так как это был внутренний сигнал вашего модуля. Таким образом, предоставление значений этому сигналу не имеет смысла.
  • Во-вторых, вам необходимо предоставить входные данные для ваших сигналов in0, in1, ..., in7, так как они, похоже, управляют вашим выходным сигналом R_out вместе с другим входным сигналом Rs.
person Sai Varun    schedule 20.12.2018