ModelSim-Alteraを使ってFPGAのシミュレーションをしてみる

FPGA

これまでQuartusで設計したFPGAのシミュレーションは、”University Program VWF“を使ってました。

関連記事 Quartus入門

これはこれで使いやすいのですが、やはりModelSimでテストベンチの作り方を勉強するのも必要かなということで、”ModelSim – Intel FPGA Starter Edition 10.5b (Quartus Prime 18.1)“を使ってみました。

このModelSimをインストールした記憶はないので、Quartusをインストールしたときに一緒にインストールされたものだと思います。

ちなみにですが、”University Program VWF”でのシミュレーション時間は10nsから100usまでのようです。

あまり長い時間のシミュレーションをやろうとすると、以下のように”Invalid Entry. Please enter a value between 10 ns and 100 us”というエラーメッセージが表示されます。

Terasic DE0-NANO開発ボード 【P0082】

新品価格
¥14,520から
(2020/10/21 21:57時点)

スポンサーリンク

HDLで回路設計

まずはシミュレーションをするための回路を、HDLで設計します。

ここでは、VHDLを使って、2入力1出力のAND回路を作りました。

LIBRARY ieee;
USE ieee.std_logic_1164.all; 

ENTITY ModelSimHDL IS 
	PORT
	(
		IN_A :  IN  STD_LOGIC;
		IN_B :  IN  STD_LOGIC;
		OUT_AND2 :  OUT  STD_LOGIC
	);
END ModelSimHDL;

ARCHITECTURE rtl OF ModelSimHDL IS 

BEGIN

	OUT_AND2 <= IN_A and IN_B;

END rtl;

HDLでテストベンチ設計

回路設計が終わったらテストベンチを作ってみます。

入力は2本だけなので、シンプルなテストベンチだと思います。

LIBRARY ieee;                                               
USE ieee.std_logic_1164.all;                                

ENTITY ModelSimHdl_TB IS
END ModelSimHdl_TB;

ARCHITECTURE rtl_tb OF ModelSimHdl_TB IS
                                                   
	SIGNAL IN_A : STD_LOGIC;
	SIGNAL IN_B : STD_LOGIC;
	SIGNAL OUT_AND2 : STD_LOGIC;

COMPONENT ModelSimHDL
	PORT
	(
		IN_A :  IN  STD_LOGIC;
		IN_B :  IN  STD_LOGIC;
		OUT_AND2 :  OUT  STD_LOGIC
	);
END COMPONENT;

BEGIN
	i1 : ModelSimHdl
	PORT MAP (
		IN_A => IN_A,
		IN_B => IN_B,
		OUT_AND2 => OUT_AND2
	);

-- IN_A
t_prcs_IN_A: PROCESS
BEGIN
	IN_A <= '0';
		WAIT FOR 100 us;
	IN_A <= '1';
		WAIT FOR 300 us;
	IN_A <= '0';
		WAIT FOR 100 us;
WAIT;
END PROCESS t_prcs_IN_A;

-- IN_B
t_prcs_IN_B: PROCESS
BEGIN
	IN_B <= '0';
		WAIT FOR 100 us;
	IN_B <= '1';
		WAIT FOR 100 us;
	IN_B <= '0';
		WAIT FOR 100 us;
	IN_B <= '1';
		WAIT FOR 100 us;
	IN_B <= '0';
		WAIT FOR 100 us;
WAIT;
END PROCESS t_prcs_IN_B;
END rtl_tb;

入力信号のHigh/Lowレベルとその時間を記述しているのと同時に、”COMPONENT“を使ってHDLで設計したAND回路を読み込んでいます。

プロジェクトへの追加

HDLで回路設計とテストベンチの作成が終わったら、2つのHDLファイルをQuartusのプロジェクトへ追加します。

すでにプロジェクトに追加されている可能性もありますが、念のため確認してみます。

Quartusのメニュー Project -> Add/Remove Files in Project…を選択します。

以下のウインドウが開きます。

CategoryのFilesで、2つのHDLファイル(テストベンチとAND回路)があることを確認します。

ここで、意味があるのかは不明ですが、”Up”と”Down”ボタンを使って、テストベンチのHDLファイルが一番上にくるようにしました。

あと、テストベンチのHDLは、プロジェクトに追加しなくても良いみたいです。

ModelSim-Alteraで使い方は1種類ではなく、いろいろな使い方があるようなので、ここでテストベンチのファイルをプロジェクトに追加しなければならない、という訳ではないようです。

ただ、ここで追加しておくと、Quartusのコンパイラがエラーチェックをしてくれるので、私はとりあえず追加しておきました。

EDA Tool Settings – Simulationの設定

次はEDA Tool SettingsでSimulationの設定をします。

Quartusのメニュー Assignments -> Settingsを選択します。

以下のウインドウが開きます。

まず、Category欄のEDA Tool Settings -> Simulationを選択します。

Tool nameは”ModelSim – Altera”を選択します。

Format for output netlistは”VHDL”を選択していますが、”Verilog HDL”も選択可能です。

次に、紫で囲った、”Test Benches”をクリックします。

以下のウインドウが開くので、”New”をクリックします。

すると、以下のウインドウが開きます。

ここでの詳しい名前付けのルールはわからないのですが、”Test bench name”には、テストベンチのHDLファイルと同じ名前を入力しました。

すると、その下の”Top level module in test bench”にも自動で同じ名前が入力されました。

次に、緑枠のボタンをクリックして、テストベンチのHDLファイルを選択します。

その後、紫枠の”Add”ボタンを押します。

すると、テストベンチのHDLファイルが追加されると思います。

終わったら”OK”ボタンを押して、Quartusに戻ります。

EDA Tool Optionsの設定

次はQuartusのメニュー Tools -> Optionsを選択します。

以下のウインドウが開きます。

Category欄のGeneral -> EDA Tool Optionsを選択します。

そしたら、ModelSimの欄で、”modelsim.exe”が保存されているフォルダを選択します。

選択が終わったら”OK”をクリックします。

RTL Simulationの実行

やっとシミュレーションの実行です。

Quartusのメニュー Tools -> Run Simulation Tool -> RTL Simulationを選択します。

すると、以下のようなウインドウが自動で表示されると思います。

波形部分を拡大したのが以下になります。

上の2本がANDの入力信号で、一番下が出力信号です。

ちゃんとANDになってました。

そして、シミュレーションは、少なくとも500usできました。

“University Program VWF”でのシミュレーション時間は最大100usだったので、それより長い時間シミュレーションできそうです。

おまけ

設計階層のトップが回路図だと1ModelSimでシミュレーションできない?

私は設計階層のトップは回路図にするのが好きなのですが、今回も回路図を使用したら、ModelSimでシミュレーションできませんでした。

おそらく、テストベンチのVHDLで、COMPONENTで設計した回路を取り込んでいるので、回路図は取り込めないのだと思います。

何か良い方法はあるのかな???今のところ不明です。

どうしても回路図で設計した回路をModelSimでシミュレーションしたい場合には、Quartusに回路図をHDLに変換する機能があるので、これを使えばできるかもしれません。

変換方法は、以下の記事を参照してみてください。

テストベンチをHDLで記述するのが面倒くさい

イチからテストベンチをHDLを記述するのは面倒な場合、”University Program VWF”を利用する方法があります。

まず、”University Program VWF”を使ってシミュレーションしてみます。

シミュレーションの方法は以下の記事を参考にしてください。

シミュレーションのために、入力波形を以下のように作成します。

入力波形を決めたら、メニュー Simulation -> Generate ModelSim Testbench and Scriptを選択します。

すると、以下のウインドウが表示されます。

ファイル名は異なるかもしれませんが、”Waveform.vwf.vht”というファイルが作成されます。

このファイルをテキストエディターで開くと、以下のようになっています。

LIBRARY ieee;                                               
USE ieee.std_logic_1164.all;                                

ENTITY ModelSimSCH_vhd_vec_tst IS
END ModelSimSCH_vhd_vec_tst;
ARCHITECTURE ModelSimSCH_arch OF ModelSimSCH_vhd_vec_tst IS
-- constants                                                 
-- signals                                                   
SIGNAL IN_A : STD_LOGIC;
SIGNAL IN_B : STD_LOGIC;
SIGNAL OUT_AND2 : STD_LOGIC;
COMPONENT ModelSimSCH
	PORT (
	IN_A : IN STD_LOGIC;
	IN_B : IN STD_LOGIC;
	OUT_AND2 : OUT STD_LOGIC
	);
END COMPONENT;
BEGIN
	i1 : ModelSimSCH
	PORT MAP (
-- list connections between master ports and signals
	IN_A => IN_A,
	IN_B => IN_B,
	OUT_AND2 => OUT_AND2
	);

-- IN_A
t_prcs_IN_A: PROCESS
BEGIN
	IN_A <= '0';
	WAIT FOR 130000 ps;
	IN_A <= '1';
	WAIT FOR 80000 ps;
	IN_A <= '0';
	WAIT FOR 310000 ps;
	IN_A <= '1';
	WAIT FOR 90000 ps;
	IN_A <= '0';
	WAIT FOR 40000 ps;
	IN_A <= '1';
	WAIT FOR 90000 ps;
	IN_A <= '0';
WAIT;
END PROCESS t_prcs_IN_A;

-- IN_B
t_prcs_IN_B: PROCESS
BEGIN
	IN_B <= '0';
	WAIT FOR 290000 ps;
	IN_B <= '1';
	WAIT FOR 100000 ps;
	IN_B <= '0';
	WAIT FOR 130000 ps;
	IN_B <= '1';
	WAIT FOR 220000 ps;
	IN_B <= '0';
WAIT;
END PROCESS t_prcs_IN_B;
END ModelSimSCH_arch;

こんな感じで基本的な部分を作成してくれます。

あとは、時間やHigh/Lowレベルを変更するだけなので、少し作業が楽になるかもしれません。

まとめ

シンプルに、ModelSimの使い方がわかって良かったです。

ただ、ModelSimは多機能そうなので、そちらも学習が必要そうです。

タイトルとURLをコピーしました