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