相关阅读
VCShttps://blog.csdn.net/weixin_45791458/category_12828763.html?spm=1001.2014.3001.5482
两步法仅支持Verilog和SystemVerilog的设计。使用两步法仿真设计涉及两个基本步骤
- 编译
- 仿真
编译
编译是仿真设计的第一步。在此阶段,VCS将构建实例层次结构,并生成一个二进制可执行文件simv,该文件稍后用于仿真。在这个阶段可以选择以优化模式或调试模式来展开设计。仿真的运行时性能取决于你选择的模式和仿真过程中所需的灵活性级别,建议在确保设计正确性之前使用完整调试模式或部分调试模式,然后切换到优化模式。
优化模式(也称为批处理模式)能获得最佳的编译时间和运行时性能,通常在进行回归测试或不需要广泛的调试功能时使用。
调试模式下(也称为交互模式)通常是在开发周期的初期阶段,或者在你需要更多调试功能或工具来调试设计问题时使用。在此模式下获得的不是总体最佳性能,但通过使用某些编译时选项,可以将设计编译为完整调试模式或部分调试模式,从而在调试模式下获得局部最佳性能。
事实上,VCS两步法中的编译,就好像是三步法中的分析+展开的结合,与此不同的是,三步法中不会将中间文件保存在逻辑库中。
使用VCS
使用VCS的语法如下:
% vcs [compile options] Verilog_files
常用的命令行选项和参数
-h或-help
列出了最常用的编译时和运行时选项的描述。
-ID
返回了一些有用的信息,例如VCS版本和构建日期、VCS编译器版本(与VCS版本相同)、以及你的工作站名称、平台和主机ID(用于授权)。
-v filename
指定一个库文件,在所有源文件的编译结束后,如果编译单元内存在未解析的设计元素,将继续在库文件中进行查找,多个-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
% vcs -full64 top.v hello.v -v hello1.v -v hello2.v
VCS将先后分析top.v和hello.v,此时编译单元中含有模块top和hello,hello1模块是未解析的。随后从左至右依次分析-v选项指定的库文件,首先分析hello1.v,在文件中找到了hello1模块的定义,将该模块加入编译单元中,此时编译单元中含有模块top、hello和hello1,但hello1模块内例化了hello2模块,而此时编译单元内不含该模块,hello2模块被认为是未解析的(注意,nihao模块不会加入编译单元中,因为它此时没有被编译单元中的任何模块例化,或者说它并不需要解析,这点与源文件不同,源文件会无条件将所有设计元素都加入编译单元)。由于存在未解析的模块,继续分析hello2.v,在文件hello2.v中找到了hello2模块的定义,将该模块加入编译单元中。
-y directory
指定一个库目录,在所有源文件的分析结束后,如果编译单元内存在未解析的设计元素,在库目录中查找与实例中的设计元素同名的文件,多个-y选项指定的库目录是从左至右进行查找的(如有必要)。
-y选项和-v选项的地位是相同的,例如对于下面的命令,查找顺序是:首先在hello.v中查找模块hello1的定义,然后在当前目录下查找文件hello2,在其中查找模块hello2的定义。
% vcs -full64 top.v -v hello1.v -y ./
+libext+extension+
指定仅在库目录中搜索具有指定文件名扩展名的文件(默认没有后缀),可以使用加号(+)分隔多个扩展名(需要注意的是,添加文件扩展名的顺序并不表示搜索的顺序)。
+incdir+directory+
指定编译指令`include中文件搜索的额外目录(优先级最低),可以指定多个目录,每个路径名称之间用加号(+)分隔,多个目录会从左到右进行搜搜索(在编译指令中使用绝对路径时,该选项是没有意义的)。
+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
% vcs -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选项指定的库文件和库目录.
-full64
启用 64 位模式下的编译和仿真。
-file filename
指定一个包含源文件列表编译选项的文件。
-R
在生成可执行文件后立刻执行它。
-o name
指定生成的可指定文件的名字,默认为simv。
-pvalue+parameter_hierarchical_name=value
将指定的参数更改为指定的值。
-parameters filename
将文件中指定的参数更改为文件中指定的值,文件中一行的语法如下:
assign value path_to_parameter
参数的路径类似于层次标识符,只是使用斜杠(/)而不是句点作为分隔符。
有关层次标识符的相关内容,见下面的博客。
Verilog基础:层次化标识符的使用https://chenzhang.blog.csdn.net/article/details/143133320?spm=1001.2014.3001.5502
-notice
启用详细的诊断消息。
-q
静默模式:不显示所有信息,例如关于VCS使用的C编译器、VCS正在解析的源文件、顶层模块或指定的时间尺度的消息。
-V
详细输出模式:VCS在运行C编译器、汇编器和链接器时,会打印它执行的命令。
-l filename
指定一个文件,VCS将在其中记录编译过程中的消息。如果还使用了-R选项,VCS将在同一个文件中记录来自编译和仿真的消息。
+define+macro
定义任意个文本宏,可以覆盖源代码中的宏定义,可以使用加号(+)连接多个宏定义。
仿真
在展开阶段,VCS使用生成的中间文件创建一个二进制可执行文件simv,使用simv来运行仿真。根据设计的展开方式,可以使用以下两种模式运行仿真:
- 调试模式(也称为交互模式)
- 优化模式(也称为批处理模式)
调试模式
在设计周期的初始阶段,可以在调试模式(包括交互调试模式和后处理调试模式)下展开设计。在此阶段,您需要使用图形用户界面(GUI)或命令行来调试设计问题。要使用GUI进行调试可以使用Verdi;要使用命令行接口进行调试可以使用统一命令行接口。
注意:要在调试模式下仿真设计(包括使用fsdbDumpfile()函数导出波形),请使用-debug_access+r、-debug_access+all选项展开设计。
优化模式
当大多数设计问题已解决时,可以在优化模式(也称为批处理模式)下展开设计。在此阶段,可以实现更好的性能,以最小的调试能力运行回归测试。
常用的运行时选项
使用以下命令行来仿真设计:
% simv_executable [runtime_options]
-gui=[verdi|dve]
指定一个GUI进行调试,如果不指定参数,默认表示启动Verdi进行调试(前提是设置了VERDI_HOME环境变量)。
-verdi
指定启动Verdi进行调试(前提是设置了VERDI_HOME环境变量)。
-ucli
指定以UCLI模式启动进行调试。