はじめに

ここでは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

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

03

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

04

iverilog -o DividerForDynamicLighting DeviderForDynamicLighting.v t_DividerForDynamicLighting.v

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

05

このようにずっとシミュレーションしているとき,いったん止めるにはCtrlキー+Cを押します.そうすると一旦シミュレーションが止まります.下の図では1454384701908単位時間までのシミュレーションが行われたものです.このように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で波形を確認することで,効率的にシミュレーションを行えます.