Verdi/Coverage tool 学习 第1节(入门篇)

2023-11-05

目录

1. Verdi-Coverage 工具概述  

2.  VCS使用实例

3.  VCS中的覆盖率分析

3.1  覆盖率类型

3.2  Coverage Database的产生

3.3  其他的vcs编译和仿真中的选项

3.4  有时需要Merge 多个Coverage 到一起

4.  查看Coverage的方法

4.1  使用URG 查看

4.2  使用verdi查看

4.3  使用DVE查看


1. Verdi-Coverage 工具概述  

VCS对应的waveform工具有DVE和Verdi, DVE因为是原生的,所以VCS对DVE非常友好。但DVE已经过时了,其对uvm等新feature支持的不好。Verdi是Debussy公司的产品,现在已被Synopsys收购并着力发展,说以Verdi是未来的潮流。所以此文的dump fsdb波形和查看coverage都用verdi。具体来说VCS两步是:

1. 编译verilog文件成为一个可执行的二进制文件命令为:vcs source_files

2. 运行该可执行文件:./simv

2.  VCS使用实例

此例子涉及task和$value$plusargs等verilog语法,忘记用法的话可以查阅资料再复习下。

具体vcs命令是:

vcs -sverilog -R -fsdb -ucli -do run_vcs.tcl -cm line+tgl+branch+assert -cm_name test1 +test_name=test1 tb_top.v

vcs -sverilog -R -fsdb -ucli -do run_vcs.tcl -cm line+tgl+branch+assert -cm_name test2 +test_name=test2 tb_top.v

顶层 tb_top.sv 文件内容如下:

module tb_top();
reg clk, rst, load;
wire [3:0] out;
always #5 clk=~clk;

reg [255:0] test_name;
initial
begin
    clk=1'b0; rst=1'b0; load=0;
    #30;
    $value$plusargs('test_name=%s',test_name);
    if(test_name=='test1')
        test1;
    else if(test_name=='test2')
        test2;
    #70;
    $finish;
end

task test1;
    rst=1'b1;
    #10 load=0;
endtask

task test2;
    rst=1'b1; load=1;
    #10 load=0;
endtask

counter u_counter(.reset(rst),
    .clk(clk),
    .load(load),
    .load_value(4'h8),
    .q(out));
endmodule

module counter(reset,clk,load,load_value,q);
input reset,clk;
input load;
input [3:0] load_value;
output[3:0] q;
reg[3:0]q;
reg[3:0]count;

always@(posedge clk)
    if(!reset) 
        q<=4'h0;
    else if(load)
        q<= load_value;
    else if(q==4'b1111)
        q<=4'b0;
    else
        q<=q+1;
endmodule

 文件 run_vcs.tcl内容如下:

run_vcs.tcl:
config timebase 1ns
scope tb_top
run 1ns
call \$fsdbDumpfile('counter.fsdb');
call \$fsdbDumpvars(0,tb_top);
call \$fsdbDumpSVA;
# Run to completion
run
quit

verdi -cov -covdir simv.vdb/ &

简单解释一下这里的选项:-sverilog是说支持sv语法;-R表示编译后立即执行;-fsdb表示dump fsdb文件 ;-ucli -do run_vcs.tcl表示要执行这个仿真tcl控制; -cm line+tgl+branch+assert表示 coverage覆盖line/toggle/branch/assert ;-cm_name  test1表示生成coverage的一个test的目录名称test1(仿真后会生成simv.vdb/snps/coverage/db/testdata/test1);+test_name 表示要传递给TB一个test_name 参数。这个例子运行后,产生simv.vdb/snps/coverage/db/testdata/test1 和simv.vdb/snps/coverage/db/testdata/test2 两个 test的coverage文件,用verdi打开是这样的界面:

VCS仿真和多个test用urg工具生成coverage文件verdi查看

3.  VCS中的覆盖率分析

3.1  覆盖率类型

VCS在仿真过程中,也可以收集Coverage Metric(覆盖率度量)。其中覆盖率类型有:

1)Code Coverage:包括line,condition, branch, toggle和FSM coverage。

2)Functional Coverage:包括covergroup,assert 。

3.2  Coverage Database的产生

包含所有的有关coverage的信息,默认放在simv.vdb文件夹下。db中的默认路径是,snps/coverage/db/testdata/line.verilog.data.xml(fsm/cond/tgl/branch等xml信息)。

3.2.1 在编译命令中

vcs [cover_options] [compile_options] source.v

[cover_options]:           -cm   line+cond+tgl+fsm+branch+assert

                                  -cm_dir  在compile options中改变simv.vdb文件夹的位置。

                                  -cm_name  指定testname。主要改变testname在db中的命名。

3.2.2  在仿真过程中

simv [cover_options] [run_options]

[cover_options]:           -cm line+cond+tgl+fsm+branch+assert

[run_options] :             指定 runtime options。

3.3  其他的vcs编译和仿真中的选项

  -cm_hier,在编过程中,指定收集coverage的scope。(格式可以包含正则表达式,语句可以+tree -tree -moduletree等)
  -cm_assert_hier,在编译过程中,只是指定不收集coverage的assert hier。其中hier的表示,+/- module,+/- tree,+/-assert
  -cm_count,在gui和urg report中,显示次数,比如toggle的次数。
  -cm_glitch period,不收集一定范围的glitch的coverage。simulation option
  -cm_start/stop,指定coverage收集的时间,simulation option coverage group相关的option;
  -covg_disable_cg,关闭所有的coverage group的收集urg生成report中的option:
  -dir,指定需要拿到的db的hier,
  -dbname,指定输出的merge db的hier
  -elfile,指定exclusive的file,这样更好计算coverage。
  -elfilelist 忽略中每一个.el文件。(Specifies a file containing a list of exclude files)
  -noreport,不输出最终的report,只是merge db
  -format text/both,指定report的输出格式
  -matric [line,cond,fsm,tgl,branch,assert]执行计算的coverage类型
  -parallel,并行merge
  -full64,以64bit的程序进行merge
  -plan,-userdata,-userdatafile,-hvp_no_score_missing,指定hvp相关的生成信息。

3.4  有时需要Merge 多个Coverage 到一起

实际工程中urg除了生成coverage报告,还经常要把几个仿真产生的vdb文件merge到一起,三个目的:

1. 实现比较高的coverage
2. 让verdi load coverage速度大大提高(我们几百个test下来,merge后load只要几分钟,而不merge需要半个到一个小时)
3. 不同level testbench跑出来的结果需要merge到一起(前公司用过把block的merge到system level)
   这个merge+生成coverage命令大体是这样的
   urg -full64 -metric line+tgl+cond+fsm+assert+branch -warn none -dbname .vdb -dir simv.vdb -elfile 
   注意:其中-dir之后的第一个vdb会被认为是base data,如果产生其他vdb的RTL与base不同,将不能被Merge进来
   verdi查看coverage命令:**verdi -cov -covdir .vdb &**

如下是某个工程中使用的生成coverage并merge若干vdb文件到vcs_sim_exe_total.vdb的命令:

urg -full64 -parallel -show ratios -show tests -dir /proj/vcs_sim_exe_merge.vdb /proj/vcs_sim_exe _bak.vdb -hier /proj/dut_hier -elfilelist /proj/elfilelist.el -plan /proj/vplan/DUT.hvp -dbname /proj/vcs_sim_exe_total.vdb -report /proj/rpt/4332 -log /proj/gen_cov_dut.log

 这里特别说明下这个选项: -hier /proj/dut_hier 

-hier表示只针对dut_hier中定义的(URG has an option, -hier, that accepts a subset of the controls that can be used in the compile-time -cm_hier file.)spec说不太常用。

4.  查看Coverage的方法

4.1  使用URG 查看

  • 使用urg处理后查看:urg处理,默认生成urgReport目录。
  • 具体命令: urg -full64  -dir  simv.vdb
  • urgReport目录下firefox浏览器查看tests.html

 4.2  使用verdi查看

verdi -cov -covdir simv.vdb   

847278-20161121195724909-1080973272.png

 4.3  使用DVE查看

dve -covdir simv.vdb

847278-20161121195733706-21158846.png

感谢大佬的分享!!!

coverage report - 纟彖氵戋 - 博客园 (cnblogs.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Verdi/Coverage tool 学习 第1节(入门篇) 的相关文章

  • LINGO求解规划问题代码

    文章目录 线性规划 标量线性规划 矩阵线性规划 非线性规划 无特殊限制 整数规划 01规划 写在开头 LINGO默认所有变量是非负的 LINGO中没有严格的 lt 和 gt lt 代表 lt gt 代表 gt LINGO不区分变量的大小写
  • CentOS7.6 编译安装LNMP+Zabbix5.0

    一 服务器信息 操作系统 CentOS Linux release 7 6 1810 Core 环境 内网环境 无公网出口 YUM源 本地yum MySQL版本 5 7 32 Nginx版本 nginx 1 22 0 PHP版本 php 7
  • 在前端vue项目引入less,使用less,在less引用外部文件,在less中使用变量

    在前端vue项目引入less 使用less 在less引用外部文件 在less中使用变量 一 less是什么 二 操作步骤 1 引入库 2 设置style的lang属性 3 使用less less 中的 calc 总结 一 less是什么
  • 不带头结点的单链表c语言,不带头结点的单链表的实现(C语言)

    不带头结点的单链表的实现 C语言 不带头结点的单链表的实现 C语言 链表中的数据是以结点来表示的 每个结点的构成 元素 数据元素的映象 指针 指示后继元素存储位置 元素就是存储数据的存储单元 指针就是连接每个结点的地址数据 以 结点的序列
  • Zabbix的模板管理与配置

    Zabbix的模板管理与配置 一 查看默认模板的配置项 1 打开客户端信息配置界面 2 选择默认模板的监控项 二 服务端获取客户端的监控项 1 获取客户端系统相关监控项 2 获取客户端硬盘信息等相关监控项 三 创建自定义监控项的key 1

随机推荐

  • unity的lineRenderer

    本文转载自 http blog csdn net zuoyamin article details 8997729 LineRenderer线渲染器主要是用于在3D中渲染线段 虽然我们也可以使用GL图像库来渲染线段 但是使用LineRend
  • MCP2515板级驱动

    MCP2515板级驱动 前言 一 MCP2515简述 二 硬件连接 三 驱动源码 前言 在需要多路CAN接口应用场景 可选方案一般为带CAN接口的协处理器或者是独立的CAN控制器 独立的CAN控制器常用的有SJA1000 MCP2515等
  • 工具、学习网站

    目录 图片处理工具 1 BgRemover 在线图片去底工具 2 Convertio 文件转换器 3 视频转音频 4 视频转 Gif 5 传图识色 6 本地图片在线存储引用 Image Upload 7 RGB CMYK 转换工具 各大工具
  • 单链表实现

    代码 编写程序实现单向链表数据结构 public class Node Object data Node next public class MyLinkedList Node header 添加数据的方法 删除数据的方法 修改数据的方法
  • 【精】【Java8】===两个List集合取交集、并集、差集

    业务场景 根据用户查询权限 入参 UserCode lastQueryTime 上次查询时间 出参 权限变化的列表 oldList 上次查询到的权限列表 currList 当前查询到的权限列表 比对两个list找出 移除和增加的权限加以标识
  • Idea登录Github invalid authentication data. 404 Not Found-Not Foun

    转发地址 点击我
  • 用git拉代码

    1 新建远程仓库 下载和安装git 傻瓜方式next 登录或注册账号 进入界面创建仓库 1 2添加ssh公钥并下载项目 用vscode打开随便建一个文件 1 3git创建分支和切换分支 相当于分支是队员们的一套代码 主支是组长的 队员在分支
  • Springboot Thymeleaf Html转Pdf

    新建项目 说明 用itextpdf写pdf 样式实在是太折磨了 这里选用Thymeleaf模板生成html转pdf html css写样式排版好太多了 引入依赖
  • python爬虫--beautifulsoup使用介绍

    简单来说 Beautiful Soup是python的一个库 最主要的功能是从网页抓取数据 官方解释如下 Beautiful Soup提供一些简单的 python式的函数用来处理导航 搜索 修改分析树等功能 它是一个工具箱 通过解析文档为用
  • 如何解决 Spring JPA @Table 和 @Column 失效的问题

    问题 下面的代码 我们使用 Spring JPA 作为数据库访问层 并且用 Table 和 Column 定义了表和列名 但是 Hibernate 给出的 SQL 语句并没有使用我们定义的名称 节点 Entity Table name No
  • 2021江苏连云港高考成绩查询时间,2021连云港市地区高考成绩排名查询,连云港市高考各高中成绩喜报榜单...

    距离2018年高考还有不到一个月的时间了 很多人在准备最后冲刺的同时 也在关心高考成绩 2018各地区高考成绩排名查询 高考各高中成绩喜报榜单尚未公布 下面是往年各地区高考成绩排名查询 高考各高中成绩喜报榜单 想要了解同学可以参考下 同时关
  • 实现vector--模板

    在这里 我把类函数定义与声明分开了 以下是类定义与类函数的声明 vector h pragma once include
  • iOS APP上架流程详解

    iOS APP上架流程详解 前言 作为一名 iOS 开发工程师 APP 的上架是必备技能 iOS 上架的流程主要可以简单总结为 一个包 两个网址 三个证书 一个包 iPA 包 上架用的 两个网址 1 gt https itunesconne
  • 【管理篇 / 配置】❀ 06. 日志与监控 ❀ FortiGate 防火墙

    简介 在这个实验里 你将在FortiGate飞塔防火墙本地配置日志设置 配置警告邮件和显示日志 在防火墙上配置日志 为了记录网络活动 你必须在FortiGate配置日志 在这人练习里 你将配置日志设置 包括威胁权重以及在防火墙启用日志 使用
  • 【BUG】Windows配置spark运行cmd时报错:WARN ProcfsMetricsGetter: Exception when trying to compute pagesize,...

    报错 WARN ProcfsMetricsGetter Exception when trying to compute pagesize as a result reporting of ProcessTree metrics is st
  • CTF.show:web11

    代码审计
  • 8.29网络编程作业

    include
  • MySQL存储引擎

    MySQL自我学习路线 一 存储引擎概述 二 MySQL常用存储引擎 1 MyISAM 节省空间 1 1 特点 2 InnoDB 默认引擎 安全 2 1 特点 3 MEMORY 查询快 3 1 特点 三 存储引擎的选择 一 存储引擎概述 数
  • Java是如何实现跨平台功能的?

    Java是一种高级编程语言 最初被设计为能够在任何计算机上运行 而不受硬件和操作系统的限制 它实现了跨平台功能的方式是使用Java虚拟机 JVM 本文将介绍Java是如何实现跨平台功能的 Java虚拟机 JVM 在Java中 源代码是编写在
  • Verdi/Coverage tool 学习 第1节(入门篇)

    目录 1 Verdi Coverage 工具概述 2 VCS使用实例 3 VCS中的覆盖率分析 3 1 覆盖率类型 3 2 Coverage Database的产生 3 3 其他的vcs编译和仿真中的选项 3 4 有时需要Merge 多个C