使用Verilator仿真基于Verilog编写的testbench并用GTKWave查看波形

这篇具有很好参考价值的文章主要介绍了使用Verilator仿真基于Verilog编写的testbench并用GTKWave查看波形。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Verilator仿真过程简介

Verilator是一个开源的Verilog、SystemVerilog仿真EDA。

它进行仿真的第一步称为“verilate”,将编写好的.v/.sv文件转化成为C++编写的类和方法。

第二步则是建立C++运行环境wrapper file,在里面编写的main函数用于例化第一步里生成的和Verilator自带的仿真不可缺少的类,之后运行Verilator得到make文件.mk。

第三步则是用make命令调用外部编译器(gcc等)编译生成的.mk文件,得到可执行文件。

第四步运行可执行文件可以得到相关的.vcd/.fst波形文件和覆盖率报告。

二、新版本的Verilator

一般进行数字设计和验证都是编写Verilog的RTL代码,再编写verilog或者systemverilog的测试平台testbench,然后由VCS或者Modelsim等仿真器仿真。在新版本的Verilator(v5.002以上)里新增加了时序选项,支持延时语法和fork语句,使得用Verilog编写的testbench可以直接用Verilator仿真而不必在wrapper file里花时间设计激励,而只需在wrapper file里添加几句将波形和覆盖率写进文件的C++语句。

使用apt-get install verilator安装的不一定是最新版本,请参考官网给出的另外安装方式以获得最新版本。

查看Verilator版本的命令。

verilator --version

使用Verilator仿真基于Verilog编写的testbench并用GTKWave查看波形,EDA,c++,开源软件

 下面进入简单例子。

三、DUV的RTL代码和基于Verilog的testbench

待测设计是一个可变进制的计数器,根据输入信号ceil改变进制。以下是RTL代码,文件名为cnt_ceil.v

//这是一个根据ceil信号改变进制的计数器
//这句在用Verilator静态检查时每个模块都要加的,如果有些模块有而有些模块没有则会报错
`timescale 1ns/1ns
//模块
module cnt_ceil(
  input        clk,
  input        en,
  input        rst_n,
  input  [3:0] ceil,
  output [3:0] cnt,
  output       co
);
  reg [3:0] cnt_reg;
  always@(posedge clk,negedge rst_n)
    begin
      if(!rst_n)
        cnt_reg <= 'b0;
      else
        if(en)
          if(cnt_reg >= ceil)
            cnt_reg <= 'b0;
          else
            cnt_reg <= cnt_reg + 1'b1;
    end
  assign cnt = cnt_reg;
  assign co  = en && (cnt_reg==ceil);
endmodule

区别于采用VCS和Modelsim仿真,被例化的模块文件里是不需要时刻定义语句(timescale)的,而在Verilator的静态代码检查时却是需要的,如果仿真前有静态错误则会直接退出仿真,所以在仿真前可以先使用--lint-only -Wall选项来查看所有可能的error和warning并修改设计以消除隐患。

以下是基于Verilog的testbench代码,文件名为cnt_ceil_tb.v。

`timescale 1ns/1ns
module cnt_ceil_tb();
//输入信号
  reg        clk;
  reg        en;
  reg        rst_n;
  reg  [3:0] ceil;
//输出信号
  wire [3:0] cnt;
  wire       co;
//例化计数器
  cnt_ceil cnt_ceil_0(
    .clk   (clk),
    .en    (en),
    .rst_n (rst_n),
    .ceil  (ceil),
    .cnt   (cnt),
    .co    (co)
);
//初始化输入信号
  initial begin
    clk   = 1'b0;
    en    = 1'b0;
    rst_n = 1'b1;
    ceil  = 4'b1100;//12
  end
  initial begin//clk
    forever #1 clk = ~clk;
  end
  initial begin//en
    #1  en = 1'b1;
    #99 en = 1'b0;
  end
  initial begin//rst_n
    #10 rst_n = 1'b0;
    #1  rst_n = 1'b1;
  end
  initial begin//ceil
    #40 ceil = 4'b0110;//6
  end
  initial begin//finish
//重要的一句,在wrapper file的main函数里要能够识别到该完成语句作为结束运行的标志
    #110 $finish;
  end
endmodule

四、wrapper file的编写

该文件旨在提供一个main入口,用于执行对例化的设计的类的操作,文件名为sim_main.cpp

#include <verilated.h>
#include <verilated_vcd_c.h>
#include "Vcnt_ceil_tb.h"

int main(int argc, char** argv){
//构造环境对象,设计对象,波形对象
  VerilatedContext* m_contextp = new VerilatedContext;//环境
  VerilatedVcdC*    m_tracep   = new VerilatedVcdC;//波形
  Vcnt_ceil_tb*     m_duvp     = new Vcnt_ceil_tb;//设计
//波形配置
  m_contextp->traceEverOn(true);//环境里打开波形开关
  m_duvp->trace(m_trace,3);//深度为3
  m_trace->open("cnt_ceil_wf.vcd");//打开要存数据的vcd文件
//写入数据到波形文件里
  while (!m_contextp->gotFinish()){
  //刷新电路状态
    m_duvp->eval();
  //dump数据
    m_tracep->dump(m_contextp->time());
  //增加仿真时间
    m_contextp->timeInc(1);
  }
//记得关闭trace对象以保存文件里的数据
  m_tracep->close();
//释放内存
  delete m_duvp;
  return 0;
}

这是一个C++的wrapper,如果是systemC则需要包含不同的头文件。

五、执行仿真命令

运行Verilator生成make文件.mk。只需对顶层文件运行仿真。

-cc表示把后面的.v/.sv文件verilate成C++文件,-trace表示打开波形开关,--timing表示允许时序控制。-exe表示根据后面的文件来生成可执行文件。

verilator -cc -trace --timing cnt_ceil_tb.v -exe sim_main.cpp

进入包含生成文件的文件夹obj_dir。

cd ./obj_dir

make。调用外部gcc编译成可执行文件。

make -f Vcnt_ceil_tb.mk

运行可执行文件。

./Vcnt_ceil_tb

用GTKWave查看波形。

gtkwave cnt_ceil_wf.vcd

使用Verilator仿真基于Verilog编写的testbench并用GTKWave查看波形,EDA,c++,开源软件

 GTKWave的安装文章来源地址https://www.toymoban.com/news/detail-698095.html

sudo apt-get install gtkwave

到了这里,关于使用Verilator仿真基于Verilog编写的testbench并用GTKWave查看波形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包