Icarus Verilog というオープンソースの Verilog シミュレータを使ってみる.
ドキュメントは ここ で読める.
目次を見ると,上から順番に 「Installation Guide」,「Getting Started With Icarus Verilog」,「Simulation Using Icarus Verilog」 と並んでいる.
ドキュメントがしっかり書かれていそうで嬉しい.これだけでもう動かせそうな気分になってくる.
とりあえずこの 3 つを実施してみることにする.
Installation Guide の該当する箇所の手順に従いコマンドを実行する.
環境は WSL 2 + Ubuntu 22.04.4 LTS.
まずは git から Icarus Verilog のソースをクローンしてくる.
ブランチはガイドに書いてある v11-branch
を使う.
リポジトリを見てみると既に v12-branch
もあるようだが,まあ,ガイドに従うことにする.
% git clone https://github.com/steveicarus/iverilog.git
% cd iverilog
% git checkout --track -b v11-branch origin/v11-branch
次に,autoconf.sh
を使ってコンフィグレーションファイルを作る.
autoconf
と gperf
が必要だったのでインストールした.
これをやっている途中,「そもそも sudo apt install iverilog
でいいのでは...?」 と気づいた.
でも,もうこの方針で行くことにしてしまったのでそのまま進める.
% sudo apt install autoconf
% sudo apt install gperf
% sh autoconf.sh
そのまま流れでビルドとインストールを行う.
今度は flex
と bison
をインストール.
ガイドによると g++
と gcc
も必須とのことだが,こちらは流石にインストール済だった.
% sudo apt install flex
% sudo apt install bison
% ./configure
% make
% sudo make install
これで iverilog
がインストールされた.
which iverilog
してみると /usr/local/bin
にインストールされていた.
インストールできたので,次は動かしてみる.
ドキュメントでは,サンプルのデザインとしてカウンタ回路とそのテストベンチを用意し,そのシミュレーション方法を記載している.
サンプルでは Verilog の記述だが,なんとなく記法がやぼったい.
せっかくなので SystemVerilog の記述に書き直して動かせるか試してみようと思う.
module counter (
output logic [7:0] out,
input logic clk,
input logic rstn
);
always_ff @(posedge clk or negedge rstn) begin
if (~rstn) begin
out <= 8'h0;
end
else begin
out <= out + 8'd1;
end
end
endmodule // counter
module test;
/* Make a reset that pulses once. */
logic reset = 1;
initial begin
# 17 reset = 0;
# 11 reset = 1;
# 29 reset = 0;
# 11 reset = 1;
# 100 $finish;
end
/* Make a regular pulsing clock. */
logic clk = 0;
always #5 clk = ~clk;
logic [7:0] value;
counter c1 (value, clk, reset);
initial begin
$monitor("At time %t, value = %h (%0d)", $time, value, value);
end
endmodule // test
いざ動かしてみる.
Icarus Verilog では,コンパイルとシミュレーションのフェーズでそれぞれコマンドが分かれているようだ.
コンパイルは iverilog
で行う.
SystemVerilog をコンパイルするときは -g2012
のオプションをつける.
出力ファイル名は -o
で指定する.
% iverilog -g2012 counter.sv counter_tb.sv -o my_design
シミュレーションは vvp
というコマンドで実施する.
さっき出力したファイルを指定する.
% vvp my_design
実行したところ,以下のように動いた.やった~.
At time 0, value = xx (x)
At time 17, value = 00 (0)
At time 35, value = 01 (1)
At time 45, value = 02 (2)
At time 55, value = 03 (3)
At time 57, value = 00 (0)
At time 75, value = 01 (1)
At time 85, value = 02 (2)
At time 95, value = 03 (3)
At time 105, value = 04 (4)
At time 115, value = 05 (5)
At time 125, value = 06 (6)
At time 135, value = 07 (7)
At time 145, value = 08 (8)
At time 155, value = 09 (9)
At time 165, value = 0a (10)
この章は,ななめ読みしただけだがいまいちよく分からなかった.
効率的なコンパイルの方法について語っているように見えるが...
ちょっと実際そういうテクニックが必要なケースに突き当たってみないと分からないなという感じ.
とりあえず簡単な RTL は動かせたのでひとまず満足.
2025/02/27
戻る