はじめに

ここではvvpによるシミュレーションの方法とvvpの操作方法について説明します.vvpによりシミュレーション結果をvcdファイルに出力できますが,always文などを記述した場合には無限波形となるため,途中でシミュレーションいったん止めたり,再開したり,完全に終了したりすることがあります.また,生成されたvcdファイルをgtkwaveで効率的に確認する方法についても説明します.

環境

  • OS: Windows 11(Windows 10でも問題なく動作するものと思われます)
  • vvpおよびgtkwave: Icarus Verilog-v12-20220611に含まれているもの

シミュレーション方法

はじめにシミュレーションまでの流れを説明します.まずは①Verilogのコードとそのテストベンチを記述します.その後,vcdファイルを生成するため,②vvpコマンドを使います.最後に③gtkwaveにより波形の確認をします.テストベンチを少し変えながらシミュレーションをする場合,①~③を行き来することとなります.

Verilogのコードとテストベンチの記述

ではコードとテストベンチを記述します.ここでは27MHzのクロック(iClk)信号を分周し,1kHzのクロック(oClk)にする分周器をテーマとします.下に示すコードは27MHzのiClkを1kHzのoClkにする分周器です.ファイル名をDividerForDynamicLighting.vとします.

module DividerForDynamicLighting(iClk, oClk);
	input iClk;
	output oClk;
	
	reg [13:0] cnt = 14'd13599;
	
	reg oClk = 1'b1;
	
	always @(negedge iClk)
	begin
		if(cnt == 14'd13599)
		begin
			oClk <= ~oClk;
			cnt <= 14'h0000;
		end
		else
		begin
			cnt <= cnt + 14'h0001;
		end
	end
endmodule

下のテストベンチは27MHzのiClkをシミュレーションするものです.ファイル名をt_DividerForDynamicLighting.vとします.

`timescale 1ns / 1ps

module t_DividerForDynamicLighting;

	// Inputs
	reg iClk;

	// Outputs
	wire oClk;

	// Instantiate the Unit Under Test (UUT)
	DividerForDynamicLighting uut (
		.iClk(iClk), 
		.oClk(oClk)
	);

	initial begin
        $dumpfile("t_DividerForDynamicLighting.vcd");
        $dumpvars(0, t_DividerForDynamicLighting);
		iClk = 0;
		forever
			#18.518518 iClk = ~iClk;
	end      
endmodule

vvpの操作

 上記2つのファイルがある場所をコマンドプロンプトで開きます.その後,ソースファイル等があるフォルダへcdコマンドを使って移動します.ソースファイル等があるフォルダをコピーするには下の図のようにまずはそれらファイルのある場所をエクスプローラで開き,オレンジの丸で囲まれた領域をクリックします.

01

 

そうすると,下の図のようにフォルダの絶対パスが得られますので,Ctrlキーと+Cでコピーします.

02

 

コピーした絶対パスを使ってフォルダを移動します.cdコマンドに続き,先ほどコピーした絶対パスをCtrlキー+Vで貼り付けます.

03

 

次にシンセサイズをします.下の図のように出力ファイルをDividerForDynamicLight,そしてコードとテストベンチを指定してシンセサイズします.

04

 

続いてvvpでシミュレーションします.下の図のようにvvp DividerForDynamicLightingと打ち込みます.このシミュ―レーションでは無限波形が含まれているため,ずっとシミュレーションをし続けます.

05

 

このようにずっとシミュレーションしているとき,いったん止めるにはCtrlキー+Cを押します.そうすると一旦シミュレーションが止まります.下の図では533354144625単位時間までのシミュレーションが行われたものです.このようにCtrlキー+Cでシミュレーションを一旦停止するとともに,t_DividerForDynamicLightingファイルに吐き出すことができます.逆に言えば,Ctrlキー+Cをしないとファイルに吐き出されない可能性がありますので注意をしてください.

06

 

さらに続けてシミュレーションをしたいときには contコマンドを使います.これで再び先ほどのシミュレーションの続きを行います.下の図ではcontコマンドを実行後,ある程度時間がたったところでCtrlキー+Cを押し,再び一時停止をしています.その結果,時間が増えているのが分かります.

07

 

シミュレーションを完全に終えたいときには下の図のようにfinishコマンドを使います.これでvvpは終了になります.ただし,後述のgtkwaveで波形を確認したときに時間を追加してシミュレーションしたいことがあると思います.その場合には別のコマンドプロントを開き,gtkwaveを起動しておくとよいです.

08

gtkwaveによる波形の確認

 

下の図は波形の確認をするためにgtkwaveを起動している様子です.

09

 

先ほど説明したとおり,vvpにより追加でシミュレーションをした場合にはvvpのcontコマンドとCtrlキー+Cを使いつつ,下の図にあるアイコンをクリックしてください.閲覧できるシミュレーションの時間を延ばすことができます.

10

 

以上のように,vvpによるシミュレーションをしながらgtkwaveで波形を確認することで,効率的にシミュレーションを行えます.

JSN Teki is designed by JoomlaShine.com