【问题标题】:Testbench in VHDLVHDL 中的测试平台
【发布时间】:2026-01-07 02:20:05
【问题描述】:

我设计了一个实体乘法和一个实现该实体的架构,但我不知道如何为此编写测试平台。换句话说:如何将值传递给我的架构? 我不确定这段代码是否正确,但如果不向它传递值,我就无法对其进行测试。

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

entity multiply is
port (
    in_A : in std_ulogic_vector(7 downto 0);
    in_B : in std_ulogic_vector(7 downto 0);
    out_Q : out std_ulogic_vector(15 downto 0)
);
end multiply;

architecture multiply_arch of multiply is
signal p0 : std_ulogic_vector(7 downto 0);
signal p1 : std_ulogic_vector(7 downto 0);
signal p2 : std_ulogic_vector(7 downto 0);
signal p3 : std_ulogic_vector(7 downto 0);
signal p4 : std_ulogic_vector(7 downto 0);
signal p5 : std_ulogic_vector(7 downto 0);
signal p6 : std_ulogic_vector(7 downto 0);
signal p7 : std_ulogic_vector(7 downto 0);
begin
p0 <= (7 downto 0 => in_A(0)) and in_B;
p1 <= (7 downto 0 => in_A(1)) and in_B;
p2 <= (7 downto 0 => in_A(2)) and in_B;
p3 <= (7 downto 0 => in_A(3)) and in_B; 
p4 <= (7 downto 0 => in_A(4)) and in_B;
p5 <= (7 downto 0 => in_A(5)) and in_B;
p6 <= (7 downto 0 => in_A(6)) and in_B; 
p7 <= (7 downto 0 => in_A(7)) and in_B;

out_Q(15 downto 1) <= std_ulogic_vector((unsigned(p0) + unsigned(p1&"0") + unsigned(p2&"00") + unsigned(p3&"000") + unsigned(p4&"0000") + unsigned(p5&"00000") + unsigned(p6&"000000") + unsigned(p7&"0000000")));
end architecture multiply_arch;

【问题讨论】:

  • -1 显然是作业。显然没有读过他们关于 VHDL 编码的第一章,或者哪一章涉及实体实例化。

标签: testing vhdl modelsim


【解决方案1】:

您需要创建一个组件定义,然后在另一个文件中实例化该组件。该文件将是您的测试台文件。

测试台文件需要有component,如下所示:

component multiply is
port (
    in_A : in std_ulogic_vector(7 downto 0);
    in_B : in std_ulogic_vector(7 downto 0);
    out_Q : out std_ulogic_vector(15 downto 0)
);
end component multiply;

然后在 begin 语句下方为您的 architecture 您需要看起来像这样的组件实例化:

multiply_inst : multiply
port map (
    in_A  => test_A,
    in_B  => test_B,
    out_Q => test_out
);

您需要从您的测试台驱动信号 test_A 和 test_B,并查看信号 test_out 的结果以查看您的乘法模块是否按预期执行。

如需完整示例,请参阅:如何create a testbench in VHDL

【讨论】:

    【解决方案2】:

    multiply 实体的输入位很少(只有 16 个std_logic)并且没有 模块中的时钟或状态,因此尝试所有 0/1 的详尽测试台 可以创建输入的组合。这个测试台可以包括一个 “参考”模型,在乘法运算的情况下,它只是一个*

    以下是对此类测试台的建议:

    library ieee;
    use ieee.std_logic_1164.all;
    
    entity multiply_tb is
    end entity;
    
    
    library ieee;
    use ieee.numeric_std.all;
    
    architecture sim of multiply_tb is
    
      signal dut_in_a  : std_ulogic_vector( 7 downto 0);
      signal dut_in_b  : std_ulogic_vector( 7 downto 0);
      signal dut_out_q : std_ulogic_vector(15 downto 0);
    
      signal dut_ok : boolean;
    
    begin
    
      -- Device Under Test (DUT)
      multiply_e : entity work.multiply
        port map(
            in_A => dut_in_a,
            in_B => dut_in_b,
            out_Q => dut_out_q);
    
      -- Result generation
      dut_ok <= to_integer(unsigned(dut_in_a)) * to_integer(unsigned(dut_in_b)) =
                to_integer(unsigned(dut_out_q(15 downto 1)));
    
      -- Stimuli generation and result test
      process is
        variable in_a_v  : natural;
        variable in_b_v  : natural;
        variable out_q_v : natural;
      begin
        for in_a_v in 0 to 255 loop
          for in_b_v in 0 to 255 loop
            dut_in_a <= std_ulogic_vector(to_unsigned(in_a_v, dut_in_a'length));
            dut_in_b <= std_ulogic_vector(to_unsigned(in_b_v, dut_in_b'length));
            wait for 5 ns;
            assert dut_ok report "DUT failed" severity ERROR;
            wait for 5 ns;
          end loop;
        end loop;
        wait;  -- End of simulation
      end process;
    
    end architecture;
    

    请注意,multiply 实体中似乎存在一些错误,因为位 0 的out_Q 没有被驱动,并且高位不会创建正确的乘法 结果。问题解决后,生成结果(参考模型) 应酌情更新。

    【讨论】:

    • 认为测试台展示了一个非常有用的概念来验证这种模块,所以也许其他人也可以从该方案中受益。