1.参考:【一生一芯】搭建verilator仿真环境 - 老吴家的小阿哲 - 博客园 (cnblogs.com)
2.verilator探幽
(1)verilator工作原理
(2)一个简单的例子
1.将verilog代码写入文件top.v
2.将C++代码写入文件sim_main.cpp
3.使用下面的命令来运行Verilator:
verilator --cc --exe --build -j 0 -Wall sim_main.cpp top.v
4.使用 ./obj_dir/Vtop 来运行Verilator生成的可执行程序
(3)稍微复杂的例子
在Verilog中,assign
是一个关键字,用于为信号赋值
1.编写top.v:
module top (
input a,
input b,
output f
);
assign f = a ^ b;
endmodule
2.编写main.cpp:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <assert.h>
#include "verilated_vcd_c.h" // 生成vcd文件使用
#include "Vtop.h"
#include "verilated.h"
int main (int argc, char **argv)
{
if (false && argc && argv) {}
const std::unique_ptr<VerilatedContext> contextp{new VerilatedContext}; //创建一个动态分配的 VerilatedContext 对象,并使用 std::unique_ptr 来确保在不再需要时自动释放内存
std::unique_ptr<Vtop> top{new Vtop{contextp.get()}};
contextp->commandArgs(argc, argv);
contextp->traceEverOn(true); // 生成波形文件使用,打开追踪功能
VerilatedVcdC* ftp = new VerilatedVcdC; // vcd对象指针
top->trace(ftp, 0); // 0层
ftp->open("wave.vcd"); //设置输出的文件wave.vcd
int flag = 0;
while (!contextp->gotFinish() && ++flag < 20)
{
int a = rand() & 1;
int b = rand() & 1;
top->a = a;
top->b = b;
top->eval();
printf("a = %d, b = %d, f = %d\n", a, b, top->f);
assert(top->f == (a ^ b)); //验证top->f == (a ^ b),若结果为假,程序终止,并输出错误信息
contextp->timeInc(1); // 时间+1,推动仿真时间
ftp->dump(contextp->time()); // dump wave dump 方法通常用于将当前时间的信号状态写入到波形文件中
}
top->final();
ftp->close(); // 必须有
return 0;
}
3.使用如下命令:
verilator --cc --exe --build -Wall --trace top.v main.cpp
4.执行生成的Vtop可执行文件
./obj_dir/Vtop
5.shell观察波形
gtkwave wave.vcd
1.top.v:
module top (
input a,
input b,
output f
);
assign f = a ^ b;
initial begin
if ($test$plusargs("trace") != 0) begin //在仿真开始时检查命令行参数,如果存在 "trace" 参数,则设置波形文件并将相关的信号状态写入到波形文件中
$display("[%0t] Tracing to wave.vcd...\n", $time);
$dumpfile("wave.vcd");
$dumpvars();
end
$display("[%0t] Model running...\n", $time);
end
endmodule
2.main.cpp:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <assert.h>
#include "Vtop.h"
#include "verilated.h"
int main (int argc, char **argv) {
if (false && argc && argv) {}
const std::unique_ptr<VerilatedContext> contextp{new VerilatedContext};
std::unique_ptr<Vtop> top{new Vtop{contextp.get()}};
contextp->commandArgs(argc, argv);
contextp->traceEverOn(true); // 生成波形文件使用,打开追踪功能
int flag = 0;
while (!contextp->gotFinish() && ++flag < 20) {
int a = rand() & 1;
int b = rand() & 1;
top->a = a;
top->b = b;
top->eval();
printf("a = %d, b = %d, f = %d\n", a, b, top->f);
assert(top->f == (a ^ b));
contextp->timeInc(1); // 时间+1,推动仿真时间
}
top->final();
return 0;
}
3.使用如下命令:
verilator --cc --exe --build -Wall --trace top.v main.cpp
4.执行生成的Vtop可执行文件
./obj_dir/Vtop
5.shell观察波形
gtkwave wave.vcd
标签:仿真,--,top,contextp,一芯,int,Vtop,include,verilator
From: https://www.cnblogs.com/xuanbol/p/17989755