2016-10-18 12 views
0

マイクロコントローラ付きのパラレルバス上で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の内部で何が起こっているのかを制御する手順が必要になることは分かっています。これは可能ですか?

もしそうでなければ、テスト刺激のための再利用可能な手順はどうでしょうか?

答えて

1

プロシージャをパッケージに入れることができます。ただし、これを行うには、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; 
+0

VHDLは大文字と小文字を区別しないので、 'data'と' Data'は名前の衝突を起こします。 (また、名前を区別するために大文字と小文字の区別に頼っているのは混乱のために尋ねるだけなので!) –

+0

そうです!私は名前を変更します。 –

+0

うわー、私はここで質問をしたのは初めてです。両方の方からの素早く良い返信に感心しました!それは厳しいコールでしたが、マシューは、私が最終結果のために欲しかったものに最も近づいたので、正解のポイントを得ました。私はあなたにも両方のアップホントを与えました。 – Lasse

1

マシュー・テイラーの答えは、基本的に手順をパッケージ化する方法についての正しいアプローチです。

それは、

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理由パッケージ内の対象外です。

引数と戻り値の型シグネチャに基づいて演算子とサブプログラムのオーバーロードが可能であることを覚えていれば、パッケージフォームを呼び出す簡単なプロシージャ呼び出しを曖昧さなく追加できます。

テストベンチの宣言的な領域(シグナル宣言の後)または刺激プロセスの宣言的な領域のいずれかで、これらのシグナルはすべてスコープ内にあります。

だから、

(それを見る必要がどのように多くのプロセスに応じて)これらの宣言領域のいずれかに

procedure buswrite(
    data_in : in std_logic_vector(7 downto 0); 
    addr_in: in std_logic_vector(15 downto 0)) is 
begin 
    bus_write(data_in, addr_in, Data, Addr, rd, wr); 
end busWrite; 
を些細なプロシージャを記述することができますし、今はきれいなテストベンチのコードを維持することができます。

関連する問題