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

Я пишу код VHDL для моделирования мультиплексора 8x1, где каждый вход имеет 32-битную ширину.Итак, я создал массив для моделирования MUX, но теперь я застрял на Test Bench, он стал настолько сложным.Вот мой оригинальный файл (я уверен, что у него так много избыточностей). Как на самом деле сделать тестовый стенд для распознавания моего массива (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;

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вам необходимо изменить карту портов 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

или

in0 <= "00010010001101000101011001111000"; --binary

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

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

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

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 так, как выв настоящее время есть это.Вам нужно будет добавить пакет в список проекта или компиляции в любом используемом вами инструменте.

0 голосов
/ 20 декабря 2018

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

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