vcd ファイルをダンプする単純なカウンター Verilog コードを次に示します。ここから 改作。
以下のコードは 20 サイクル実行されます。しかし、Verilog コードの $stop 行のコメントを外すと、シミュレーション中に次のエラーが発生します。
%Error: counter.v:23: Verilog $stop
Aborting...
Aborted (core dumped)
$stop で正常に終了できるように、この問題を修正するにはどうすればよいですか? gotFinish() を gotStop() に置き換えようとしましたが、次のエラーが発生しました。
"gotStop() is not a member of Verilated"
これは tb.cpp で、上部にコンパイル/実行手順も記載されています。
// generate: verilator -Wall --cc --trace counter.v --exe tb.cpp
// compile: make -C obj_dir -f Vcounter.mk Vcounter
// run: obj_dir/Vcounter
#include "Vcounter.h"
#include "verilated.h"
#include "verilated_vcd_c.h"
int main(int argc, char **argv, char **env) {
int i;
int clk;
Verilated::commandArgs(argc, argv);
Vcounter* top = new Vcounter;
Verilated::traceEverOn(true);
VerilatedVcdC* tfp = new VerilatedVcdC;
top->trace (tfp, 99);
tfp->open ("counter.vcd");
top->clk = 1;
top->rst = 1;
top->cen = 0;
top->wen = 0;
top->dat = 0x55;
// run simulation for 20 clock cycles
for (i=0; i<20; i++) {
top->rst = (i < 2);
tfp->dump (2*i);
top->clk = !top->clk; // negedge
top->eval ();
tfp->dump (2*i+1);
top->clk = !top->clk; // posedge
top->eval ();
top->cen = (i > 5);
top->wen = (i == 10);
if (Verilated::gotFinish()) break;
}
tfp->close();
exit(0);
}
これが counter.v です。
module counter #(parameter WIDTH = 8)(
input wire clk,
input wire rst,
input wire cen,
input wire wen,
input wire [WIDTH-1:0] dat,
output reg [WIDTH-1:0] o_p,
output reg [WIDTH-1:0] o_n
);
integer icount;
initial begin
icount = 0;
end
always@(posedge clk) begin
icount <= icount + 1;
if(icount==10) $display("working till 10");
//if(icount==12) $stop;
end
always @ (posedge clk or posedge rst)
if (rst) o_p <= {WIDTH{1'b0}};
else o_p <= wen ? dat : o_p + {{WIDTH-1{1'b0}}, cen};
always @ (negedge clk or posedge rst)
if (rst) o_n <= {WIDTH{1'b0}};
else o_n <= wen ? dat : o_n + {{WIDTH-1{1'b0}}, cen};
endmodule