VCS学习笔记(二)

本文介绍VCS仿真中的三步法,包括Analyzing、Elaborating和Simulating三个阶段。通过详细解释各阶段的命令选项及其含义,帮助读者掌握VCS仿真的全流程。此外还提供了makefile文件示例和运行脚本示例,便于实际操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

VCS仿真分两步法和三步法,两步法包含:Compiling、Simulating;三步法包含:Analyzing、Elaborating、Simulating。
两步法只支持Verilog和systemVerilog语言编写的工程,不支持带vhdl语言的工程编译。三步法支持VHDL、Verilog和混合HDL编译。本文阐述三步法仿真方式:

Analyzing

VCS提供了vhdlan和vlogan可执行文件,用于analyze VHDL代码和verilog代码,并将分析后的中间文件存储到设计中或者工作库中。
默认情况下,vhdlan选项与VHDL-93兼容,vlogan与Verilog-2000兼容。可以使用vhdlan的-vhdl87选项切换到VHDL-87。类似地,可以分别使用-vhdl02或-vhdl08选项切换到VHDL 2002或VHDL 2008。可以使用vlogan的选项-sverilog 切换到SystemVerilog模式。语法如下:

% vlogan [vlogan_options] <Verilog_source_filename>
% vhdlan [vhdlan_options] <VHDL_filename_list>
vlogan option含义
-help显示最常用的编译时和运行时选项的简洁描述
-location显示vlogan安装路径
-notice启用详细诊断消息
-V启用警告消息并显示每个命令使用的时间
-uc屏蔽Synopsys版权消息
-q屏蔽编译信息
-full64使用64位模式编译和仿真
-kdb使能生成verdi KDB 数据库
+v2k启用Verilog 2001架构(默认自2012.09起)
-sverilog启用SystemVerilog源代码分析
+error+count设置 VCS 详细说明错误计数限制。默认情况下,VCS 在达到 10 个错误后停止细化。
-timescale=time_unit/time_precision仿真时间单位和精度
-work<VHDL_logical_library>指定创建VERILOG目录并在与此逻辑库关联的物理目录中写入中间文件,该目录也可在synopsys_sim.setup文件中指定
-lca此功能是有限的客户可用性(LCA)。有限客户可用性(LCA)功能是特定功能可用的功能。根据客户反馈并满足所需的功能完成标准,这些功能将准备好进行一般发布
+define+macro定义文本宏。使用“ifdef编译器指令”在Verilog源代码中测试此定义
-l <filename>指定VCS记录编译消息和运行时消息的日志文件(如果包含-R选项)
-f <filename>指定包含源文件路径名列表和所需分析选项的文件,文件列表内的注释可以使用 “//” 或者 “/* */”,"filename"不允许超过1024个字符
-v <library_file>指定用于搜索模块定义的Verilog库文件
-y <library_directory>指定用于搜索模块定义的Verilog库目录。将此选项与+libext+扩展名一起使用
+libext+extension+指定VCS仅搜索库目录中具有指定文件扩展名的文件。可以指定多个扩展名,用加号(+)字符分隔扩展名。例如+libext+.v+.V+指定在库中搜索扩展名为.V或.V的文件。将文件扩展名添加到此选项的顺序不会指定VCS搜索库中具有这些文件扩展名的文件的顺序
+incdir+directory指定包含使用“包含编译器”指令指定的文件的目录。可以指定多个目录,用“+”字符分隔每个路径名
-ignore keyword_argument根据指定的关键字参数抑制警告消息
+delay_mode_path仅使用指定块中模块路径延迟中的延迟规格。将所有门、开关和连续分配的所有延迟规格覆盖为零
+delay_mode_zero删除所有门、开关、连续分配和模块路径上的延迟规格
-top用于指定描述顶层配置或设计模块

Elaboration

vcs命令执行设计的编译/细化,并创建模拟可执行文件。默认情况下生成并使用编译的事件代码。生成的模拟可执行文件simv可用于运行多个模拟。语法如下:

% vcs [libname.]design_unit [options]

其中:[libname.]design_unit 指要仿真的design_unit,默认使用WORK库。design_unit是仿真的module名。

option选项含义
-h/-help列出最常用的VCS编译和运行时选项的说明
-mcg在VCS后端启用混合代码生成模型。部分代码由可用的C编译器进行了积极优化
-licqueue获取VCS license,直到找到为止。如果有多个jobs要求许可证,那么这些作业中的任何一个都会获得许可证(类似于旧的或不推荐使用的选项+vcs+lic+wait)
-full64使用64位模式编译和仿真
-kdb使能生成verdi KDB 数据库
-timescale=time_unit/time_precision仿真时间单位和精度
+notimingcheck禁止 VCS 在编译中忽略设计的时序检查系统任务。 此选项可以适度提高仿真性能。 这种改进的程度取决于 VCS 忽略的时序检查的数量。 您还可以在运行时使用此选项在 VCS 将它们编译到可执行文件后禁用这些时间检查
+error+< count >设置 VCS 详细说明错误计数限制。默认情况下,VCS 在达到 10 个错误后停止细化
-debug_access+f用于将值写入(存入)寄存器和变量,以及将值强制写入寄存器、变量和网络
-debug_access+r在部分调试读取模式下编译/细化设计
-debug_access+all在完全调试模式下编译/细化设计
-debug_region为 -debug_access 功能指定设计区域
+plusarg_save一些运行时选项必须在 +plusarg_save 选项之前,以便 VCS 将它们编译成可执行文件
-deraceclockdata使用时钟数据分辨率可确保始终对数据的先前值进行采样。可以显著提高验证效率。 在迁移到新版本或修改提供给 VCS 命令行的选项时,不会因为触发器而导致仿真不匹配
+optconfigfile可选项, 指定使用配置文件将 Radiant Technology 优化应用于部分设计
-Mupdate[=0]默认情况下,VCS会在编译之间覆盖生成文件。如果希望在两次编译之间保留生成文件,请使用0参数输入此选项。输入此参数而不输入0参数,将指定默认条件、增量编译和更新生成文件。

Simulation

Elaboration过程中,VCS使用生成的中间文件创建一个二进制可执行文件simv。可以使用simv运行模拟。根据设计的详细说明,可以使用以下两种模式运行仿真:交互模式和批处理(batch)模式。
交互模式(调试模式):支持交互模式下的仿真,需要在Elaboration 时使用-debug_access+r, -debug_access+all选项;
批处理模式:使用-debug_access选项会降低运行性能,仅当需要debug时,选用该选项;
仿真语法如下:
./simv [ runtime_options]

option选项含义
-cg_coverage_control=0/1使能(1)或禁止(0)覆盖率分析
+ntb_random_seed设置顶层随机数生成器开始时的值
-assert < assertion_name >在整个设计中基于"名称"的通配符匹配禁用断言
+vcs+stop+time指定停止仿真的时间,时间值不大于2**32
+vcs+finish+time指定结束仿真的时间,时间值不大于2**32
-l filename指定log文件的存放位置
-q安静模式;禁止显示VCS标题和摘要信息。在模拟开始时抑制专有消息,在结束时抑制VCS模拟报告(时间、CPU时间、数据结构大小和日期)。在模拟开始时抑制SystemC BMI警告和注释
-V详细模式;显示VCS版本和扩展摘要信息。在模拟开始时显示VCS编译和运行时版本号以及版权信息
+vcs+nostdout仅对设计的Verilog部分禁用VCS的所有文本输出,包括来自monitor和monitor和monitordisplay的消息和文本以及其他系统任务。如果包含-l选项,VCS仍会将此输出写入日志文件
+no_notifier禁止切换作为系统定时检查的可选参数的通知程序寄存器,定时检查违规的报告不受影响,这也是一个编译时选项
+notimingcheck禁止时序检查,+notimingcheck选项的优先级高于UCLI中的任何tcheck命令。
+no_tchk_msg禁用定时冲突的显示,但不会禁用定时检查中通知程序寄存器的切换,这也是一个编译时选项
+vcs+lic+wait如果作业启动时没有可用的网络许可证,则等待网络许可证
-licwait timeout启用许可证队列,其中timeout是VCS在最终退出之前等待许可证的时间(以分钟为单位)
-f filename在文件中指定用户定义的运行时选项
+vcs+ignorestop忽略源代码中的$stop系统任务
-ucli使用UCLI

简单VCS仿真makefile文件

SIMFILE := ./simfiles.f
TB_TOP := tb_top
DEFINE := SIM+DEBUG

comp:
	-mkdir -p sim_log
	-vlogan -V -nc -sverilog -full64 -kdb -skip_translate_body -timescale=1ps/1ps -lca\
		+librescan +v2k +systemverilogext+.sv \
		+define+${DEFINE} \
		-f ${SIMFILE} \
		-l ./sim_log/vlogan.log

elab:
	-vcs -top ${TB_TOP} \
		-licqueue -full64 -timescale=1ps/1ps -notice \
		 -debug_acc+all+dmptf -debug_region+cell+encrypt -debug_access+idents_db

sim:
	-./simv -lca  -debug_access \
		+no_notifier +notimingcheck +nospecify \
		-cm line+cond+fsm+tgl+path+branch -cm_dir ./simv.db.vdb -cm_cond allops \
		-ucli -do ./do.ucli +fsdb+gate=off +fsdb+all=on +fsdb+dump_log=off \
		-l test_srun.log

simfiles.f文件示例:

+incdir+/dut
+incdir+/sim_tb
+incdir+.
-sverilog /dut/dut.v
-sverilog /sim_tb/tb.v

do.ucli文件示例:

fsdbDumpfile tb_top.fsdb
fsdbDumpvars 0
fsdbDumpSVA
run
quit
<think>好的,我现在需要帮助用户了解如何在使用Vlogan查看由多个驱动引起的X态问题。首先,我得回忆一下Vlogan是什么。Vlogan是Synopsys公司的一个Verilog分析工具,主要用于编译和检查设计中的问题。当涉及到多驱动导致的X态时,通常是在仿真过程中发现信号值为不确定状态(X),而需要定位到具体的驱动源。 接下来,用户的问题是如何使用Vlogan来查看这种情况。可能用户在使用Vlogan进行编译或分析时,遇到了多驱动问题,导致仿真出现X态,需要找到这些冲突的驱动源。我需要先确定Vlogan是否直接支持检测多驱动冲突。根据我的知识,Vlogan在编译过程中可能会生成警告或错误信息,尤其是在多个驱动同一个信号的情况下。这些信息可能出现在编译日志中,用户需要检查日志文件中的相关警告。 然后,我应该分步骤说明如何操作。首先,用户需要确保在编译设计时启用了相关的检查选项。例如,Synopsys工具通常有一些选项来开启更严格的检查,比如+multisource_intent或类似的选项,这些可能帮助识别多驱动。接下来,用户应该在编译后仔细查看Vlogan生成的报告或日志文件,寻找关于多个驱动的警告信息。这些警告通常会指出具体的信号名称和代码位置。 另外,可能还需要结合仿真工具,如VCS,来进一步确认X态的产生位置。虽然Vlogan本身可能不会在运行时显示X态,但通过编译时的检查和仿真时的波形分析,用户可以交叉验证问题根源。例如,在仿真时捕获波形,找到信号变为X态的时间点,然后回溯到对应的驱动源,检查是否有多个驱动在同时作用于该信号。 还需要考虑其他可能性,比如设计中的双向端口或未正确处理的三态总线,这些情况也可能导致多驱动问题。用户需要检查这些部分的设计代码,确保每个信号在任意时刻只有一个驱动源有效。 如果Vlogan的默认设置没有显示足够的警告信息,用户可能需要查阅Vlogan的文档,寻找是否有更详细的调试选项或参数可以启用,以增强多驱动冲突的检测能力。此外,代码审查也是重要的一环,手动检查涉及到的信号是否有多个assign语句或在不同的always块中被赋值。 最后,总结步骤:编译时启用严格检查,分析日志中的警告,结合仿真波形定位问题,检查代码中的多驱动源,必要时调整设计以避免冲突。这样用户就能系统地识别和解决由多驱动引起的X态问题。</think>以下是如何使用Vlogan查看多驱动引起的X态问题的分步说明: --- ### **步骤1:编译时启用多驱动检测** 在Vlogan编译命令中添加专用参数: ```bash vlogan -sverilog +multisource_intent [其他选项] [设计文件] ``` `+multisource_intent` 会强制工具检查同一信号的多个驱动源 --- ### **步骤2:分析编译日志** 在编译输出中搜索以下关键词: - `Multi-source` - `Conflicting drivers` - `Warning: Multiple drivers` 典型警告示例: ``` Warning: [VLOGPT-3044] Signal 'data_bus' has multiple drivers: File: src/moduleA.sv, Line 15 (assign data_bus = ...) File: src/moduleB.sv, Line 22 (always_comb data_bus <= ...) ``` --- ### **步骤3:结合仿真验证** 1. 使用VCS仿真时添加X态传播分析: ```bash vcs -debug_all +xprop [其他选项] ``` 2. 在波形查看器中定位X态信号 3. 通过`$display("%t: X detected on signal %m", $time);` 插入调试语句 --- ### **步骤4:代码检查重点区域** 检查以下典型多驱动场景: ```verilog // 场景1:组合逻辑多重赋值 assign wireA = en1 ? val1 : 'z; // ❌ 多个assign驱动同一wire assign wireA = en2 ? val2 : 'z; // 场景2:跨模块驱动 module top; submod u1(.out(sig)); // ❌ 两个实例同时驱动sig submod u2(.out(sig)); endmodule // 场景3:三态总线未隔离 always_comb begin if (sel) bus = data1; // ❌ 缺少高阻态管理 else bus = data2; end ``` --- ### **步骤5:使用Verdi深度调试** 1. 生成FSDB波形时记录驱动信息: ```verilog $fsdbDumpvars(0, top, "+driver"); ``` 2. 在Verdi波形窗口中: - 右键点击X态信号 → "Show Drivers" - 使用"Force Value Analysis"追踪冲突时间点 --- ### **常见解决方案** 1. 总线竞争:添加仲裁逻辑 ```verilog assign data_bus = master1_en ? data1 : 'z; assign data_bus = master2_en ? data2 : 'z; // 需确保master1_en和master2_en互斥 ``` 2. 寄存器冲突:修改代码结构 ```verilog always_ff @(posedge clk) begin if (cond1) regA <= val1; // ❌ 多个条件可能同时生效 if (cond2) regA <= val2; end ``` 应改为: ```verilog always_ff @(posedge clk) begin case(1'b1) cond1: regA <= val1; cond2: regA <= val2; default: regA <= regA; endcase end ``` --- 通过上述方法可系统定位多驱动X态问题。建议在早期设计阶段使用Vlogan静态检查,配合仿真动态验证进行交叉验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值