I like fpga

change the world by fpga
2021/05/22

Start Verilator

VERILOG   

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の使い方も覚えたいし、どっちを勉強するか、悩みどころである。

« »