【个人笔记】VCS工具与命令

news2024/9/21 20:35:02

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了)

    理解

    1. compile是构建design的实例层次,得到一个可执行的二进制文件simv,用于后续仿真;
    2. simulate是进行具体的仿真。
  • three-step flow

    内容先analysis,然后elaboration,再simulate.

    特点:用于VHDL和verilog两个混合design的仿真。

    理解

    1. analysis:根据不同语言进行细化解析、检查语法错误;

      analysis是根据code是VHDL、Verilog、SV等进行解析、语法检查,转为中间文件库——VHDL design,用vhldan编译、转为vhdlan文件;Verilog design用vlogan编译,转为vlogan文件;

      elaboration是根据中间文件,从顶层module开始link,得到可执行文件simv;

    2. elaboration:link各个模块,产生可执行文件simv

      建议用-top 指定top module,否则默认从-work指定的库内最顶层的module开始;若有多个top-level module,就全执行一遍。

    3. simulate依然是仿真。

2 Option参数

根本写不完,于是用到哪些,写哪些。( ̄▽ ̄)"

2.1 Option:two-step flow

compile阶段
  • 基本用法

    vcs [各种option] .v文件

  • 吐槽

    vcs -h 东西不多;

    verdi -h 东西贼多贼全,匪夷所思!

  • 版本查看option

    常见option(我用到了就是常用( ̄▽ ̄)" …):

    1. -h 就是help——查看用vcs compile的option;
  1. -ID 查看VCS版本、host ID(用来查license)等信息;
  • 文件编译option

    纯粹编译RTL文件的vcs语法是:vcs top1.v top2.v

    注意文件顺序:头文件(被调用的)得在前面

    新增各种可选的option如下:

    1. -f file (或-file)指定 待compile的file list

      **作用:**若 .v 文件太多,可以写到一个file里,用 -f 指定.

    2. -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序列内的顺序可以乱了哈,没事儿.

    3. -y 目录path 指定一个verilog library的目录

      **作用:**起到 “补充” 的作用,目录下可以一坨module/UDP文件.

      相当于-v的增强版;最重要的是 可以和+libext+???结合使用!

      注意:目录名后面不用加/

    4. +libext+.???+ 在去library目录里查找module库文件时,追加.???后缀的文件也作为库文件

      **作用:**和-y 目录path结合使用,可以使查找库文件的过程更自定义。

      注意:可以追加多个格式,用+隔开就行,如:+libext+.???+.XML+ ;末尾的+加不加无所谓.

    5. +incdir+目录path 专门指定宏定义等各色头文件的目录

      目录后不用接/

      作用:默认的include "xxxx.sv"语句,VCS并不会默认去本地工程目录下找,需要自己指定,用这个加进去…

      宏定义的文件:装的是include、package、interface、struct的结构体、parameter参数等内容;

      注意:可以指定多个文件,用+隔开就行,末尾的+随意.

    6. +define+宏名XXX=值XXX+ 定义code中宏变量

      **作用:**相当于在代码中添加``define 宏名 值,目的是用于ifdef-else-endif`宏编译块的控制方便。

      注意:=值XXX可以爱加不加;可以添加多个宏,用+隔开就行。

  • 编译模式的option

    1. -full6464位mode下进行 compile 与 simulation;

    2. -o filename 自定义可执行文件名

      **作用:**不使用,则可执行文件为默认名 simv;

    3. timescale=1ns/1ns 统一定义time scale (time unit / time precision);

      vivado是每个.v文件中,在首行写这个;vcs可以在cmd option中统一进行设置。

    4. +v2k (或-2001)使VCS支持2001年的Verilog标准;

      **作用:**verilog有三个IEEE标准:1364-1995、1364-2001、1364-2005;后面就是SV的标准了。

      一般用这个。

    5. -v95 使VCS支持1995年的Verilog标准;

    6. -sv (或-sverilog支持SV

      支持SV IEEE的2005版.

      SV的IEE标准有:2005、2009、2012、2017.

  • 功能性option

    1. -l filename 指定log文件;

    2. -q 静音模式

      **作用:**不输出compile过程中的弹出信息,如:C编译的信息、RTL文件一览、top module、timescale等…

    3. -R VCS link完毕后,直接自动执行仿真程序(可执行文件)

      **作用:**就不需要手动执行后续的 simv [option] 了,可以一气呵成.

    4. -ntb_opts uvm1.2 load如UVM库进行compile;

      还可以load ovm、rvm等呢.

    5. -kdb VCS在compile时生成kdb库文件

      作用:产生sim.daidir/文件夹),里面存储了code信息,使后续verdi查看波形时可快速打开而不需要重新编译code;

      • kdb (Knowledge Database),是一个Elaboration Database(abbr. elabDB,VCS的three-step flow中会更细的提它);

      • 生成kdb

        是用 vcs -kdb -lca;

      • 使用kdb

        三种方式都可:

        1. verdi -ssf novas.fsdb

          让verdi打开指定波形,它会自动加载kdb;

          但是code改了以后,总是会弹窗说kdb被修改了,这还要你说嘛?就很烦…

        2. verdi -dbdir simv.daidir -ssf novas.fsdb

          多了个:手动指定了 kdb文件,verdi打开波形就不会弹窗了,清净一点~

    6. -fsdb 仿真时产生fsdb格式的波形文件

      **注意:**默认的波形文件名是:novas.fsdb

      在compile中加此option是 不够的(你会发现波形文件在compile后没生成),要想生成波形文件,一共需要三步:

      1. 在RTL的top中写个 intial block,内写:$fsdbDumpvars;

        指定生成波形的signal.

      2. 在vcs的comiple option中写 -debug_access+all

        不然RTL中不允许写$fsdbDumpvars;,会报错;

      3. 在vcs的comiple option中写 -fsdb

        不然不会生成波形;

    7. -lca 使用些用户限制功能

      **作用:**启用VCS的一些测试不足还没有发布的功能,具体功能因release版本不同而异;

      LCA (limited customer availability),用户受限功能.

simulate阶段

只是执行VCS compile阶段输出的可执行文件而已!

  • 基本用法

    在compile、link结束后,VCS会产生二进制可执行文件 simv(默认名),运行后即可进行功能仿真。

    ./simv [各种option]

  • 各种option

    常见option:

    1. -l file 指定log文件;

    2. -debug_accecss????debug mode进行仿真

      作用:这样才能看波形,但是仿真速度性能会降低;若不使用此option,则为batch mode,性能更快

      **产生文件:**此mode下,VCS会产生debug所需的文件(文件夹csrc/,包含各module的中间文件);

      **特点:**debug mode内还分为GUI模式和命令行(UCLI)模式,根据需要的自己加后面俩开关。

      • -gui debug mode之 开gui界面(默认是DVE);

        **作用:**但得满足,vcs compile时,加上 -debug_all.

        注意:如果有设置环境变量VERDI_HOME,就会打开verdi进行仿真.

        **前提:**是debug mode

      • -ucli debug mode之 命令行界面

      **注意:**debug_access后面也有各种option,来只开启部分debug功能,可以自选。参数如下:

      • -debug_access+all 表启用所有信号变化(signal access)debug capability;

      • -debug_all VCS的debug功能全开!

        -debug_access+all 还猛。

        但如果更关注信号变化,就用-debug_access+all 更好。

    3. -dardr 指定 simv.daidir

      simv.daidir是simv执行的比较稳健

2.2 Option:three-step flow

目前不用,先略~

  1. analysis阶段
  2. elaboration阶段
  3. 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内用相对路径。
  • +libext+.sv -y path 好像是导入库文件,但我用起来毛用没有,离谱。

  • package、interface与VCS的编译关系

    这俩建议 分别 在VCS中独立compile. (synopsys lab中也是这么写的…)

    package中

    1. import package,是改变“作用域”,故要考虑“域”是否覆盖到位——因为import入的package对子package无效,需要在子package中重新import;
    2. package中使用include,要考虑的是include的顺序,应自底向上;
    3. package内只能包class(.sv),不能包module(.v)文件.

    interface中:interface后缀是.sv,但不算OOP语法,不能在类内使用,也无法被包在package中!因为引用的是DUT的signal,故得在DUT后compile;但又在UVM前使用,故得在UVM前compile…就很烦…

  • 总结

    makefile中需要写的VCS compile的内容有:

    1. DUT
    2. Interface
    3. package
    4. 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2096427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu环境下实现ROS 2 与 Arduino 通信

本教程为https://blog.csdn.net/2301_81924597/article/details/141757091?spm1001.2014.3001.5501的进一步拓展 ROS 2 与 Arduino 通信指南 准备工作 确保已安装 ROS 2&#xff08;本指南基于 ROS 2 Humble&#xff09;确保已安装 Arduino IDE 并能正常使用安装必要的 ROS…

系统架构师考试学习笔记第三篇——架构设计高级知识(10)系统质量属性与架构评估

本章知识点&#xff1a; 第10课时主要学习软件系统质量属性、系统架构评估以及ATAM方法评估实践等内容。 本课时内容侧重于概念知识&#xff0c;根据以往全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;。考试的出题规律&#xff0c;考查的知识点多来源于教材&a…

在Web服务应用中,如何编程使用Redis的缓存功能?包括缓存页面内容、缓存数据库查询结果、用户会话信息等代码分享

目录 一、概述 二、redis介绍 1、简介 2、Redis作为缓存的原理 &#xff08;1&#xff09;内存存储 &#xff08;2&#xff09;数据结构 &#xff08;3&#xff09;工作原理 3、Redis作为缓存的作用 三、redis缓存页面内容 1、作用 2、实现方法 3、示例代码&#x…

python07-单元测试框架unittest1-2

5 fixture 可以看作case的前置条件、后置条件 5.1 fixture的用例执行顺序 fixture分为 方法级别类级别模块级别 5.1.1方法级fixture 每个测试用例之前要调用setUp每个测试用例执行后要调用tearDowntestCase中有多少测试用例,那么setUp和tearDown就被调用多少次 def add(…

【Java】Spring-AOP与拦截器简洁实操 (上手图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 认识依赖4.2 使用AOP与拦截器4.2.1 使用AOP4.2.1.1 设置DemoAop类4.2.2.2 设…

【SpringBoot】电脑商城-11-显示购物车功能

加入购物车 1 购物车-创建数据表 1.使用use命令先选中store数据库。 USE store;2.在store数据库中创建t_cart用户数据表。 CREATE TABLE t_cart (cid INT AUTO_INCREMENT COMMENT 购物车数据id,uid INT NOT NULL COMMENT 用户id,pid INT NOT NULL COMMENT 商品id,price BIG…

java fastxml json 科学计数法转换处理

背景&#xff1a; 由于 canal 切换为 tx dbbridge后&#xff0c;发现dbbridge对于canal的兼容性存在较大问题&#xff0c;从而引发 该文档的实践。 就目前发现 dbbrige 的字段 大小写 和 数据类型格式 从binlog 写入kafka 同canal 都会存在差异。 canal之前导出都是小写&…

编程要由 “手动挡” 变 “自动挡” 了?Cursor+Claude-3.5-Sonnet,Karpathy 大神点赞的 AI 代码神器!如何使用详细教程

Cursor 情况简介 AI 大神 Andrej Karpathy 都被震惊了&#xff01;他最近在试用 VS Code Cursor Claude Sonnet 3.5&#xff0c;结果发现这玩意儿比 GitHub Copilot 还好用&#xff01; Cursor 在短短时间内迅速成为程序员群体的顶流神器&#xff0c;其背后的原因在于其默认使…

[VirtualBox+ubuntu24]设置linux学习环境

1)设置网络为桥接网卡&#xff0c;不然发现ifconfig出不来ip地址 依然设置为经典的: 2核4G内存 50G硬盘 2)设置默认root账户登录 // 不然每次都得输入sudo -s // step1: 打开配置文件 sudo vim/etc/gdm3/custom.conf// step2: 默认以root登录 [daemon] AutomaticLoginEnableT…

NTFS硬盘支持工具Paragon NTFS for Mac 15.4.44 中文破解版

Paragon NTFS for Mac 15.4.44 中文破解版是一个底层的文件系统驱动程序,专门开发用来弥合Windows和Mac OS X之间的不兼容性&#xff0c;通过在Mac OS X系统下提供对任何版本的NTFS文件系统完全的读写访问服务来弥合这种不兼容性。为您轻松解决Mac不能识别Windows NTFS文件难题…

C语言:大小端模式、判断大小端、大小端转换

目录 1. 什么是大端和小端 2.为什么会存在大小端的问题 3. 判断主机字节序 (主机大小端) 3.1 使用联合体 (union) 3.2 使用指针 3.3 强制转为 char 类型法 4. 大小端转换 1. 什么是大端和小端 对于一个存储空间大于 1 个字节的数据&#xff0c;在内存中有两种存储模式&a…

VCTP论文精读

机器视觉推理自从引入神经符号机制以来取得了巨大进步&#xff0c;这使得机器能够发展出多步骤的推理链。然而&#xff0c;正如早期认知科学家所预示的那样&#xff0c;这种逻辑和符号系统基本上不适合于现实世界、常识知识的表示和推理&#xff0c;因为它们仅依赖于封闭世界的…

一个人独立开发前后端,终于有属于自己的一套产品

大家好&#xff0c;我是兔兔答题的开发者。兔兔答题是一款简单、易用的答题考试系统&#xff0c;可应用于微信考试、付费考试、社会调查问卷、明星知识问答、员工培训考核、模拟自测、企业面试、试题库等多种场景。兔兔答题会根据不同的场景&#xff0c;开发不同的模版。例如驾…

[Algorithm][综合训练][循环汉诺塔][kotori和素因子][dd爱科学]详细讲解

目录 1.循环汉诺塔1.题目链接2.算法原理详解 && 代码实现 2.kotori和素因子1.题目链接2.算法原理详解 && 代码实现 3.dd爱科学1.题目链接2.算法原理详解 && 代码实现 1.循环汉诺塔 1.题目链接 循环汉诺塔 2.算法原理详解 && 代码实现 解法&a…

虚幻5|C++第三人称射击(1)添加摄像机

一.在C类创建一个一个角色类蓝图&#xff0c;命名为BasePlayer 1.得到cpp和h文件 2.打开BasePlayer.h&#xff0c;定义摄像机内容 编译以下代码&#xff0c;定义摄像机和摄像机组件 private: //定义摄像机 UPROPERTY(VisibleAnywhere,BlueprintReadOnly,Category"…

【数学分析笔记】第2章第4节收敛准则(7)

2. 数列极限 2.4 收敛准则 2.4.8 实数系的基本定理 确界存在定理&#xff08;实数系的连续性&#xff09;单调有界数列收敛定理闭区间套定理Bolzanp-Weierstrass&#xff08;波尔查诺&#xff0d;魏尔斯特拉斯&#xff09;定理Cauchy&#xff08;柯西&#xff09;收敛原理&a…

前端与后端的身份认证

这里写目录标题 前端与后端的身份认证Web开发模式服务端渲染的Web开发模式前后端分离的Web开发模式根据场景选择开发模式 身份认证为什么需要身份认证不同开发模式下的身份认证 Session认证机制HTTP协议下的无状态性如何突破HTTP无状态的限制CookieCookie的几大特性&#xff1a…

代码随想录 刷题记录-23 单调栈

题目对“下一个更高”或者“下一个更低”有要求&#xff0c;可以考虑单调栈 &#xff08;也可以考虑双指针&#xff0c;双指针往往能够把时间复杂度的指数减一&#xff09; 1.739. 每日温度 思路 首先想到的当然是暴力解法&#xff0c;两层for循环&#xff0c;把至少需要等…

豆包MarsCode编程助手:让编程更简单

在编程的浩瀚宇宙中&#xff0c;每一个开发者都在寻找那把能够开启高效与创意之门的钥匙。随着AI技术的飞速发展&#xff0c;智能编程助手应运而生&#xff0c;为开发者们带来了前所未有的便捷与灵感。今天&#xff0c;我们将以五子棋小游戏开发为例&#xff0c;深入解读豆包Ma…

从文本坐标数据转换为矢量(点线面)

从坐标数据转换为空间几何(点线面) 介绍 只要文件中包含空间数据(如经纬度信息),转换为点、线或面要素。我们将使用内置的 excel Reader 参数、VertexCreator 转换器将坐标转换为点要素。我们还将使用 VertexCreator 转换器和 LineBuilder 转换器和AreaBuilder转换为线和…