相关阅读
VCShttps://blog.csdn.net/weixin_45791458/category_12828763.html
使用三步流程仿真设计涉及三个基本步骤:
- 分析(Analysis)
- 展开(Elaboration)
- 仿真(Simulation)
VCS使用这三个步骤编译任何设计,无论所使用源代码的是HDL、HVL或其他支持的技术。
分析
分析是仿真设计的第一步。在这个阶段,设计者使用vdhlan或vlogan命令分析VHDL、Verilog、SystemVerilog和OpenVera文件,以下部分包含了一些示例命令行来分析设计文件:
分析VHDL文件
% vhdlan [vhdlan_options] file1.vhd file2.vhd
分析Verilog文件
% vlogan [vlogan_options] file1.v file2.v
分析SystemVerilog文件
% vlogan -sverilog [vlogan_options] file1.sv file2.sv file3.v
分析OpenVera文件
% vlogan -ntb [vlogan_options] file1.vr file2.vr file3.v
同时分析分SystemVerilog和OpenVera文件
% vlogan -sverilog -ntb [vlogan_options] file1.sv file2.vr file3.v
可以在同一个vlogan命令行中同时分析SystemVerilog文件或OpenVera文件以及其他Verilog文件,如上例所示。
在分析阶段,VCS会检查设计中的语法错误,生成展开阶段所需的中间文件,命令行中的所有源文件属于同一个编译单元(VCS使用多文件单编译单元),源文件中每个设计元素(如module,program,package等)都有相应的中间文件,所有的中间文件在完成编译后会被保存在默认逻辑库中(或使用-work选项来指示VCS将这些中间文件保存到指定的逻辑库中),可以使用llib命令查看逻辑库的内容。synopsys_sim.setup文件中定义了从逻辑库到物理目录的库映射,如果使用-work选项,需要确保指定的逻辑库存在,否则VCS将提示错误消息并退出。
下面是一个synopsys_sim.setup文件的示例。
WORK > DEFAULT
DEFAULT : ./work
lib1 : ./lib1
lib2 : ./lib2
需要注意编译单元和逻辑库的区别,每条vlogan命令都会创建一个编译单元,而将编译结果保存在逻辑库中。
使用vhdlan
vhdlan可执行文件用于分析VHDL设计文件,并将生成的中间文件存储在逻辑库中,语法如下所示:
% vhdlan [vhdlan_options] VHDL_filename_list
常用的命令行选项和参数
-help
显示vhdlan的使用信息。
-nc
不显示Synopsys版权信息。
-q
不显示所有vhdlan信息。
-version
显示vhdlan的版本号并直接退出,不执行分析。
-full64
为64位仿真分析设计。
-work library
指定一个保存中间文件的逻辑库或物理目录(该逻辑库或物理目录必须在设置文件中进行了映射)。
-vhdl87
允许分析包含VHDL-93保留字的非可移植VHDL代码。
-vhdl02
允许分析VHDL 2002受保护类型。
-vhdl08
允许分析VHDL 2008结构。
-output outfile
将标准输出(通常显示在屏幕上)重定向到指定的文件。
-xlrm
启用超出LRM描述的VHDL特性。
-f filename
指定一个包含源文件列表的文件,应首先指定最底层的VHDL实体,然后向上移动。
-functional_vital
指定生成功能性VITAL仿真模式的代码。
-l filename
指定一个日志文件,在其中记录分析过程中的信息。
-no_functional_vital
指定生成全时序性VITAL仿真模式的代码。
VHDL_filename_list
指定要分析的VHDL源文件名,如果未提供扩展名,则默认其为.vhd。
-init_std_logic value
用给定的九种值中的一种初始化所有未初始化的VHDL信号、端口和变量,数据类型为STD_LOGIC或STD_ULOGIC(无论矢量还是标量)。这两种类型的VHDL信号或变量可以取以下值:‘U’,‘X’,'0','1','Z','W','L','H','-'。
也可以在synopsys_sim.setup文件中初始化值,在该文件中可以将九种值中的一种设置给变量INIT_STD_LOGIC,例如,INIT_STD_LOGIC=0。
使用vlogan
vlogan可执行文件用于分析Verilog等设计文件,并将生成的中间文件存储在逻辑库中,语法如下所示:
% vlogan [vlogan_options] Verilog_filename_list
常用的命令行选项和参数
-help
显示vlogan的使用信息。
-nc
不显示Synopsys版权信息。
-q
不显示所有vlogan信息。
-f filename
指定一个包含源文件列表的文件。
-full64
为64位仿真分析设计。
-ignore keyword_argument
不显示指定参数的警告消息,keyword_argument可以是:
unique_checks:关于unique if和unique case语句的警告消息。
priority_checks:关于priority if和priority case语句的警告消息。
all:包括以上两者。
-l filename
指定一个日志文件,在其中记录分析过程中的信息。
-liblist logical_lib1+logical_lib2+...logical_libn
在SystemVerilog中,包(package)导入需要在分析阶段就进行:
1、如果编译单元内,包导入前有编译到相应的包,则使用编译单元内的包进行解析。
2、如果编译单元内,包导入前没有编译到相应的包,则在逻辑库中进行查找。该选项指定了查找包时的逻辑库搜索顺序,如果未包含-liblist选项,vlogan将首先搜索指定的逻辑库(如果未指定-work选项,这指的是默认逻辑库),如果在其中没有找到,再依次搜索synopsys_sim.setup文件中的所有其他逻辑库并在找到包时停止。
-ntb
启用OpenVera测试基准语言结果。
-ntb_define macro
定义任意个OpenVera宏,可以使用加号(+)连接多个宏定义。
-ntb_filext .ext
指定OpenVera文件扩展名,可以使用加号(+)连接多个文件扩展名。
-ntb_incdir directory_path
指定OpenVera文件的包含目录路径,可以使用加号(+)指定多个包含目录。
-ova_file filename
将filename识别为断言文件(如果文件名以.ova结尾则不需要此选项),对于多个断言文件,请对每个文件重复此选项。
-sverilog
启用对SystemVerilog源代码的分析。
-sv_pragma
指示编译在单行或多行注释中紧随sv_pragma关键字后的SystemVerilog断言代码。
-timescale=time_unit/time_precision
为未包含`timescale编译指令的源文件指定时间单位和时间精度,覆盖那些包含`timescale编译指令的源文件的时间单位和时间精度。指定此选项的参数时,请勿包含空格。
-v library_file
指定一个库文件,在所有源文件的分析结束后,如果编译单元内存在未解析的设计元素,将继续分析库文件,如果与未解析的设计元素匹配,则会将该设计元素以库格式加入逻辑库中(之前所有设计元素加入逻辑库指得都是以设计格式),多个-v选项指定的库文件是从左至右进行分析的(如有必要)。
有关编译单元的相关知识,见下面这篇博客。
// 例1
// 文件:top.v
module top();
hello1 i_hello1();
hello i_hello();
endmodule
// 文件:hello.v
module hello();
initial $display("This is hello.v");
endmodule
// 文件:hello1.v
module hello1();
hello2 i_hello2();
endmodule
module nihao();
initial $display("This is nihao");
endmodule
// 文件:hello2.v
module hello2();
initial $display("This is hello2.v");
endmodule
% vlogan -full64 top.v hello.v -v hello1.v -v hello2.v
vlogan将先后分析top.v和hello.v,此时编译单元中含有模块top和hello,hello1模块是未解析的。随后从左至右依次分析-v选项指定的库文件,首先分析hello1.v,在文件中找到了hello1模块的定义,将该模块加入编译单元中,此时编译单元中含有模块top、hello和hello1,但hello1模块内例化了hello2模块,而此时编译单元内不含该模块,hello2模块被认为是未解析的(注意,nihao模块不会加入编译单元中,因为它此时没有被编译单元中的任何模块例化,或者说它并不需要解析,这点与源文件不同,源文件会无条件将所有设计元素都加入编译单元)。由于存在未解析的模块,继续分析hello2.v,在文件hello2.v中找到了hello2模块的定义,将该模块加入编译单元中,最后编译单元中的所有中间文件保存到指定的逻辑库中(注意,假设分析的最后存在未解析模块,也不会有任何问题,只要在展开阶段使用逻辑库中的模块对顶层模块进行解析时不要出现未解析模块就行)。
-y library_directory
指定一个库目录,在所有源文件的分析结束后,如果编译单元内存在未解析的设计元素,在库目录中查找与实例中的设计元素同名的文件并分析它,如果与未解析的设计元素匹配,则会将该设计元素以库格式加入逻辑库中(之前所有设计元素加入逻辑库指得都是以设计格式),多个-y选项指定的库目录是从左至右进行查找的(如有必要)。
-y选项和-v选项的地位是相同的,例如对于下面的命令,查找顺序是:首先在hello.v中查找模块hello1的定义,然后在当前目录下查找文件hello2,在其中查找模块hello2的定义。
% vlogan -full64 top.v -v hello1.v -y ./
+libext+extension+
指定仅在库目录中搜索具有指定文件名扩展名的文件(默认没有后缀),可以使用加号(+)分隔多个扩展名(需要注意的是,添加文件扩展名的顺序并不表示搜索的顺序)。
-work library
指定一个保存中间文件的逻辑库(该逻辑库必须在设置文件中进行了映射)。
+define+macro
定义任意个文本宏,可以覆盖源代码中的宏定义,可以使用加号(+)连接多个宏定义。
+lint=[no]ID|none|all
提供关于Verilog代码包含不良风格的提示:
+lint=ID=:启用指定的特定风格检查。
+lint=noID:禁用指定的风格检查。
+lint=none:禁用所有风格检查。
+lint=all:启用所有风格检查。
+liborder
+librescan
使用一个例子可以说明这两个选项的作用。
// 例2
// 文件:top.v
module top();
hello1 i_hello1();
endmodule
// 文件:hello1.v
module hello1();
hello2 i_hello2();
endmodule
module nihao();
initial $display("This is nihao in hello1.v ");
endmodule
// 文件:hello2.v
module hello2();
initial $display("This is hello2.v");
nihao i_nihao();
endmodule
// 文件:nihao.v
module nihao();
initial $display("This is nihao.v");
endmodule
% vlogan -full64 top.v -v hello1.v -v hello2.v -v nihao.v
和例1一样,在hello1.v被分析后,模块nihao不会加入编译单元中, 但在分析hello2.v时,出现了一个未解析的模块nihao,vlogan继续分析nihao.v并在其中找到了模块nihao的定义,这是默认的行为,也是+liborder选项的作用,即保证搜索的顺序(如果nihao.v中还是找不到模块nihao的定义,会重新回到hello1.v并开始新的一轮搜索)。
如果使用+librescan选项,一旦发现有未解析的模块,就会重新回到hello1.v并开始新的一轮搜索,此时会在hello1.v中找到模块nihao的定义,而不是在nihao.v中。
这个选项同时会影响-v和-y选项指定的库文件和库目录。
+incdir+directory
指定编译指令`include中文件搜索的额外目录(优先级最低),可以指定多个目录,每个路径名称之间用加号(+)分隔,多个目录会从左到右进行搜搜索(在编译指令中使用绝对路径时,该选项是没有意义的)。
+nowarnTFMPC
不显示"Too few module port connections"警告消息,这出现了模块端口未完全连接时。
+systemverilogext+ext
指定SystemVerilog源文件的文件扩展名,可以使用加号(+)分隔多个扩展名,使用该选项就无需使用-sverilog选项了。
+verilog2001ext+ext
指定使用2001标准编译的Verilog源文件的文件扩展名,可以使用加号(+)分隔多个扩展名。
+verilog1995ext+ext
指定使用1995标准编译的Verilog源文件的文件扩展名,可以使用加号(+)分隔多个扩展名。
+warn=[no]ID|none|all
提供关于Verilog代码警告信息的提示:
+lint=ID=:启用指定的警告。
+lint=noID:禁用指定的警告。
+lint=none:禁用所有警告。
+lint=all:启用所有警告。
Verilog_source_filename
不属于任何选项的参数,指定了源文件的名字。
-incr_vlogan
使用此选项后,当以下内容没有变化时,vlogan命令不进行分析:
1、在之前的中,该命令分析的源文件。
2、在该命令分析的源文件中引用的导入的包。
3、命令行选项。
4、某些shell环境变量。
注意:下面的情况会导致重新进分析:
% vlogan -full64 test1.v
% vlogan -full64 test2.v
% vlogan -full64 -incr_vlogan test1.v test2.v # 重新分析
% vlogan -full64 -incr_vlogan test2.v test1.v # 重新分析
注意
下面的这些选项只能在解析时使用,如果在展开时使用,则会出现错误:
-ignore keyword_argument
-ntb_define macro
-ntb_filext .ext
-sv_pragma
-v library_file
-y library_directory
-sverilog
-incr_vlogan
+define+macro
+incdir+directory
+libext+extension+
+systemverilogext+ext
+verilog1995ext+ext
+verilog2001ext+ext
+lint=[no]ID|none|all
+nowarnTFMPC
+warn=[no]ID|none|all
展开
展开是仿真设计的第二步。在这个阶段,VCS将使用分析过程中生成的中间文件来构建实例层次结构,并生成一个二进制可执行文件simv,该文件稍后用于仿真。在这个阶段可以选择以优化模式或调试模式来展开设计。仿真的运行时性能取决于你选择的模式和仿真过程中所需的灵活性级别,建议在确保设计正确性之前使用完整调试模式或部分调试模式,然后切换到优化模式。
优化模式(也称为批处理模式)能获得最佳的编译时间和运行时性能,通常在进行回归测试或不需要广泛的调试功能时使用。
调试模式下(也称为交互模式)通常是在开发周期的初期阶段,或者在你需要更多调试功能或工具来调试设计问题时使用。在此模式下获得的不是总体最佳性能,但通过使用某些编译时选项,可以将设计编译为完整调试模式或部分调试模式,从而在调试模式下获得局部最佳性能。
使用VCS
使用VCS的语法如下:
% vcs [elab_options] [libname.]design_unit
其中libname指的是需要展开的顶层模块、实体或配置所在的库名。如果未指定,VCS会根据synopsys_sim.setup文件中指定的顺序,在库列表中查找指定的design_unit。
其中design_unit可以是一下之一:
module:Verilog 顶层模块名。
entity:VHDL 顶层实体名。
entity__archname:要仿真的顶层实体和架构名称。默认情况下,archname是最近分析的架构。
cfgname:顶层配置名称。
常用的命令行选项和参数
-h或-help
列出了最常用的编译时和运行时选项的描述。
-ID
返回了一些有用的信息,例如VCS版本和构建日期、VCS编译器版本(与VCS版本相同)、以及你的工作站名称、平台和主机ID(用于授权)。
-full64
启用 64 位模式下的展开和仿真,也可以使用VCS_TARGET_ARCH环境变量来启用64位模式架构下的展开和仿真。
-file filename
指定一个包含展开选项的文件。
-R
在可执行文件生成后立即运行该文件。
-o name
指定生成的可指定文件的名字,默认为simv。
-gfile cmdfile
使用来自cmdfile文件的值覆盖设计通用参数或参数的默认值,cmdfile文件是一个包含指向设计通用参数的赋值命令的包含文件。
-notice
启用详细的诊断消息。
-q
不显示所有信息,例如关于VCS使用的C编译器、VCS正在解析的源文件、顶层模块或指定的时间尺度的消息。
-V
详细输出模式:VCS在运行C编译器、汇编器和链接器时,会打印它执行的命令。
-l filename
指定一个文件,VCS将在其中记录展开过程中的消息。如果还使用了-R选项,VCS将在同一个文件中记录来自展开和仿真的消息。
-liblist logical_lib1+logical_lib2+...logical_libn
-liblist选项指定了在展开时,解析模块的库搜索顺序,VCS会按照-liblist中指定的顺序开始搜索库。它不会遵循synopsys_sim.setup文件中指定的库顺序(默认),也不会查看synopsys_sim.setup文件中存在的其他库。
下面以一个例子说明这该选项的用法。
// 例3
// 文件:top.v
module top();
hello1 i_hello1();
endmodule
module hello1();
initial $display("This is top.v");
endmodule
// 文件:hello1.v
module hello1();
initial $display("This is hello1.v");
endmodule
WORK > DEFAULT
DEFAULT : ./work
lib1 : ./lib1
lib2 : ./lib2
% vlogan -full64 top.v -work lib1
% vlogan -full64 hello1.v
% vcs -full64 lib1.top
在上例中,逻辑库work中存在模块hello1(来自于top.v),而逻辑库lib1中存在模块top和模块hello1(来自于hello1.v),在对顶层模块top进行展开时,会选择来自top.v的模块hello1进行解析。使用-liblist选项,可以改变解析搜索的范围和顺序。
% vcs -full64 lib1.top -liblist lib1
这里还需要谈谈设计单元和库单元,之前我们说到,在分析时如果使用-v或-y选项,可能导致一个模块以库格式加入逻辑库中。在逻辑库进行搜索时,库格式的模块优先级低于设计格式的模块,也即会先尝试以设计格式进行解析,随后再以库格式进行解析,使用-liblist_nocelldiff选项可以消除库格式和设计格式的优先级差异。
一个模块只能以设计格式或库格式之一存在于一个逻辑库,因此可能会出现覆盖情况,如下所示。
// 例4
// 文件:top.v
module top();
hello1 i_hello1();
endmodule
// 文件:hello1.v
module hello1();
initial $display("This is hello1.v");
endmodule
% vlogan -full64 top.v -v hello1.v -work lib1 # 模块hello1以库格式加入lib1
% vlogan -full64 hello1.v -work lib1 # 模块hello1以设计格式加入lib1,覆盖
仿真
在展开阶段,VCS使用生成的中间文件创建一个二进制可执行文件simv,使用simv来运行仿真。根据设计的展开方式,可以使用以下两种模式运行仿真:
- 调试模式(也称为交互模式)
- 优化模式(也称为批处理模式)
调试模式
在设计周期的初始阶段,可以在调试模式(也称为交互模式)下展开设计。在此阶段,您需要使用图形用户界面(GUI)或命令行来调试设计问题。要使用GUI进行调试可以使用Verdi;要使用命令行接口进行调试可以使用统一命令行接口。
注意:要在交互模式下仿真设计,请使用-debug_access+r、-debug_access+all展开设计。
优化模式
当大多数设计问题已解决时,可以在优化模式(也称为批处理模式)下展开设计。在此阶段,可以实现更好的性能,以最小的调试能力运行回归测试。
常用的运行时选项
使用以下命令行来仿真设计:
% simv_executable [runtime_options]
-gui
此选项在设置了VERDI_HOME时启动Verdi。
-ucli
此选项以UCLI模式启动simv。