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

プロシージャをパッケージに入れることができます。ただし、そのためには、次の 2 つのことを行う必要があります。

i) 手順を 2 つの部分に分割する必要があります。名前、パラメーター、および戻り値の型を含むプロシージャー宣言は、パッケージ宣言に入ります。サブプログラムの宣言を繰り返し、サブプログラムの実装を追加するプロシージャ本体は、パッケージ本体に入ります。

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 に答える