如何为32位线宽的8x1多路复用器实现测试台文件?

时间:2018-12-20 16:26:28

标签: vhdl modelsim

我正在编写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 :(得分:0)

使用测试台,您可以通过提供一系列输入信号,然后将输出信号与预期输出进行比较,来测试模块的正确性/输出行为。

  • 首先,测试平台文件未知R_in,因为它是模块的内部信号。因此,为该信号提供值没有意义。
  • 第二,您需要为in0, in1, ..., in7信号提供输入,因为它们似乎驱动您的 output 信号R_out以及其他输入信号{{1} }

答案 1 :(得分:0)

您需要更改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 array 。实际上,应该完全删除该行,因为您已经在流程之外的其他位置为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”前面的x)或仅二进制文件来分配它们:

in0 <= x"12345678"; --hex

in0 <= "00010010001101000101011001111000"; --binary

您的刺激过程看起来不错。更改Rs时,您期望在R_out上看到不同的输入值。您可以在流程结束时添加一个wait;,否则该流程将一直重复直到模拟结束。

具有用户定义类型的组件端口

或者,您可以将port map测试台信号直接R_in直接发送到组件上的R_in端口,但这会花费更多的工作。您的mux8_1组件定义没有R_in端口。如果您在package中定义了t_array_mux类型的端口,则可以添加一个名为R_in的{​​{1}}类型的端口,然后将其包括在组件和测试平台文件中

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; 进行端口映射。您必须使用所使用的任何工具将包添加到项目或编译列表中。