来自微信公众号 “数字芯片实验室”

测试平台在早期通常需要具有调试功能,例如使用系统任务$monitor或$display打印指定的文本,以及在仿真过程中记录波形信息。

这些波形信息可以是$dumpvars系统任务指定写入的VCD文件,也可以是$vcdpluson系统任务指定写入的VPD文件。

仿真器的这些调试功能大大降低了仿真性能,特别是将文本信息直接打印到显示器上。因此,在设计周期的哪个阶段启用仿真器的这些调试功能是一个需要考虑的问题。

在testbench中使用编译指令‘ifdef, ‘else和‘endif 可以满足我们的一些需求。此时,我们需要在VCS编译时使用+define编译选项。

initial begin

`ifdef postprocess

$vcdpluson(0,design);

`endif

end
vcs testbench.v design.v +define+postprocess

系统函数$vcdpluson(0,design)将设计中的波形信息记录在vpd文件中,这大大降低了仿真性能。

实际项目中,我们只在设计仿真初期需要这个波形信息,因为在仿真初期验证平台的debug能力比仿真速度更重要。

在仿真周期的后期,进行回归测试(regression)就可以不添加该编译选项以提高仿真性能。

另外这种编译指令方式在我们添加或者改变这些系统函数时需要重新编译,这增加了设计的仿真周期。

为此,VCS等仿真器提供了仿真选项支持$test$plusargs 代替‘ifdef编译选项

initial if ($test$plusargs("postprocess")) begin

$vcdpluson(0,design_1);

end

使用仿真选项支持$test$plusargs之后,就不需要对设计和测试平台重新编译,也不需要编译选项+define。取而代之的是在仿真时,增加仿真选项

simv +postprocess

需要注意的是工具会识别任何以该仿真选项为前缀的字符串。

module top; 

initial begin 

     if ( $test$plusargs("a") ) 

          $display("\n<<< Now a >>>\n"); 

     else if ( $test$plusargs("ab") ) 

          $display("\n<<< Now ab >>>\n"); 

     else if ( $test$plusargs("abc") ) 

          $display("\n<<< Now abc >>>\n"); 

     end

endmodule

使用仿真选项+a, +ab,或者+abc,都会输出<<>>。

所以我们应该将长的仿真选项放在最前面,如下所示

module top;

initial begin

    if ( $test$plusargs("abc") )

        $display("\n<<< Now abc >>>\n");

    else if ( $test$plusargs("ab") )

        $display("\n<<< Now ab >>>\n");

    else if ( $test$plusargs("a") )

        display("\n<<< Now a >>>\n");

    end

end

module

使用仿真选项可以避免仿真前期重复的编译,但是也会增加一次编译时间。

我们可以综合上面两种方法,根据实际需求,同时使用编译和仿真选项。

`ifdef comppostprocess
initial
    if($test$plusargs("runpostprocess")) begin
        $vcdpluson(0,design_1);
    end
`endif

类似地,可以使用$value$plusargs在仿真时传入值,避免重复编译。

本文转载自公众号:芯片数字实验室
原文链接:https://mp.weixin.qq.com/s/PL\_DBXTswVM2D7brcf4RjA
未经作者同意,请勿转载!

推荐阅读

  • 基于VCS的计数器数字芯片功能仿真(step by step)
  • 使用VCS进行竞争冒险检查(Race Condition Detection)
  • 基于Formality的形式验证流程(step by step)

想了解更多内容,欢迎关注芯片数字实验室专栏

发表评论

邮箱地址不会被公开。 必填项已用*标注