在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 29462|回复: 46

[原创] Cadence NC/Incisiv里做Functional Coverage (UVM) 分享

[复制链接]
发表于 2012-7-27 10:37:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 chenfengrugao 于 2012-7-27 11:57 编辑

经过两天的折腾终于看到功能覆盖率的报告了  本人初学,欢迎讨论、批评指正。希望对大家有帮助。

提示一
covergroup里的option.per_instance一定要设成1(默认是0,不保存覆盖率数据),
option.per_instance = 1;  为了这个调试了两天,cadence的工具也不给个提示。。。
当然也可以在ccf(coverage configuration file)里设置全局的参数,如下:
select_functional
set_covergroup -default_goal 100
set_covergroup -per_instance_default_one

提示二
仿真命令,希望对大家有帮助
irun \
-svseed random \
-access +rwc \
-coverage functional \
-covfile cov.ccf \
-uvm \
-uvmhome /home/bill/asic/INCISIV10.20/tools/uvm-1.1/uvm_lib/uvm_sv \
+UVM_TESTNAME=my_test2 \
$(SRC)

提示三
用iccr查看和分析覆盖率时,合并多次覆盖率数据的命令需注意:
1. load_test *   直接用“*”就行,如果一定要指定文件名,请指定文件夹的名字test_sv-xxxxxxxxx(cov_work/scope/test_sv-xxxxxxxxx/icc_xxxxxxxx_xxxxxxxx.ucd)
2. merge test_sv-* -output all

提示四
1. covergroup cg;
    endgroup
    cg = new(); 别忘了用new来初始化covergroup哦。
2. 使用covergroup cg;不带采样控制的语句时(带采样控制是这个样子covergroup cg @(posedge clk); ),
需要在uvm_monitor里使用cg.sample()来采样。
3. 可以使用cg.coverage()来取得实时的覆盖率情况,进而调整约束和控制仿真的结束。

代码如下:





  1. class my_subscriber extends uvm_subscriber #(my_transaction);
  2.   `uvm_component_utils(my_subscriber)
  3.   // has implicit analysis_export

  4.   bit reset;
  5.   bit [3:0] cmd;
  6.   bit [7:0] addr;
  7.   bit [7:0] data;

  8.   covergroup cover_bus; //covergroup is like construct
  9.     option.per_instance = 1;
  10.     option.goal = 100;

  11.     cov_reset: coverpoint reset { bins r1[] = {[0:1]}; }

  12.     cov_cmd_0: coverpoint cmd[0] { bins c0[] = {[0:1]}; }
  13.     cov_cmd_1: coverpoint cmd[1] { bins c1[] = {[0:1]}; }
  14.     cov_cmd_2: coverpoint cmd[2] { bins c2[] = {[0:1]}; }
  15.     cov_cmd_3: coverpoint cmd[3] { bins c3[] = {[0:1]}; }

  16.     cov_addr_0: coverpoint addr[0] { bins a1[] = {[0:1]}; }
  17.     cov_addr_1: coverpoint addr[1] { bins a2[] = {[0:1]}; }
  18.     cov_addr_2: coverpoint addr[2] { bins a3[] = {[0:1]}; }
  19.     cov_addr_3: coverpoint addr[3] { bins a4[] = {[0:1]}; }
  20.     cov_addr_4: coverpoint addr[4] { bins a5[] = {[0:1]}; }
  21.     cov_addr_5: coverpoint addr[5] { bins a6[] = {[0:1]}; }
  22.     cov_addr_6: coverpoint addr[6] { bins a7[] = {[0:1]}; }
  23.     cov_addr_7: coverpoint addr[7] { bins a8[] = {[0:1]}; }

  24.     cov_data_0: coverpoint data[0] { bins d0[] = {[0:1]}; }
  25.     cov_data_1: coverpoint data[1] { bins d1[] = {[0:1]}; }
  26.     cov_data_2: coverpoint data[2] { bins d2[] = {[0:1]}; }
  27.     cov_data_3: coverpoint data[3] { bins d3[] = {[0:1]}; }
  28.     cov_data_4: coverpoint data[4] { bins d4[] = {[0:1]}; }
  29.     cov_data_5: coverpoint data[5] { bins d5[] = {[0:1]}; }
  30.     cov_data_6: coverpoint data[6] { bins d6[] = {[0:1]}; }
  31.     cov_data_7: coverpoint data[7] { bins d7[] = {[0:1]}; }
  32.   endgroup: cover_bus

  33.   function new(string name, uvm_component parent);
  34.     super.new(name, parent);
  35.     //new covergroup
  36.     cover_bus = new();
  37.   endfunction: new

  38.   function void write( my_transaction t);
  39.     reset = t.reset;
  40.     cmd = t.cmd;
  41.     addr = t.addr;
  42.     data = t.data;
  43.     //covergroup sample values
  44.     cover_bus.sample();
  45.     $display("my_subscriber| cmd = %h, addr = %h, data= %h, cov=%d\%",
  46.                  cmd, addr, data, cover_bus.get_coverage());
  47.   endfunction: write

  48. endclass: my_subscriber

  49. class my_monitor extends uvm_monitor;
  50.   `uvm_component_utils(my_monitor)

  51.   //declare analysis port
  52.   uvm_analysis_port #(my_transaction) aport;
  53.   virtual dut_if dut_vi;

  54.   function new(string name, uvm_component parent);
  55.     super.new(name, parent);
  56.   endfunction: new

  57.   function void build_phase(uvm_phase phase);
  58.     super.build_phase(phase);
  59.     //new aport instance
  60.     aport = new("aport", this);
  61.     //get dut_if
  62.     assert( uvm_config_db #(virtual dut_if)::get(this, "", "dut_vi", dut_vi) );
  63.   endfunction: build_phase

  64.   task run_phase(uvm_phase phase);
  65.     forever
  66.     begin
  67.       my_transaction tx;
  68.       @(posedge dut_vi.clock);
  69.       tx = my_transaction::type_id::create("tx");
  70.       tx.reset = dut_vi.reset;
  71.       tx.cmd = dut_vi.cmd;
  72.       tx.addr = dut_vi.addr;
  73.       tx.data = dut_vi.data;
  74.       //send tx through analysis port
  75.       aport.write(tx);
  76.     end
  77.   endtask: run_phase

  78. endclass: my_monitor



复制代码
发表于 2012-7-29 05:40:44 | 显示全部楼层
顶楼主的原创,尤其是最后一个new(),很多人都容易忘记的。另外对总线上数据和地址的收集,可以试试收集翻转的信息,也许更有效。
发表于 2012-7-30 14:17:44 | 显示全部楼层
多谢分享,正在学习中。
发表于 2012-8-3 00:46:53 | 显示全部楼层
正在学习,谢了~
发表于 2012-8-19 22:25:48 | 显示全部楼层
自己顶一下,mark
发表于 2012-11-15 13:27:20 | 显示全部楼层
正在学习这个。。
发表于 2012-12-19 11:16:08 | 显示全部楼层
多谢分享,想问一下
select_functional
set_covergroup -default_goal 100

这两句的目的是啥,不设置的话会出现什么问题呢
发表于 2012-12-19 11:27:33 | 显示全部楼层
这个的确很好。。。
发表于 2013-3-30 18:42:13 | 显示全部楼层
请问楼主,用哪个版本的ius可以支持uvm?
 楼主| 发表于 2013-4-17 11:21:48 | 显示全部楼层
回复 9# cgssuccess

IUS10
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 13:44 , Processed in 0.032678 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表