热度 5| |
C家仿真器以前的名字叫Incisiv,现在改称为Xcelium。C家的仿真器非常强大,不仅可以做数字仿真,还可以做混合信号仿真。
考量验证质量最基本的方法就是code coverage,原理就是跑仿真的时候记录RTL的各行代码是否激励exercise过。跑完所有的test case,如果合并的code coverage显示RTL中某些代码从未被激励exercise过,这种情况说明test case有可能不够完善,某些设计的功能有可能还没有被测试到。当然具体情况要根据code coverage结果具体分析一下。例如,RTL中有case statement,如 case (something[1:0])。 因为只有两位,可能的组合就是2’b00, 2’b01, 2’b10, 2’b11。写code的时候通常会加上default branch。通常这个default branch是无法测试到的,code coverage会显示没有激励过。这种情况可以waive掉default branch的coverage。
在仿真过程中生成code coverage信息需要在irun或xrun命令行加上几个选项。下面是一个例子。
irun -gui -access rwc -f filelist -top tb_dig_top -coverage b:e:f -covdut u_dig_top
也可以写一个ccf文件设置code coverage。 下面是一个例子。 这个方法可以更细致地设置code coverage 生成。
select_coverage -block -expr -fsm -module adc_dig
set_implicit_block_scoring -off
set_assign_scoring
set_branch_scoring
set_expr_scoring -all
set_fsm_reset_scoring
set_fsm_arc_scoring -on
set_fsm_scoring -hold_transition on
select_functional
通常完整地验证由很多个test case构成。假设每个test case都在自己的目录test_<something>下运行。跑完所有地test case后每个test_<something>都有code coverage数据。因为每个test case都只是exercise了设计的一部分功能,每个test_<something>下的code coverage都不能完整地代表验证code coverage。这时需要把每个test case产生的code coverage合并起来。这里需要用到C家仿真器包含的工具imc。 下面是一个合并code coverage的例子。
imc -execcmd "merge ./test_*/cov_work/scope/test -out merged -overwrite -metrics all"
合并后生成一个merged database,可以用imc 打开并分析code coverage。 运行
imc -gui
打开merged database,就可以分析了。
有时test bench里DUT的使用场景比较复杂。以上面的adc为例。某些使用场景是单个adc,某些使用场景是两个adc一起工作在interleaving模式。这时会用到两个不同配置的test bench,一个test bench配置成单一adc,一个配置成dual adc。 这个情况下合并code coverage就很麻烦了,需要写一个 IMC merge command file来指导imc合并code coverage。 下面是一个·imc_merge_all.cmd的例子。
merge_config -source tb_adc_top.i_adc -targettype adc_dig
merge_config -source tb_adc_top.i_adc_0 -targettype adc_dig
merge_config -source tb_adc_top.i_adc_1 -targettype adc_dig
merge ./test_adc_*/cov_work/scope/test_sv0 -out merged -overwrite -message 1 -initial_model ./test_adc_14b_single/cov_work/scope/test_sv0
具体细节可以参考imc手册。