默认顶层模型名称为top,环境名称为contextp
const std::unique_ptr<VerilatedContext> contextp{new VerilatedContext};
const std::unique_ptr<Vxxx> top{new Vxxx{contextp.get(), "TOP"}};
// xxx为自定义待测模块名,由Makefile生成类在Vxxx.h中
仿真信号的操控
总共3种语句:
- 信号延时:
contextp->timeInc(1);
,数字为设定的时间宽度,单位默认ps - 信号赋值:
top->xxx = xxx;
,xxx为信号名称 - 模型同步:
top->eval();
,就是Evaluate Model
前两种负责改变仿真状态,最后的模型同步负责保存前两种的状态改变,同步到波形图中。若没有最后的模型同步,仿真信号不会更新到波形图中。
前两种语句的顺序无所谓。信号延时表示以之前top->eval()
记录的状态保持多少时间;信号赋值表示再时延之后信号应该是什么值。
对于每次模型同步,信号延时语句的数值会相加;而信号赋值则会后语句覆盖前语句,举例如下
① top->eval()前单次信号赋值和时延:
// init signal
top->Z_i = 1;
top->rst_n = 0;
top->clk = 0;
top->eval(); // 别忘了这一个,初始的赋值
contextp->timeInc(1); // 保持当前信号情况,持续1ps时间
top->clk = !top->clk; // 信号改变
top->Z_i = 2;
top->eval(); // 模型同步
可见,同步了1ps
② top->eval()前多次信号赋值和时延:
// init signal
top->Z_i = 1;
top->rst_n = 0;
top->clk = 0;
top->eval(); // 别忘了这一个,初始的赋值
contextp->timeInc(1); // 保持当前信号情况,持续1ps时间
top->clk = !top->clk; // 信号改变
top->Z_i = 2;
contextp->timeInc(1);
top->Z_i = 1;
top->eval(); // 模型同步
看到clk为1(若再取反则变为0);Z_i为1
③ 用两个top->eval()分别记录两次状态变化:
// init signal
top->Z_i = 1;
top->rst_n = 0;
top->clk = 0;
top->eval();
contextp->timeInc(1); // 保持当前信号情况,持续1ps时间
top->clk = !top->clk; // 信号改变
top->Z_i = 2;
top->eval();
contextp->timeInc(1);
top->clk = !top->clk;
top->Z_i = 1;
top->eval(); // 模型同步
标签:模块,clk,top,contextp,信号,eval,testbench,verilator,timeInc
From: https://www.cnblogs.com/elucidator-xrb/p/17062196.html