VCS入门


1 前言

        同样只找到Verilog Compiled Simulator 2016,凑合用吧。


2 综合概述

        VCS工作流程如下图:

2

        VCS编译RTL CODE过程如下图:

1

        VCS先将verilog/systemverilog文件转化为C文件,在linux下编译链接生成可执行文件,在linux下运行simv即可得到仿真结果。

        VCS的debug有两种方式:

        仿真时要考虑的因素:

        Debugging的系统任务有:

        VCS的Verilog仿真事件队列:


3 VCS UCLI执行

3.1 编译链接生成二进制可执行文件

        编译指令如下:

vcs source_file [compile_time_options]

        其中:

        compile_time_options编译时可选的选项:

3.2 仿真

        执行指令如下:

simv [compile_time_options]

        compile_time_options编译时可选的选项:

3.3 调用DW库

        使用如下指令指定DW库路径:

-y $SYNOPSYS /dw/sim_ver+libext+.v+

        使用如下代码直接在代码中例化:

Dwpart #(parameter) u1(
  .porta(a),
  .portb(b)
);

4 VCS DVE执行

        DVE全称为:Discovery Visual Environment。

        支持以下三种Debug模式:

        支持的语言:

4.1 启动

        从编译过程启动:

vcs source.v -R -gui -debug_all

        根据现有的可执行文件(simv)启动:

simv -gui

        直接启动:

dve&

4.2 打开文件

        打开数据库文件:

GUI图太多了,以后补图…


5 后处理VCD+

        之前的仿真方法在启动DVE后需要点击Run来一步一步显示波形。而VCD+可以直接将波形一次性仿真出来,然后用DVE查看。

        仿真流程:

        DVE后处理模式:

        VCD+系统任务:

$vcdpluson(level_number,module_instance,...|net_or_reg)

        其中:

        通过以下代码停止在模块实例或单独网络或寄存器中的记录:

$vcdplusoff(module_instance,...|net_or_reg);

        通过以下代码讲结果写入VCD文件:

$vcdplusautoflushon();      //每当有中断或停止命令时,VCS会自动将内存中的结果写入VCD+文件
$vcdplusautoflushoff();     //关闭中断时数据自动刷新
$vcdplusautoflush();        //指示VCS把内存中的结果写入VCD+文件

        通过以下代码控制循环录制:

$vcdplusdeltacycloneon();   //打开增量循环录制,用于后处理
$vcdplusdeltacycloneoff();  //关闭增量循环录制

        通过以下代码控制零延迟故障记录:

$vcdplusglitchon();       //打开零延迟故障记录,用于后处理
$vcdplusglithchoff();     //关闭零延迟故障记录

        通过以下代码控制寄存器组数据记录:

$vcdplusmemon();        //打开mem记录,用于后处理
$vcdplusmemoff();       //关闭mem记录

        VCD+文件的编译:

vcs files vcdplus_switches  other_switches

        其中:

        用于在后处理中调用DVE的示例命令:

dve -vpd vcdplus.vpd

        VCD+文件编译可选项:


6 其它

6.1 辅助选项

        使用以下方法报告代码里的竞争冒险状况:

6.2 产生mismatch的原因

        产生mismatch的原因如下:

        例如:

module race;
  reg a;

  initial begin
    a=0;
    #10 a=1;
  end

  initial begin
    #10 if(a)$display("a=1");
  end
endmodule

        由于第10个单位时间上a跳变,所以不同的仿真工具或者不同版本的相同仿真工具在这个时间点上执行“a=1”和“if(a)”的顺序不同而导致结果不同。

6.3 优化

        编译时加入以下命令优化设计:

+rad

        它尝试通过以下方法优化设计:

6.4 性能分析

        编译时通过以下命令做性能分析:

+prof

        新版本的VCS中命令该更新为:

-simprofile

        使用此命令分析和统计每个模块消耗的时间和内存的百分比等等。


7 覆盖率

7.1 代码覆盖率

        代码覆盖率的问题包含:

        其中,跳变覆盖在Verilog中只检测以下变量:

        代码覆盖率可以用于:

        编译时加入以下指令来检测代码覆盖率:

-cm <coverage_type>  <other coverage option>

        其中:

        如果不想让源代码中的某些语句被检查覆盖率,可以加入以下代码:

//VCS coverage on
//VCS coverage off

        或者可以用synopsys的专用注释,不仅可以忽略覆盖率,还可以忽略综合:

//synopsys translate_on
//synopsys translate_off

        如果不想让某些文件被检查覆盖率,可以加入以下开关命令忽略该文件:

-cm_hier <filename>

7.2 功能覆盖率

        功能覆盖率的问题包含:

        功能覆盖率一般在验证中使用。


8 后仿真

        之前的内容是前仿真,也就是功能仿真。仿真好之后把源代码交给DC综合,得到门级网表和SDF(Standard Delay Format)文件。SDF文件包含了布局布线后的标准延迟参数,结合门级网表和仿真库文件就可以做后仿真了。

8.1 SDF文件

        SDF文件中内嵌的时序信息包含:

8.2 VCS中使用SDF

        首先通过以下命令在RTL源代码中反标SDF:

$sdf_annotate("sdf_file"[,module_instance][,"sdf_configfile"],[,"sdf_logfile"][,"mtm_spec"][,"scale_factors"][,,"scale_type"]);

        然后编译门级网表,同时要指定仿真库:

vcs gate_netlist.v  -v sim_lib.v

        特别注意,如果使用预编译SDF文件指令,则“+rad”指令将被忽略

8.3 设置min/typ/max延迟

        可以在编译时开启下面的选项来选择任意一个延迟模型:

+mindelays
+typdelays
+maxdelays

        也可以三种全部编译:

+allmtm

        然后仿真时选择任意一个延迟:

+mindelays
+typdelays
+maxdelays

8.4 延迟过滤(Delay Filtering)

        延迟过滤包含以下两种:

        编译时加入以下指令来打开传输延迟过滤开关:

+transport_path_delays  ;#为路径延迟打开传输延迟模型
+transport_int_delays   ;#为互连延迟打开传输延迟模型

        修改延迟过滤标准:


        告辞

Back to Archive
WeChat QR Code

Scan to connect