2

我有各种在带有微控制器的并行总线上使用 FPGA 的设计。对于每个设计,我都有一个测试平台,我使用模拟 MCU 时序的程序来模拟总线上的多个读/写操作。

我想知道一种将这些程序放在一个包中以便于重用的好方法。现在,程序已定义并作用于测试台实体范围内的信号。我宁愿有这样的东西。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.mcu_sim.all; -- contains MCU component and procedures for bus R/W operations

entity tb is
end tb;

architecture a of tb is
    -- DUT
    component fpga is 
        port (
        clk, rst: in std_logic;
        Data: inout std_logic_vector(7 downto 0);
        Addr: in std_logic_vector(15 downto 0);
        wr: in std_logic;
        rd: in std_logic);
    end component;

signal      clk, rst: std_logic;
-- Bus signals 
signal      Data: std_logic_vector(7 downto 0);
signal      Addr: std_logic_vector(15 downto 0);
signal      rd: std_logic;
signal      wr: std_logic;

begin

    dut: fpga
    port map (

        clk => clk,
        rst => rst,
        Data => Data,
        Addr => Addr,
        wr => wr,
        rd => rd
    );

    mcu1: mcu
    port map (

        clk => clk,
        rst => rst,
        Data => Data,
        Addr => Addr,
        wr => wr,
        rd => rd
    );


    process
    begin
        clk <= '0';
        wait for 0.5 us;
        clk <= '1';
        wait for 0.5 us;
    end process;

    stimulus: process
    begin
        rst <= '1', '0' after 1 us; 

        -- A list of nice, easy-to-read procedure calls to control the MCU
        -- Defined in package mcu_sim: procedure buswrite(data: in std_logic_vector(7 downto 0); addr: in std_logic_vector(15 downto 0));

        buswrite(X"01", X"0000"); -- Command for mcu to take control of bus and do a write operation to the fpga
        buswrite(X"02", X"0001"); -- Command for mcu to take control of bus and do a write operation to the fpga

        wait;
    end process;

end a;

mcu_sim 包将包含模拟 MCU 总线操作所需的一切,我可以使用过程调用轻松地定制我的刺激程序。我意识到它需要程序来控制 mcu1 内部发生的事情。是否有可能做到这一点?

如果不是,您将如何为测试刺激制定可重复使用的程序?

4

2 回答 2

3

您可以将程序放在一个包中。但是,要做到这一点,您需要做两件事:

i) 您必须将程序分成两部分。过程声明,包括名称、参数和返回类型,放在包声明中。重复子程序声明并添加子程序实现的过程体进入包体。

ii) 您的程序必须有一个完整的参数列表:参数列表必须包括程序读取的所有信号和变量以及分配给它的所有信号和变量。

package mcu_sim is

  procedure buswrite(
    data_in       : in  std_logic_vector(7 downto 0); 
    addr_in       : in  std_logic_vector(15 downto 0);
    -- you will need to add all the MCU I/O here to give you a complete parameter list, eg
    signal Data   : out std_logic_vector(7 downto 0);
    signal Addr   : out std_logic_vector(15 downto 0);
    signal rd     : out std_logic;
    signal wr     : out std_logic    
    );

end package mcu_sim;

package body mcu_sim is

  procedure buswrite(
    data_in       : in  std_logic_vector(7 downto 0); 
    addr_in       : in  std_logic_vector(15 downto 0);
    -- you will need to add all the MCU I/O here to give you a complete parameter list, eg
    signal Data   : out std_logic_vector(7 downto 0);
    signal Addr   : out std_logic_vector(15 downto 0);
    signal rd     : out std_logic;
    signal wr     : out std_logic    
    ) is
  begin
    -- the code
  end procedure buswrite;

end package body mcu_sim;

所以,你的刺激过程会变成这样:

stimulus: process
begin
    rst <= '1', '0' after 1 us; 

    buswrite(X"01", X"0000", Data, Addr, rd, wr); 
    buswrite(X"02", X"0001", Data, Addr, rd, wr); 

    wait;
end process;
于 2016-10-18T12:19:28.103 回答
2

Matthew Taylor 的回答本质上是关于如何打包程序的正确方法。

它的缺点是导致测试平台更加混乱,例如

buswrite(X"01", X"0000", Data, Addr, rd, wr); 
buswrite(X"02", X"0001", Data, Addr, rd, wr); 

当你想写一些更干净的东西时,比如

buswrite(X"01", X"0000"); 
buswrite(X"02", X"0001"); 

但不能,因为信号Data, Addr, rd, wr不在包的范围内。

如果您记得 VHDL 允许基于参数和返回类型签名的运算符和子程序重载,您会发现您可以添加更简单的过程调用来调用打包的表单,而不会产生歧义。

无论是在您的测试台的声明区域(在信号声明之后),还是在您的激励过程声明区域中,所有这些信号都在范围内。

因此,您可以在这些声明区域中的任何一个中编写一个简单的过程(取决于需要查看它的进程数)

procedure buswrite(
    data_in : in std_logic_vector(7 downto 0); 
    addr_in: in std_logic_vector(15 downto 0)) is
begin
    buswrite( data_in, addr_in, Data, Addr, rd, wr); 
end busWrite;

现在你可以保持你的测试台代码干净了。

于 2016-10-18T12:47:32.870 回答