テストベンチのパターンをファイルから読む

テストベンチのパターンをファイルから読む

 今回はVerilogでテストパターンをテキストファイルからリードする方法について解説します。数バイト程度のパターンであれば、テストベンチの中に記載するのが一般的ですが、数百バイトものデータを読むと大変です。

 私の場合、ADCのデータをテキストファイルにしておいて、テストベンチ入力として扱う事が多いです。ADCの場合、サンプリングクロックで1ワードのデータになりますので、エクセル等で計算によって作成することができます。縦に時間をサンプリング速度で記述して、三角関数で計算していきます。ModelSimの場合、アナログデータに表示する事ができますので、ロジックアナライザーとオシロスコープを同時に観測したようなテストが可能になります。

まず、読みこむファイルを作成しておきます。1行に1ワードとします。Qフォーマットで計算したSin波形です。

0
9CB
121A
17A6
1999
17A6
121A
9CB
0
F635
EDE6
E85A
E667
E85A
EDE6
F635

 データはエクセルを使って作りました。1MHzサンプリングなので、1行が1usecになっています。1サンプリングで1行のデータをリードするイメージです。

//  TITLE:					"adcfirTB.v"
//  MODULE NAME:			firフィルタテストベンチ
//  PROJECT CODE:			
//  AUTHOR:					********** (****@nakaharagiken.com)
//  CREATION DATE:			
//  REVISION HISTORY:  	    
//  SOURCE:            		
//  LICENSE:           		Copyright (c) 2021 nakaharagiken All rights reserved. 
//  DESCRIPTION:            
//  NOTES TO USER:      	
//  SOURCE CONTROL:  	    
//
//

`timescale 1ns/10ps		// 単位1nsec,分解能10psec

module adcfirTB;

parameter SYSCLK_PERIOD = 31.25; // 32MHz

//input
reg				rclock;									// 32MHz
reg				rnreset;								// リセット
reg				rsample;								// サンプリングクロック

reg	[14:0]		rsindata[0:15];
reg	[14:0]		rindata;

//output
wire [14:0]		wdacdata;

integer i;

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

//////////////////////////////////////////////////////////////////////
// Main
//////////////////////////////////////////////////////////////////////
initial
begin
	rclock <= 0;
	rnreset <= 0;
	rsample <= 0;
	rindata <= 0;

	$readmemh("C:/*****/*****/*****/firadc/stimulus/sindata.dat",rsindata);			// 16進データ

	repeat(10) @(posedge rclock);				// 初期化シーケンス
		rnreset <= 1;
		rsample <= 0;
		rindata <= 0;
	repeat(30) @(posedge rclock);


	forever begin
		for (i=0; i<16; i=i+1) begin				// 入力Sin波形分
			rindata = rsindata[i];
			rsample <= 1;
			repeat(1) @(posedge rclock);
			rsample <= 0;
			rindata <= rindata;
			repeat(31) @(posedge rclock);			// 31.25nsec*32 =1MHz
		end
	end


end


adcfir inst_adcfir(
	.clock		(rclock),		// (i)	32MHz
	.nreset		(nreset),		// (i)	nreset
	.fsclock	(rsample),		// (i)	シンボルクロック 1Msps
	.indat		(rindata),		// (i) [14:0] Q13 format input
	.outdat		(wdacdata)		// (o) [14:0] Q13 format output
);

endmodule

$readmemhでデータをファイルから読むのですが、ModelSimの場合、ファイルのアドレスは絶対アドレスで指定しなくてはならないようです。そして、$readmemhは16進数のリードを行います。

$readmembもあって、これはバイナリの2進数をリードします。

 このようにデータの入力にファイルを使う事で、シミュレータでの検証が非常に広範囲にできるようになります。また、今回の例とは逆にファイルへデータをセーブすることもできます。