【个人笔记】VCS工具与命令
Title:VCS工具学习
一 介绍
-
是什么?
VCS (Verilog Compiler Simulator) 是synopsys的verilog 仿真软件,竞品有Mentor公司的Modelsim、Cadence公司的NC-Verilog、Verilog—XL.
VCS能够 分析、编译 HDL的design code,同时内置了 仿真和调试 功能,以及 支持SV、验证规划、覆盖率分析和收敛的验证功能(集成了这些工具:SystemC、Verdi、UCLI Unified Command-line Interface、Built-In Coverage Metrics等);可以理解为是芯片领域的 IC前端的前半部分阶段的IDE(因为后面还要另用DC跑综合,也是前端)。
-
在chip flow中的位置
chip flow是前端、后端;前端分为前仿、综合(Synopsys用于跑综合的软件是DC, design compiler)、后仿,区分是有没有综合过;后端有DFT、layout、CTS、placement、route等。
-
vcs和verdi的区别
vcs是仿真代码来生成波形的,verdi是看波形的.
-
vcs和dve的区别
dve是VCS的GUI. (但很多地方如zx和synopsys培训机房都不装…不懂…)
打开DVE的command:
./simv -gui
二 用法学习
-
VLSI课程使用的cmd case
编译:
vcs -full64 +2k -debug_access+all -timescale=1ns/1ns top.v仿真:
./simv或./simv -gui -
粗暴图示
compile

elaborate

simulation

1 简介:VCS的两种simulate flow
VCS 要进行simulate,有 two-step flow 和 three-step flow 两种方式。
-
two-step flow
内容:先compile,再simulate.
特点:仅支持 verilog HDL 和 SV. (对我已经enough了)
理解:
- compile是构建design的实例层次,得到一个可执行的二进制文件simv,用于后续仿真;
- simulate是进行具体的仿真。
-
three-step flow
内容:先analysis,然后elaboration,再simulate.
特点:用于VHDL和verilog两个混合design的仿真。
理解:
-
analysis:根据不同语言进行细化解析、检查语法错误;
analysis是根据code是VHDL、Verilog、SV等进行解析、语法检查,转为中间文件库——VHDL design,用
vhldan编译、转为vhdlan文件;Verilog design用vlogan编译,转为vlogan文件;elaboration是根据中间文件,从顶层module开始link,得到可执行文件simv;
-
elaboration:link各个模块,产生可执行文件simv
建议用
-top指定top module,否则默认从-work指定的库内最顶层的module开始;若有多个top-level module,就全执行一遍。 -
simulate依然是仿真。
-
2 Option参数
根本写不完,于是用到哪些,写哪些。( ̄▽ ̄)"
2.1 Option:two-step flow
compile阶段
-
基本用法
vcs [各种option] .v文件 -
吐槽
vcs -h东西不多;verdi -h东西贼多贼全,匪夷所思! -
版本查看option
常见option(我用到了就是常用( ̄▽ ̄)" …):
-h就是help——查看用vcs compile的option;
-ID查看VCS版本、host ID(用来查license)等信息;
-
文件编译option
纯粹编译RTL文件的vcs语法是:
vcs top1.v top2.v注意文件顺序:头文件(被调用的)得在前面
新增各种可选的option如下:
-
-f file(或-file)指定 待compile的file list;**作用:**若
.v文件太多,可以写到一个file里,用-f指定. -
-v common_file.v指定一个verilog library文件;**作用:**起到 “补充” 的作用;only 1个module/UDP文件.
若RTL结构明确、调用简单,就不需要它了;
需要
-v的场合,例如是一些common.v文件被共同调用、或是一些补充的function文件(不在主RTL文件内),那就用-v导进行编译.初衷:方便模块的“标准化”。而 用户自定义的组合逻辑模块在VCS manual被称为 UDP(user-defined primitive).
注意:加了
-v的file和其他主RTL文件在command序列内的顺序可以乱了哈,没事儿. -
-y 目录path指定一个verilog library的目录**作用:**起到 “补充” 的作用,目录下可以一坨module/UDP文件.
相当于
-v的增强版;最重要的是 可以和+libext+???结合使用!注意:目录名后面不用加
/ -
+libext+.???+在去library目录里查找module库文件时,追加.???后缀的文件也作为库文件**作用:**和
-y 目录path结合使用,可以使查找库文件的过程更自定义。注意:可以追加多个格式,用
+隔开就行,如:+libext+.???+.XML+;末尾的+加不加无所谓. -
+incdir+目录path专门指定宏定义等各色头文件的目录目录后不用接
/。作用:默认的
include "xxxx.sv"语句,VCS并不会默认去本地工程目录下找,需要自己指定,用这个加进去…宏定义的文件:装的是
include、package、interface、struct的结构体、parameter参数等内容;注意:可以指定多个文件,用
+隔开就行,末尾的+随意. -
+define+宏名XXX=值XXX+定义code中宏变量;**作用:**相当于在代码中添加``define 宏名 值
,目的是用于ifdef-else-endif`宏编译块的控制方便。注意:
=值XXX可以爱加不加;可以添加多个宏,用+隔开就行。
-
-
编译模式的option
-
-full64在64位mode下进行 compile 与 simulation; -
-o filename自定义可执行文件名;**作用:**不使用,则可执行文件为默认名
simv; -
timescale=1ns/1ns统一定义time scale (time unit / time precision);vivado是每个.v文件中,在首行写这个;vcs可以在cmd option中统一进行设置。
-
+v2k(或-2001)使VCS支持2001年的Verilog标准;**作用:**verilog有三个IEEE标准:1364-1995、1364-2001、1364-2005;后面就是SV的标准了。
一般用这个。
-
-v95使VCS支持1995年的Verilog标准; -
-sv(或-sverilog)支持SV;支持SV IEEE的2005版.
SV的IEE标准有:2005、2009、2012、2017.
-
-
功能性option
-
-l filename指定log文件; -
-q静音模式;**作用:**不输出compile过程中的弹出信息,如:C编译的信息、RTL文件一览、top module、timescale等…
-
-RVCS link完毕后,直接自动执行仿真程序(可执行文件)**作用:**就不需要手动执行后续的
simv [option]了,可以一气呵成. -
-ntb_opts uvm1.2load如UVM库进行compile;还可以load ovm、rvm等呢.
-
-kdbVCS在compile时生成kdb库文件作用:(产生
sim.daidir/文件夹),里面存储了code信息,使后续verdi查看波形时可快速打开而不需要重新编译code;-
kdb (Knowledge Database),是一个Elaboration Database(abbr. elabDB,VCS的three-step flow中会更细的提它);
-
生成kdb
是用
vcs -kdb -lca; -
使用kdb
三种方式都可:
-
verdi -ssf novas.fsdb让verdi打开指定波形,它会自动加载kdb;
但是code改了以后,总是会弹窗说kdb被修改了,这还要你说嘛?就很烦…
-
verdi -dbdir simv.daidir -ssf novas.fsdb多了个:手动指定了 kdb文件,verdi打开波形就不会弹窗了,清净一点~
-
-
-
-fsdb仿真时产生fsdb格式的波形文件**注意:**默认的波形文件名是:
novas.fsdb;在compile中加此option是 不够的(你会发现波形文件在compile后没生成),要想生成波形文件,一共需要三步:
-
在RTL的top中写个 intial block,内写:
$fsdbDumpvars;指定生成波形的signal.
-
在vcs的comiple option中写
-debug_access+all不然RTL中不允许写
$fsdbDumpvars;,会报错; -
在vcs的comiple option中写
-fsdb不然不会生成波形;
-
-
-lca使用些用户限制功能**作用:**启用VCS的一些测试不足还没有发布的功能,具体功能因release版本不同而异;
LCA (limited customer availability),用户受限功能.
-
simulate阶段
只是执行VCS compile阶段输出的可执行文件而已!
-
基本用法
在compile、link结束后,VCS会产生二进制可执行文件
simv(默认名),运行后即可进行功能仿真。./simv [各种option] -
各种option
常见option:
-
-l file指定log文件; -
-debug_accecss????以debug mode进行仿真作用:这样才能看波形,但是仿真速度性能会降低;若不使用此option,则为batch mode,性能更快。
**产生文件:**此mode下,VCS会产生debug所需的文件(文件夹
csrc/,包含各module的中间文件);**特点:**debug mode内还分为GUI模式和命令行(UCLI)模式,根据需要的自己加后面俩开关。
-
-guidebug mode之 开gui界面(默认是DVE);**作用:**但得满足,vcs compile时,加上
-debug_all.注意:如果有设置环境变量
VERDI_HOME,就会打开verdi进行仿真.**前提:**是debug mode
-
-uclidebug mode之 命令行界面;
**注意:**debug_access后面也有各种option,来只开启部分debug功能,可以自选。参数如下:
-
-debug_access+all表启用所有信号变化(signal access)debug capability; -
-debug_allVCS的debug功能全开!比
-debug_access+all还猛。但如果更关注信号变化,就用
-debug_access+all更好。
-
-
-dardr指定 simv.daidirsimv.daidir是simv执行的比较稳健
-
2.2 Option:three-step flow
目前不用,先略~
- analysis阶段
- elaboration阶段
- simulate阶段
3 VCS的不同仿真模式
在VCS三步法中,VCS在elaboration后会产生个二进制可执行文件simv;而elaboration传入的一个配置参数,可决定simv仿真的工作模式:interactive mode、batch mode.
3.1 interactive mode (debug mode)
-
特点
可以用GUI界面(DVE或Verdi)来进行debug,也可以用命令行界面(UCLI方式)来debug.
-
开启方式
elaboration时,加入option:
-debug_acess+all或-debug_access+r -
用Verdi
见【 VCS manual P125】
3.2 batch mode
-
特点
又称为优化模式。用这个专门跑回归的,性能最快,调试能力最拉。
-
开启方式
别用
-debug_access
3.3 UCLI (也是debug mode)
-
概述
(UCLI, Unified Command-line Interface)
其实也是属于 interactive mode,但是命令行模式。
-
开启方式
simv -ucli
❌ 4 波形dump细节
-
没细看
见:
【VCS manual P354 Verdi UCLI】
- UCLI似乎更兼容DVE啊,我看【dve ug的手册上,写满了和ucli的联合用法】
【VCS manual P585 VPD, VCD】
三 个人使用经验
compile阶段
include、package的使用
-
VCS内编译文件 和 verilog内使用include的联系
可以 直接在VCS的compile option中把相关的
.v文件都加进去,那么 就不需要 include 了;或 只是用VCS去compile top的DUT文件,则VCS发现不认识的module后,会自动去include的头文件中找 并compile头文件。
但不管是哪种,VCS内compile的DUT文件顺序 或 include头文件顺序都很重要! ——得先compile子模块、得先include子模块。
我个人习惯的compile顺序是:DUT放VCS里、UVM放package里,然后VCS里 compile顺序是 DUT -> Interface -> UVM package -> UVM top.
-
import package和include的区别
include文件:在compile时相当于 文本copy;
import package:并不会copy文本,而是在此处 引入了package内文件的域,且 对子package无效!故子package需要使用某package时,需要重新手动import!
例如:需要在每个子package中都添加UVM的
uvm_pkg::*; -
include中进行相对寻址、编译寻址的设置
VCS发现不认识的module后,会去“编译环境”下根据include内的相对路径进行找
.v文件。可用:
+incdir+路径来添加“编译环境”,可加多个,用+号分开;include内使用相对路径即可。- 也可以在makefile中,把各uvm文件夹都用
+incdir+路径加上,include时只用当前路径,但过于啰嗦;不如只在+incdir+路径加外层的paht,然后include内用相对路径。
- 也可以在makefile中,把各uvm文件夹都用
-
+libext+.sv -y path好像是导入库文件,但我用起来毛用没有,离谱。 -
package、interface与VCS的编译关系
这俩建议 分别 在VCS中独立compile. (synopsys lab中也是这么写的…)
package中:
- import package,是改变“作用域”,故要考虑“域”是否覆盖到位——因为import入的package对子package无效,需要在子package中重新import;
- package中使用include,要考虑的是include的顺序,应自底向上;
- package内只能包class(
.sv),不能包module(.v)文件.
interface中:interface后缀是
.sv,但不算OOP语法,不能在类内使用,也无法被包在package中!因为引用的是DUT的signal,故得在DUT后compile;但又在UVM前使用,故得在UVM前compile…就很烦… -
总结
makefile中需要写的VCS compile的内容有:
- DUT
- Interface
- package
- UVM
多么痛的领悟
-ntb_opts uvm-1.2后马上接DUT、UVM,它们是一起的!别夹杂别的东西!
四 FSDB 波形的dump
- 使用$dump…进行dump的过程我先略
用UCLI与DVE进行dump
-
.tcl的直接写法要求:DVE、VCS、Verdi的版本一致才行。
dump -type fsdb dump -add $(project_name) -aggregates -scope "." run# 或是makefile里写 # @echo "dump -type fsdb" > $@ # @echo "dump -add $(project_name) -aggregates -scope \".\"" > $@ # @echo "run" > $@ -
.tcl的格式dump -add <> -fid <> -depth <levels> [-aggregates] [-filter[=<>]] [-ports|-in|-out|-inout] [-power] [-fsdb_opt <>] ...-fid <>是设置file的ID——当dump的file被打开时的返回值.-depth <levels>是设置dump的scope level(仅限VPD波形格式时能用)-aggregate开启后,将会dump复杂的数据类型!-filter[=<>]开启后,只会 dump后面罗列的port信号.-fsdb_opt <>开启后,后面这些option将专门用fsdbDumpvars来进行dump.- 其他一些option开启后,也会专门将MOS等信号用
fsdbDumpvars来进行dump.
五 波形的处理
VPD波形
-
波形文件split
【Manual的626】
vcsplit-
目标文件
VCD或VPD文件
-
语法
vcsplit [-o outputfile] [-scope selected_scope_or_signal] [-include include_file] [-min min_time] [-max max_time] [-level n] [-ignore ignore_file] input_file [-v] [-h]-
input_file输入文件名 -
-o <>输出文件名 -
-scope <>要单独抠出的信号范围 -
-include <>一个文件,内装了一系列信号名或scope范围,需要抠出来的信号;一个信号占一行.可以和
-scope一起用,取信号的“并集”. -
-min <> -max <>分别指要scan的开始/结束的时间 -
-ignore <>一个文件,内装忽略、不要抠出来的信号 -
-level <数字>要scan的hierarchy的最大层数——若没定义scan的scope、也没定义include文件,则从top开始数;定义了,就从定义的信号里的highest里开始数.
-
san
-
相关文章:
【个人笔记】VCS工具与命令
Title:VCS工具学习 一 介绍 是什么? VCS (Verilog Compiler Simulator) 是synopsys的verilog 仿真软件,竞品有Mentor公司的Modelsim、Cadence公司的NC-Verilog、Verilog—XL. VCS能够 分析、编译 HDL的design code,同时内置了 仿…...
面试进去8分钟就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,这…...
探索MongoDB的Python之钥:pymongo的魔力
文章目录 探索MongoDB的Python之钥:pymongo的魔力背景:为什么选择pymongo?简介:pymongo是什么?安装:如何将pymongo纳入你的项目?基础用法:五个核心函数介绍1. 连接到MongoDB2. 选择数…...
【数据结构】顺序表和链表——顺序表(包含丰富算法题)
文章目录 1. 线性表2. 顺序表2.1 概念与结构2.2 分类2.2.1 静态顺序表2.2.2 动态顺序表 2.3 动态顺序表的实现2.4 顺序表算法题2.4.1 移除元素2.4.2 删除有序数组中的重复项2.4.3 合并两个有序数组 2.5 顺序表问题与思考 1. 线性表 线性表(linear list)…...
pod基础和镜像拉取策略
目录 pod概念 pod的分类 1.基础容器 pause 2.初始化容器 init 实验:定义初始化容器 init容器的作用 实验:如何在容器内部进行挂载 镜像拉取策略 pod概念 pod是k8s里面的最小单位,pod也是最小化运行容器的资源对象。容器是基于pod在k…...
53 mysql pid 文件的创建
前言 接上一篇文章 mysql 启动过程中常见的相关报错信息 在 mysql 中文我们在 “service mysql start”, “service mysql stop” 经常会碰到 mysql.pid 相关的错误信息 比如 “The server quit without updating PID file” 我们这里来看一下 mysql 中 mysql.pid 文件的…...
前端---对MVC MVP MVVM的理解
就需要从前端这些年的从无到有、从有到优的变迁过程讲一下。 1. Web1.0时代 在web1.0时代并没有前端的概念,开发一个web应用多数采用ASP.NET/Java/PHP编写,项目通常用多个aspx/jsp/php文件构成,每个文件中同时包含了HTML、CSS、JavaScript、…...
深度学习 --- VGG16能让某个指定的feature map激活值最大化图片的可视化(JupyterNotebook实战)
VGG16能让某个指定的feature map激活值最大化图片的可视化 在前面的文章中,我用jupyter notebook分别实现了,预训练好的VGG16模型各层filter权重的可视化和给VGG16输入了一张图像,可视化VGG16各层的feature map。深度学习 --- VGG16卷积核的可…...
1990-2022年各地级市gdp、一二三产业gdp及人均gdp数据
1990-2022年各地级市gdp、一二三产业gdp及人均gdp数据 1、时间:1990-2022年 2、来源:城市统计年鉴 3、指标:年度、城市名称、城市代码、城市类别、省份标识、省份名称、国内生产总值/亿元、第一产业占GDP比重(%)、第二产业占GDP比重(%)、第…...
c++ 原型模式
文章目录 什么是原型模式为什么要使用原型模式使用场景示例 什么是原型模式 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象,简单理解就是“克隆指定对象” 为什么要使用原型模式 原型模式(Prototype Pattern)是…...
论tomcat线程池和spring封装的线程池
Tomcat 中的线程池是什么? 内部线程池:Tomcat 确实有一个内部的线程池,用于处理 HTTP 请求,通常是org.apache.tomcat.util.threads.ThreadPoolExecutor 类的实例。这个线程池专门用于处理进入的 HTTP 请求和发送响应。可以通过 T…...
阿里P7大牛整理自动化测试高频面试题
最近好多粉丝咨询我,有没有软件测试方面的面试题,尤其是Python自动化测试相关的最新面试题,所以今天给大家整理了一份,希望能帮助到你们。 接口测试基础 1、公司接口测试流程是什么? 从开发那边获取接口设计文档、分…...
vue如何实现路由缓存
(以下示例皆是以vue3vitets项目为例) 场景一:所有路由都可以进行缓存 在渲染路由视图对应的页面进行缓存设置,代码如下: <template><router-view v-slot"{ Component, route }"><transiti…...
基于Openjdk容器打包运行jar程序
文章目录 应用场景基于Openjdk容器打包运行jar程序1.编译项目成jar包2.构建Dockerfile文件精简版-含jar包精简版-不含jar包带注释版-含jar包 3.编译Dockerfile成镜像。4.运行镜像: 应用场景 部署多版本jdk的应用程序。 基于Openjdk容器打包运行jar程序 1.编译项目…...
DNN学习平台(GoogleNet、SSD、FastRCNN、Yolov3)
DNN学习平台(GoogleNet、SSD、FastRCNN、Yolov3) 前言相关介绍1,登录界面:2,主界面:3,部分功能演示如下(1)识别网络图片(2)GoogleNet分类…...
HTTP协议(超文本传输协议)
HTTP请求消息 http请求消息组成: 请求行 :包含请求的方法 操作资源的地址 协议的版本号 http请求方法: GET:从服务器获取资源 POST:添加资源信息 PUT:请求服务器更新资源信息 DELETE:请…...
FFmpeg的日志系统(ubuntu 环境)
1. 新建.c文件 vim ffmpeg_log.c2. 输入文本 #include<stdio.h> #include<libavutil/log.h> int main() {av_log_set_level(AV_LOG_DEBUG);av_log(NULL,AV_LOG_INFO,"hello world");return 0; }当log level < AV_LOG_DEBUG 都可以印出来 #define A…...
浅析VO、DTO、DO、PO
一、概念介绍 POJO(plain ordinary java object) : 简单java对象,个人感觉POJO是最常见最多变的对象,是一个中间对象,也是我们最常打交道的对象。一个POJO持久化以后就是PO,直接用它传递、传递…...
android kotlin基础复习 enum
1、kotlin中,关键字enum来定义枚举类型。枚举类型可以包含多个枚举常量,并且每个枚举常量可以有自己的属性和方法。 2、测试代码: enum class Color{RED,YELLOW,BLACK,GOLD,BLUE,GREEN,WHITE }inline fun <reified T : Enum<T>>…...
个股场外期权怎么交易?场外期权交易流程是怎样的?
今天带你了解个股场外期权怎么交易?场外期权交易流程是怎样的?个股场外期权是一种非标准化的期权合约,通常在场外市场(OTC市场)由金融机构和投资者之间进行交易。 场外个股期权主要功能 风险管理: 帮助投…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
