文章目录

  • 引言
  • 一、软件介绍
    • 1. VCS
    • 2. DVE
    • 3. Verdi
  • 二、VCS的使用
    • 1. VCS的编译流程
    • 2. 常用的编译选项
      • 1)基础编译选项
      • 2)调试相关选项
      • 3)性能优化选项
      • 4)文件和路径选项
    • 3. 常用仿真选项
      • 1)基础仿真选项
      • 2)运行控制选项
      • 3)调试和分析选项
    • 3. VCS生成物
    • 4. 波形文件的生成
      • 1)VCD (Value Change Dump)的生成
      • 2)VPD (Verilog Procedural Dump)的生成
      • 3)FSDB (Fast Signal Database)的生成
  • 三、DVE/Verdi波形查看
    • 1. DVE查看波形
    • 2. Verdi查看波形
  • 四、VCS-Verdi lab(入门)
    • 1. 文件管理
    • 2. VCS编译和仿真
      • 1)一步(推荐)
      • Verdi查看波形
      • DVE查看波形(需要修改tb中的波形生成部分成vpd和vcd)
      • 2)两步
      • DVE查看波形
      • Verdi查看波形
    • 3. makefile
  • 附录
    • 1. ALU代码
    • 2. TestBench代码


参考文献
VCS使用教程 (Synopsys VCS Simulator Tutorial)
Linux下VCS与Verdi联合仿真简易教程及例子示范
Verdi快速使用技巧
Verdi的使用

引言

  在FPGAer/ICer的实际项目中,仿真无疑占了大量的时间。我想对于仿真工具有人更倾向于使用Vivado、ModelSim、QuestaSim这些编译-仿真-看波形一体化的工具,也有人更倾向于VCS(编译仿真)、Verdi和DVE(看波形)这些独立功能的工具。两者各有优劣。

  前者工具链简单易上手,甚至Vivado除了编译、仿真和看波形以外还能实现综合、布局布线等等功能,可谓神器。但是前者也有明显的缺点,比如说综合、编译、仿真速度很慢。

  而后者工具链较为复杂,编译和看波形为独立的工具。如果在做ASIC项目中,后者会更加方便和专业。首先,VCS编译和仿真速度极快,效率极高,能够大量节约仿真时间(仿真速度:FPGA>VCS>ModelSim/QuestaSim>Vivado)。而Verdi查看波形也十分方便,支持信号追溯等等功能。

  综上所述,为了提高开发效率,下面将以一个简单的ALU的工程来展示如何在Linux下使用VCS和Verdi进行逻辑仿真。此部分只涉及前仿,后仿涉及DC等综合工具。

  可以看完第四部分跑完lab后再返回看VCS的详细的选项功能

一、软件介绍

1. VCS

   VCS(Verilog Compiled Simulator)是 Synopsys 公司开发的一款高性能仿真工具,它采用编译型仿真技术,将 Verilog/SystemVerilog 代码编译成优化的 C 代码,再编译成可执行文件,从而实现高速仿真。虽然 VCS 本身不直接提供图形化调试界面,但它可以与 Synopsys 的其他工具(如 Verdi)集成,实现高效的调试和波形查看。

  同时,VCS 提供了丰富的编译和仿真选项,可以根据设计需求进行灵活配置。VCS 提供了丰富的覆盖率分析选项,包括行覆盖率、条件覆盖率、状态机覆盖率和翻转覆盖率等,有助于Verifier全面评估测试的充分性。

  为什么VCS会更快?因为VCS采用了编译型仿真。相较于解释型仿真(传统模式),其优点在于仿真速度极快、内存使用效率高、支持大规模设计以及优化程度高,但是编译时间较长、调试较为复杂并且修改代码需要重新编译。

2. DVE

  DVE(Design Verification Environment)是由Synopsys公司开发的一款强大的硬件设计验证工具,主要用于协助工程师分析和调试仿真结果。DVE是集成在了VCS中。

3. Verdi

  Verdi 是 Synopsys 提供的一款强大的自动化电子设计自动化(EDA)工具,主要用于功能验证和调试。Verdi 综合了多种调试功能,如波形查看、信号追踪、时序分析和覆盖规划等,为设计验证工程师提供了一个全面的环境进行设计错误的识别和修正。Verdi是比DVE更强大的调试平台,尤其在协议分析、性能分析和根本原因分析(RCA)方面表现出色。

  Verdi 工具集包括以下几个组件:

  • Waveform Viewer (波形查看器):图形化展示波形数据,支持对仿真数据进行深入分析。
  • Signal Spy (信号监视器):实时监测设计中的信号变化,用于调试。
  • Time Analysis (时序分析):分析设计中时序问题,帮助识别时序违规。
  • Coverage (覆盖率分析器):分析验证的覆盖面,确保测试充分。
  • Data Mining (数据挖掘):利用高级算法来发现设计中的潜在问题。

二、VCS的使用

  值得注意的是VCS本身不提供图形化界面,因此只能通过terminal来运行。

1. VCS的编译流程

  VCS采用两阶段编译模式,提供灵活性和高性能。

RTL源码—>vlogan前端编译—>生成数据库文件—>vcs后端编译—>生成simv可执行文件—>./simv仿真执行—>生成波形和日志  

  因此,VCS也提供了两种编译方式,分别为一步编译(推荐用于简单项目),两步编译(推荐用于复杂项目)。

# 一步编译
vcs [编译选项] [源文件] -o [输出文件名]
# 两步编译
vlogan [编译选项] [源文件]     # 前端编译
vcs [链接选项] [顶层模块] -o [输出文件名]  # 后端编译

  该文以一步编译模式为主

2. 常用的编译选项

1)基础编译选项

指令功能示例描述
-help显示帮助文档vcs -help查看vcs的可用选项
-full6464位编译模式vcs -full64
-sverilog支持SystemVerilogvcs -sverilog
+v2k支持Verilog-2001vcs +v2k
-timescale指定时间精度vcs -timescale=1ns/1ps也可以tb中指定
-o 输出文件名vcs -o my_sim默认simv
-kdb输出fsdb文件需要vcs -kdb

2)调试相关选项

指令功能示例描述
-debug_access+all完全调试访问vcs -debug_access+all查看所有信号
-debug_access+r只读调试访问vcs -debug_access+r只读模式
-line启用行号调试vcs -line
+lca生成覆盖率数据库vcs +lca用于覆盖率分析
-cm 覆盖率采集类型vcs -cm line+cond+fsm+tgl采集line/cond/fsm/tgl覆盖率
-cm_dir 指定存放覆盖率数据库的目录
-cm_name 为当次仿真产生的覆盖率数据命名

NOTE:收集行覆盖率(line)、条件覆盖率(cond)、有限状态机覆盖率(fsm)和翻转覆盖率(tgl)

覆盖率类型:
代码覆盖率 (Code Coverage)

  • line: 每行可执行代码是否被执行。
  • cond: if-else、case语句的每个分支是否被走到。
  • fsm: 状态机的每个状态和状态转移是否被访问。
  • tgl: 每个bit信号是否经历了0->1和1->0的翻转。

功能覆盖率 (Functional Coverage):通过SystemVerilog的 covergroup 定义,衡量设计规格中的功能点是否被测试到。

断言覆盖率 (Assertion Coverage):衡量SVA断言被触发、成功和失败的次数。

3)性能优化选项

指令功能示例描述
-Mupdate增量编译vcs -Mupdate只编译修改的文件
-j并行编译核心数vcs -j88个CPU核心
-comp优化编译vcs -comp编译时优化
-no_save不保存中间文件vcs vcs -no_save节省可见
-fast快速模式vcs -fast

4)文件和路径选项

指令功能示例描述
-f 文件列表vcs -f filelist.f包含源文件路径
-v 库文件vcs -v my_lib.v单个库文件
-y库目录vcs -y ./lib单个库目录
+libext+库文件扩展名+libext+.v+.sv搜索文件类型
+incdir+include目录+incdir+./inc`include文件路径
+define+预定义宏+define+SIM_MODE编译时宏定义

3. 常用仿真选项

1)基础仿真选项

指令功能示例描述
-R编译后立即运行vcs -R tb.v一步完成
-gui启动图形界面./simv -gui=dveDVE调试界面,也可以-gui=verdi
-l 日志文件./simv -l sim.log指定仿真日志路径
-s交互模式./simv -s在时间0停止

2)运行控制选项

指令功能示例描述
+ntb_random_seed=随机种子./simv +ntb_random_seed=123确定性随机序列
+vcs+lic_wait等待license./simv +vcs+lic_waitlicense不足时等待
+vcs+stop+指定停止时间./simv +vcs+stop+10001000时间单位后停止

3)调试和分析选项

指令功能示例描述
-ucli启动UCLI./simv -ucli统一命令行界面
-vpd_file VPD文件名./simv -vpd_file sim.vpd指定波形文件
-cm_name 覆盖率名称./simv -cm_name test1覆盖率数据库名
-cm_dir 覆盖率目录./simv -cm_dir ./cov覆盖率存储路径

3. VCS生成物

  执行vcs指令后一般会生成一些文件。其中比较关键的是:

  • simv:为可执行文件,可以使用./simv来运行仿真。
  • sim.log:为vcs的运行日志,名字为用户自己设置。
  • csrc:存放vcs生成的C语言源码。vcs将RTL代码转换成C代码后再使用系统的C/C++编译器来创建最终的可执行文件,
  • simv.daidir:为vcs的中间数据库目录,包含了设计的层次化信息。
  • .vcd/vpd/.fsdb:为波形文件,vcs生成,dve和verdi可以直接打开此类文件查看波形,无需重新编译和仿真。

4. 波形文件的生成

  vcs可以生成不同格式的波形文件。常见的有以下三种:

格式优点缺点查看工具
VCD通用性强,可读文件大,速度慢DVE,Verdi
VPD压缩率高,VCS原生Synopsys生态DVE,Verdi
FSDB压缩率极高,功能强Verdi生态Verdi

  以上这些波形文件格式的生成代码需要放置再testbench中,指定波形文件格式和保存的内容。

1)VCD (Value Change Dump)的生成

//在Testbench中添加系统任务
initial begin$dumpfile("tb.vcd");$dumpvars(0, top_module_name); // 0表示dump所有层级
end

2)VPD (Verilog Procedural Dump)的生成

//在Testbench中添加 $vcdpluson; 系统任务,并在编译时开启调试选项。
initial begin$vcdpluson();
end

3)FSDB (Fast Signal Database)的生成

//需要Verdi的环境支持,并在Testbench中调用特定系统任务。
initial begin$fsdbDumpfile("tb.fsdb");$fsdbDumpvars(0, "top_module_name");
end

$fsdbDumpfile(fsdb_name[,limit_size])
指定波形文件名,第二个参数可选择用来限制波形的大小(MB)。

$fsdbDumpvars([depth, instance][, “option”])
depth表示要加载波形的层次:
0表示当前instance下的所有变量以及其它module实例的波形;
1表示当前instance中的变量的波形,不包括当前instance中的其它module实例的波形;
2表示包含当前instance以及其中的第一级子instance的波形;以此类推。
instance指定要加载波形的module名。
option加载波形的选项:
+IO_Only – 只加载IO port信号;
+Reg_Only – 只加载reg类型信号;
+mda – 加载memory和MDA信号;
+packedmda – 加载packed MDA;
+struct – 加载structs;
+parameter – 加载parameter;
+fsdbfile+filename – 指定fsdb文件名字。(可覆盖dumpfile操作)

三、DVE/Verdi波形查看

1. DVE查看波形

  DVE的启动很简单,只需要在vcs执行完生成vpd/vcd波形文件后,即可用以下指令打开。

dve -vpd vcdplus.vpd &
dve -vcd tb.vcd & 

2. Verdi查看波形

  Verdi的启动也很简单,只需要在vcs执行完生成vpd/vcd/fsdb波形文件后,即可用以下指令打开。

verdi -f filelist.f -ssf tb.fsdb &

四、VCS-Verdi lab(入门)

1. 文件管理

  首先,第一步就是进行文件管理。一般文件管理我采用以下结构,rtl用来放置RTL代码,makefile为运行脚本,sim用来保存vcs仿真的结果和波形,tb用来放置testbench文件。此外,还有一个比较重要的便是设计文件列表filelist.f(注意文件的路径正确)。
在这里插入图片描述

在这里插入图片描述

2. VCS编译和仿真

1)一步(推荐)

  在sim路径下打开terminal并执行以下指令
  单步执行的在编译vcs时候加入了-R选项,使得vcs在编译完后直接运行./simv。

# -kdb为生成fsdb所需,否则无法使用verdi打开
vcs -R -full64 -debug_access+all -timescale=1ns/1ps -f filelist.f

  执行完后得到一些文件,可见 第3小节文件生成物。值得关注的便是tb.fsdb波形文件。
在这里插入图片描述

  单步编译后可以直接查看波形。

Verdi查看波形

  在sim路径下打开terminal并执行以下指令,启动verdi

verdi -f filelist.f -ssf tb.fsdb &

  一开始可以看到没有波形,需要右键选中alu,添加波形。
在这里插入图片描述

  添加波形后
在这里插入图片描述

DVE查看波形(需要修改tb中的波形生成部分成vpd和vcd)

# 使用dve查看波形(vcd,vpd)
dve -vpd vcdplus.vpd &
dve -vcd my_tb.vcd & 

2)两步

  两步执行的步骤在于先用vcs进行编译得到simv可执行文件,然后再运行./simv文件产生波形文件,./simv可以指定DVE或者Verdi来查看仿真结果。

DVE查看波形

  在sim路径下打开terminal并执行以下指令

# 步骤一,编译,生成simv可执行文件
vcs -full64 -debug_access+all -timescale=1ns/1ps -f filelist.f
# 步骤二,仿真并使用dve打开gui界面
./simv -gui=dve & 

在这里插入图片描述

添加波形
在这里插入图片描述

在命令行中运行run,开始仿真
在这里插入图片描述

Verdi查看波形

  在sim路径下打开terminal并执行以下指令

# 步骤一,编译,生成simv可执行文件
vcs -full64 -debug_access+all -kdb -timescale=1ns/1ps -f filelist.f
# 步骤二,仿真并使用verdi打开gui界面
./simv -gui=verdi & 

NOTE:需要注意的是这里vcs的编译需要加-kdb选项,不然会无法打开verdi
在这里插入图片描述

3. makefile

  可以将上述命令,添加到makefile脚本中,提高工作效率。

附录

1. ALU代码

module alu(input clk,input rst_n,input [7:0] in1,input [7:0] in2,input [1:0] in_ctrl,output [7:0] out
);reg [7:0] A,B;reg [1:0] C;reg [7:0] D;always @(posedge clk or negedge rst_n)beginif(!rst_n)beginA <= 8'd0;B <= 8'd0;C <= 2'd0;endelse beginA <= in1;B <= in2;C <= in_ctrl;endendalways @(posedge clk or negedge rst_n)beginif(!rst_n)D <= 8'd0;else case (C)2'b00 : D <= A + B;2'b01 : D <= ~A;2'b10 : D <= A & B;2'b11 : D <= A | B; default: D <= 8'd0;endcaseendassign out = D;
endmodule

2. TestBench代码

`timescale 1ns/1ps
module tb();reg clk=0;reg rst_n=1;reg [7:0] in1=0;reg [7:0] in2=0;reg [1:0] in_ctrl=0;wire [7:0] out;always #5 clk=~clk;initial begin#10 rst_n=0;#10 rst_n=1;#100repeat(10)begin@(posedge clk) in1 = {$random}%(2**8);in2 = {$random}%(2**8);in_ctrl = {$random}%(2**2);end#100 $finish();endalu alu(.clk(clk),.rst_n(rst_n),.in1(in1),.in2(in2),.in_ctrl(in_ctrl),.out(out));initial begin$fsdbDumpfile("tb.fsdb");$fsdbDumpvars();end
/*initial begin$dumpfile("alu.vcd");$dumpvars(0, tb);end
*/
endmodule 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20250826--inter

一、非对称加密的应用 非对称加密应用-CSDN博客 2、怎么避免跨站脚本攻击&#xff0c;包括还有其他的一些web安全&#xff0c;怎么做的 网页安全XSS攻击和CSRF攻击_csrf共计-CSDN博客 3、前端异常监控&#xff0c;性能监控&#xff0c;埋点&#xff0c;怎么做的 &#xff1f…

MongoDB Shell

MongoDB官方提供的单独命令行工具 MongoDB Shell Download | MongoDB 下载MongoDB Shell windows系统打开&#xff0c;直接在解压后的目录里面找到bin目录 然后双击打开mongosh.exe这个文件 看到这个命令行就表示Mongo Shell已经启动成功了 test代表 当前正在使用的数据库的…

Docker03-知识点整理

Docker03-知识点整理 文章目录Docker03-知识点整理1-参考网址2-知识整理2-思考题1-Docker image和Docker Native image有什么区别1. Docker Image&#xff08;Docker 镜像&#xff09;定义特点构建和使用示例2. Docker Native Image&#xff08;通常指 GraalVM Native Image 结…

华为 eNSP 从入门到精通:企业级网络仿真全攻略

一、eNSP 简介华为 eNSP&#xff08;Enterprise Network Simulation Platform &#xff09;是面向企业网络的虚拟化仿真平台&#xff0c;其核心架构基于分布式虚拟化引擎和真实设备镜像&#xff0c;具备以下技术亮点&#xff1a;高度仿真&#xff1a;可模拟华为 AR 路由器、x7 …

docker compose设置命令别名的方法

docker compose名字比较长&#xff0c;输入比较费事&#xff0c;可以为它设置别名来简化输入。1、Linux编辑~/.bash_aliasesalias dcdocker-compse编辑~/.bashrc&#xff0c;确认其包含以下内容&#xff1a;if [ -f ~/.bash_aliases ]; then. ~/.bash_aliasesfi重新加载 ~/.bas…

【RAGFlow代码详解-10】文本处理和查询处理

概述 文本处理和查询处理系统将自然语言查询转换为与 RAGFlow 的文档存储后端配合使用的优化搜索表达式。该系统支持中英文文本处理&#xff0c;具有专门的标记化、术语加权和查询增强技术。核心组件 FulltextQueryer 类 FulltextQueryer 类是查询处理和文本分析的主要接口。它…

利用机器学习优化Backtrader策略原理与实践

1. Backtrader框架概述 1.1 Backtrader简介 Backtrader是一个功能强大且灵活的Python库&#xff0c;专为量化交易策略的开发、测试和执行而设计。它提供了丰富的功能&#xff0c;包括数据获取、策略开发、回测、优化和绘图等。Backtrader的核心优势在于其模块化设计和高度可扩展…

CPTS-Pressed复现(XML-RPC)

该box主要是了解wordpress-XML-RPC 的使用 端口扫描只有80端口开启 可以使用wpscan进行扫描发现bak文件得到凭证&#xff0c;尝试登陆&#xff08;这里是将原密码的2021修改为2022尝试登陆&#xff0c;该主机发布时间为2022年&#xff09;发现有2FA&#xff0c;但是能够滥用 xm…

【机器学习深度学习】Embedding 与 RAG:让 AI 更“聪明”的秘密

目录 前言 一、RAG 的两大阶段 1. 知识库构建阶段 2. 查询检索与生成阶段 二、为什么 RAG 比单纯大模型更靠谱&#xff1f; 四、Embedding 在 RAG 中的作用 五、Embedding 的优势 六、Embedding 的挑战 七、RAG 优势与挑战对比 八、应用场景举例 总结 前言 在大模型…

python 转偶数

目录 python变量转偶数 box转偶数 python变量转偶数 x1 int(x1) // 2 * 2 y1 int(y1) // 2 * 2 x2 int(x2) // 2 * 2 y2 int(y2) // 2 * 2 box转偶数 def save_mp4(output_path,box_list,img_list,clip_start,clip_end):writer imageio.get_writer(output_path,fps30,c…

Linux - 中文显示乱码问题解决方法(编码查看及转换)- 学习/实践

1.应用场景 主要用于Linux中文显示乱码问题解决(编码查看及转换&#xff09; 2.学习/操作 1.文档阅读 Linux中文显示乱码问题解决方法(编码查看及转换&#xff09; - 整合侠 - 博客园 截图&#xff1a; 2.整理输出 TBD 后续补充 ... 3.问题/补充 TBD 后续补充 ...…

网络_协议

关键词&#xff1a; OSI是Open System Interconnect的缩写&#xff0c;意为开放式系统互联。 RTT &#xff1a; Round-Trip time 往返时间 RTO&#xff1a;Retransmission Timeout超时重传时间 MSL : OSI 七层模型和 TCP/IP 四层模型 OSI七层模型和TCP/IP五层模型&#…

vscode有的结构体不能补全,有的可以补全问题的解决.

定义了一个结构体,发现不能自动补全变量名称.而另外一个结构体却可以正常补全.经过研究发现是,新定义的结构体变量类型uint32_t,vscode认为其是错误类型导致的.暂时改为int型,后发现问题消失.可以正常补全了.由于工程使用cubeide生成,uint32_t定义在软件安装目录,并没有和项目文…

JavaScript 数组核心操作实战:最值获取与排序实现(从基础到优化)

在JavaScript开发中&#xff0c;数组的“最值获取”和“排序”是高频需求。本文将基于你的原始代码&#xff0c;系统解析数组最值获取、升序/降序排序的实现逻辑&#xff0c;通过“问题分析→代码优化→原理讲解”的流程&#xff0c;帮助你掌握更灵活、高效的数组操作方法&…

driver.js实现前端页面引导

1.安装 npm install driver.js2.实现代码示例 <template><div class"home-container"><!-- 页面内容 --><LeftPanel id"guide-left-panel" /><button id"guide-file-upload">文件上传</button><button i…

技术速递|使用 AI 应用模板扩展创建一个 .NET AI 应用与自定义数据进行对话

在本快速入门中&#xff0c;你将学习如何使用 .NET AI 应用模板创建一个 .NET AI 应用&#xff0c;与自定义数据进行对话。该模板旨在简化 .NET 构建 AI 应用的上手体验&#xff0c;帮助你处理常见的设置任务和配置。 先决条件 .NET 9.0 SDK 以下任一 IDE&#xff08;可选&am…

使用Cloudflare的AI Gateway代理Google AI Studio

1、说明详见&#xff1a;详见&#xff1a;https://developers.cloudflare.com/ai-gateway/usage/providers/google-ai-studio在"Google AI Studio"创建"API key" 在"Cloudflare"创建"AI Gateway"、获取"Account ID"2、在“G…

Scrapy 框架实战:构建高效的快看漫画分布式爬虫

一、Scrapy框架概述 Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架&#xff0c;它提供了强大的数据提取能力、灵活的扩展机制以及高效的异步处理性能。其核心架构包括&#xff1a; Engine&#xff1a;控制所有组件之间的数据流&#xff0c;当某个…

数据结构(C语言篇):(六)单链表算法题(下)

目录 前言 一、链表的回文结构 二、相交链表 三、环形链表​编辑 四、环形链表II 总结 前言 本篇博客将继续介绍单链表相关的算法题&#xff0c;包括了链表的回文结构、相交链表、环形链表等。现在就让我们正式开始吧&#xff01; 一、链表的回文结构 题目链接&#xff1a…