IcarusでVerilogシミュレーション | でばぐめ -IT技術メモ-

でばぐめ -IT技術メモ-

主にハードウェア/ソフトウェアのプログラミングに関するブログです。

Icarus Verilogをインストールしたので、簡単な回路をかいて実行してみました。

外部からのイベントをカウントする回路(event_cnt.v)とテストベンチ(tbench.v)
を使用して実行してみます。


event_cnt.v

module event_cnt(clk, rstb, kick, count);

input        clk;   // クロック
input        rstb;  // リセット
input        kick;  // イベント
output [3:0] count; // カウント値

reg    [3:0] count;

always @(posedge clk or negedge rstb) begin
  if(!rstb) begin
    count <= 4'h0;
  end
  else if(kick) begin //イベントでカウントアップ
    count <= count + 1;
  end
end
endmodule

tbench.v

`timescale 1ns/1ns

module tb_event_cnt;
reg        clk;   // クロック
reg        rstb;  // 非同期リセット
reg        kick;  // イベント
wire [3:0] count; // カウント値

parameter CLK_CYC = 100;

event_cnt event_cnt (
  .clk   (clk),
  .rstb  (rstb),
  .kick  (kick),
  .count (count)
);

initial clk = 0;
always begin
  #(CLK_CYC/2) clk = ~clk;
end

initial begin
                 rstb <= 0;
                 kick <= 0;
  #150           rstb <= 1;
  repeat(3)
  @(posedge clk) ;
  @(posedge clk) kick <= 1;
  @(posedge clk) kick <= 0;
  @(posedge clk) ;
  @(posedge clk) ;
  @(posedge clk) kick <= 1;
  repeat(15)
  @(posedge clk) ;
  @(posedge clk) kick <= 0;
  repeat(3)
  @(posedge clk) ;
  $finish;
end

initial begin
  $monitor($time, " rstb=%b, kick=%b, count=%d",
           rstb,kick,count);
  $dumpfile("waves.vcd");
  $dumpvars(0,tb_event_cnt);
end
endmodule



Icarus Verilog実行

% iverilog -o event_cnt event_cnt.v tbench.v

コンパイルしてオブジェクトファイル(event_cnt)を作成します。

vvpコマンドで実行すると$monitorの結果が表示されます。

% vvp event_cnt VCD info: dumpfile waves.vcd opened for output. 0 rstb=0, kick=0, count= 0 150 rstb=1, kick=0, count= 0 450 rstb=1, kick=1, count= 0 550 rstb=1, kick=0, count= 1 850 rstb=1, kick=1, count= 1 950 rstb=1, kick=1, count= 2 1050 rstb=1, kick=1, count= 3 1150 rstb=1, kick=1, count= 4 1250 rstb=1, kick=1, count= 5 1350 rstb=1, kick=1, count= 6 1450 rstb=1, kick=1, count= 7 1550 rstb=1, kick=1, count= 8 1650 rstb=1, kick=1, count= 9 1750 rstb=1, kick=1, count=10 1850 rstb=1, kick=1, count=11 1950 rstb=1, kick=1, count=12 2050 rstb=1, kick=1, count=13 2150 rstb=1, kick=1, count=14 2250 rstb=1, kick=1, count=15 2350 rstb=1, kick=1, count= 0



関連書籍

入門Verilog HDL記述―ハードウェア記述言語の速習&実践 (Design wave b.../小林 優
¥3,360
Amazon.co.jp

Verilog HDL記述を習得するには、この1冊で十分と思います。
半導体理工学研究センター(STARC)が策定した「設計スタイルガイド」に準拠して
いるので、一般的なスタイルも身につきます。

ディジタル数値演算回路の実用設計―四則演算、初等超越関数、浮動小数点演算の作りかた (Desi.../鈴木 昌治
¥3,570
Amazon.co.jp
内容は実用的で、すばらしい書籍です。
製品差異化の重要な要素となる高速化や小型化を図るため、さまざまな視点でのアプローチが
紹介されています。
論理合成ツールがかしこくなり、演算回路構成を意識せずとも、それなりの回路は作れますが、
回路構成を知っているのと知らないのとでは、面積や速度でかなり回路差がでます。
この値段でこの密度は、かなりお得です。