テストベンチの書き方_Verilog編(1)

テストベンチの書き方_Verilog編(1)

 Verilogのテストベンチを書いてみましょう。Verilogの構文(1)のソースコードをシミュレータで確認してみます。本文はVHDLの原稿と同じです。図も同じものを利用していますので、Verilogに置き換えて読んでください。

 テストベンチはテストしたいファイルの「親」になって、「子」である被検査ファイルをテストする。という関係になります。テストベンチファイルが「親」で、テストされるファイルが「子」という事です。

  「子」であるテストされるファイルがFPGAの回路になります。テストベンチは回路に全く関係ありません。「子」の回路がエンジニアの思想通りに動くのか? というのを確認するためのテストベンチです。

  テストベンチには概ね次のように3通りの方法があります。テストベンチが「親」で、テストしたいファイルが「子」である事に変わりはありません。

 これから説明するのはCASE-1のパターンです。1つのVerilogファイルをシミュレートします。一番確実で単純な方法です。

 CASE-2はあまりお勧めできないパターンです。テストしたいファイルが2個あって、テストベンチは1個なので、本当の意味でテストベンチとは言えないのです。

 1個目のファイルと2個目のファイルの間に「配線」が生じます。信号を接続するという事です。その接続を実際のFPGAの回路ではなく、テストベンチで接続してしまう事になります。

 テストベンチはFPGAの回路に関係無いので、もし1個目と2個目の間の配線をテストベンチで接続してしまうと、FPGAの回路に反映されません。もしくは、反映する別のVerilogファイルを作る事になってしまいます。

最初のうちはCASE-2のダメな事がわかりにくいと思います。なので、2つのVerilogファイルを1つのテストベンチでシミュレートするのはダメだ。と覚えていただいて構いません。

 CASE-3は「親」と「子」の関係になっている回路をテストベンチで確認する方法です。2つ以上のファイルをテストベンチで確認したい場合には、CASE-2の方法ではなくCASE-3の方法で行うようにしてください。

 CASE-2と違うのは「親」と「子」の関係になっている事です。この関係を含めてテストするというのは非常に重要です。

 HDLでテストベンチを作る際にわかりにくいのは、テストベンチだ。という根本的な事です。これは作ったエンジニアしかわからない。と言っても良いぐらいにテストベンチのファイルと回路になるHDLファイルに違いが無い場合があります。

 したがって、私はテストベンチはファイル名にTBを付けるようにしています。

datasel.v のテストベンチは TB_datasel.v という具合です。

//  TITLE:					"TB_datasel.v"
//  MODULE NAME:			TB_datasel
//  PROJECT CODE:			
//  AUTHOR:					 (****@nakaharagiken.com)
//  CREATION DATE:			2020.1.1
//  SOURCE:            		
//  LICENSE:           		Copyright (c) 2020 nakaharagiken All rights reserved. 
//  DESCRIPTION:            datasel.vhdのテストベンチ
//  NOTES TO USER:			
//  SOURCE CONTROL:			
//  REVISION HISTORY:  	    v0.1	2020.1.2	First edition
//
//
//
//
//
//
//
//
`timescale 1ns/1ps

module TB_datasel;

parameter SYSCLK_PERIOD = 20;		// 50MHz


reg		i_clock;					// system clock
reg		i_nreset;					// asynchronous reset 				____reset___|~~~normal~~~
reg		i_enable;					// enable							________|~enable~|_______
reg		i_SwitchIn_A;				// 入力ピンからの信号A 				
reg		i_SwitchIn_B;				// 入力ピンからの信号B				
reg		i_input_sel;				// 入力ピンからのセレクト信号		___input_A__|~~input_B~~~
wire	o_output_ans;				// A/B選択結果信号,レジスタ付き



//////////////////////////////////////////////////////////////////////
// Clock Driver
//////////////////////////////////////////////////////////////////////
always @(i_clock)
    #(SYSCLK_PERIOD / 2.0) i_clock <= !i_clock;


//////////////////////////////////////////////////////////////////////
// Main
//////////////////////////////////////////////////////////////////////
initial
begin

	i_clock <= 0;
	i_nreset <= 0;									//	初期値
	i_enable <= 0;
	i_SwitchIn_A <= 0;
	i_SwitchIn_B <= 0;
	i_input_sel <= 0;

	repeat(50) @(posedge i_clock);

	i_nreset <= 1;
	repeat(100) @(posedge i_clock);

	i_enable <= 1;
	repeat(100) @(posedge i_clock);
	i_input_sel <= 0;

	i_SwitchIn_A <= 1;
	i_SwitchIn_B <= 0;
	repeat(1) @(posedge i_clock);

	i_SwitchIn_A <= 0;
	i_SwitchIn_B <= 0;
	repeat(1) @(posedge i_clock);
	i_SwitchIn_A <= 1;
	i_SwitchIn_B <= 1;
	repeat(1) @(posedge i_clock);
	i_SwitchIn_A <= 0;
	i_SwitchIn_B <= 1;
	repeat(10) @(posedge i_clock);

	i_input_sel <= 1;
	i_SwitchIn_A <= 1;
	i_SwitchIn_B <= 0;
	repeat(1) @(posedge i_clock);
	i_SwitchIn_A <= 0;
	i_SwitchIn_B <= 0;
	repeat(1) @(posedge i_clock);
	i_SwitchIn_A <= 1;
	i_SwitchIn_B <= 1;
	repeat(1) @(posedge i_clock);
	i_SwitchIn_A <= 0;
	i_SwitchIn_B <= 1;



end


datasel inst_datasei_clockl(
	.clock		(i_clock),					//	in	system clock
	.nreset		(i_nreset),					//	in	asynchronous reset 				____reset___|~~~normal~~~
	.enable		(i_enable), 				//	in	enable							________|~enable~|_______
	.SwitchIn_A	(i_SwitchIn_A),				//	in	入力ピンからの信号A 				
	.SwitchIn_B	(i_SwitchIn_B),				//	in	入力ピンからの信号B				
	.input_sel	(i_input_sel),				//	in	入力ピンからのセレクト信号		___input_A__|~~input_B~~~
	.output_ans	(o_output_ans)				//	out	A/B選択結果信号,レジスタ付き
);

endmodule

 本当はテストベンチはすべてのブロックで一つ一つ作るべきです。つまり、1つのVerilogファイルを作ったなら、そのテストベンチを作る。という事です。それを繰り返して、どんどん上位のファイルを作ります。最後はトップファイルのテストベンチまで作る事ができれば完璧です。

 これはシミュレータプログラムにもよるのですが、ModelSimを使っていると、シミュレータの信号が入力なのか出力なのかがわかりにくいです。そこで私は27〜33行目のように入力信号の頭にiを付けるようにしています。

 Verilogの場合、27〜33行目のように入力はreg出力はwireで宣言します。ここがVHDLとは大きく違うところです。

 テストベンチの親子関係についてはVerilogの階層構造と書き方は同じですので階層構造_構文編(Verilog)を参照してください。