Verilatorを始めてみた。
以下のサイトを参考にしました。
一番のメリットは、テストがC言語で記載ができることだと思った。もともとVerilogは苦手だし、C言語でテストの記載ができるのは非常に便利だ。
インストール
自分は、環境がUbuntuなので、簡単だった。
sudo apt-get install verilator
あと、波形表示のために、gtkwaveをインストールする
sudo apt install gtkwave
コーディング
何か実装してみる。今回は、周期的にLEDを点滅するモジュールを実装した。
module led_chika
(
input logic clk,
input logic reset_n,
output logic led_out
);
logic [1:0] counter = 2'h0;
always_ff @(posedge clk, negedge reset_n) begin
if (!reset_n) begin
counter <= 2'h0;
end else begin
counter <= counter + 1;
end
end
always_ff @(posedge clk, negedge reset_n) begin
if (!reset_n) begin
led_out <= 1'h0;
end else begin
if (counter == 0) begin
led_out <= ~led_out;
end
end
end
endmodule // counter
テストコード
次にled_chikaのテストコードを記載する。Cでテストコードが書けるなんて、なんて便利なんだ!!
このコードは、
にある「FSTをダンプする」を参考にしている。
#include <iostream>
#include <verilated.h>
#include "Vled_chika.h"
#include <verilated_fst_c.h>
int time_counter = 0;
int main(int argc, char** argv) {
Verilated::commandArgs(argc, argv);
// Instantiate DUT
Vled_chika *dut = new Vled_chika();
// Trace DUMP ON
Verilated::traceEverOn(true);
VerilatedFstC* tfp = new VerilatedFstC;
dut->trace(tfp, 100); // Trace 100 levels of hierarchy
tfp->open("simx.fst");
// Format
dut->reset_n = 0;
dut->clk = 0;
// Reset Time
while (time_counter < 100) {
dut->eval();
tfp->dump(time_counter); // 波形ダンプ用の記述を追加
time_counter++;
}
// Release reset
dut->reset_n = 1;
int cycle = 0;
while (time_counter < 500 && !Verilated::gotFinish()) {
if ((time_counter % 5) == 0) {
dut->clk = !dut->clk; // Toggle clock
}
if ((time_counter % 10) == 0) {
// Cycle Count
cycle ++;
}
// Evaluate DUT
dut->eval();
tfp->dump(time_counter); // 波形ダンプ用の記述を追加
time_counter++;
}
dut->final();
tfp->close();
}
ビルド/実行
コマンドラインでビルドと実行をする
verilator --cc --exe --trace-fst --trace-params --trace-structs --trace-underscore \
led_chika.v -exe test_led_chika.cpp
make -C obj_dir -f Vled_chika.mk
./obj_dir/Vled_chika
波形表示
gtkwave simx.fst
起動すると、何も表示されないが、TOP→led chika→Recurse Import→Appendをチェックすると、led chikaの信号を表示されることができる
信号を表示すると、
さらに、波形を全体表示するために、全体表示?のボタンを押す。以下の赤丸のボタンだ。
そうすると、波形が表示される!
https://github.com/y38y38/led_chika_verilator
これで、ガンガンコーディングして、ロジックを実装したいが、XilinxのIPの使い方も覚えたいし、どっちを勉強するか、悩みどころである。