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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4534|回复: 6

[求助] uvm的uvm_field_sarray_int打印问题

[复制链接]
发表于 2012-5-22 23:44:40 | 显示全部楼层 |阅读模式

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

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

x
在用sprint()打印uvm_field_sarray_int时,如果数组太长会自动忽略中间的内容,不知道有什么参数可以不忽略打印
 楼主| 发表于 2012-5-24 22:04:08 | 显示全部楼层
这个都没人知道?
发表于 2022-4-20 14:29:30 | 显示全部楼层
也发现这个问题了,不知道楼主有没找到办法?
10年前的贴了。。。有其他大佬知道办法不?
发表于 2022-4-21 14:30:51 | 显示全部楼层


桅杆 发表于 2022-4-20 14:29
也发现这个问题了,不知道楼主有没找到办法?
10年前的贴了。。。有其他大佬知道办法不? ...


居然有人挖出来10年前的帖子。。不过这个问题的答案我还真的恰巧可以回答。
查阅一下uvm-1.1d的源码,找到uvm_printer.svh里面的关于类class uvm_printer_knobs的参数,你会发现有两个参数begin_elements和end_elements,这两个就是控制打印数组时缩略显示数组前面和后面各5个integral的数值的参数。如下图:
图片.png
找到这两个参数以后就简单了。看到备注里面说-1代表no max无限制了没?

查阅一下sprint()函数的源码定义,在uvm_object.svh里面,sprint()其实是支持参数输入sprint(uvm_printer printer=null)的,如下图:
图片.png
所以sprint()函数可以自定义uvm_printer的行为。那么,问题就很好解决了,自己例化一个自定义的uvm_printer,修改uvm_printer里面的uvm_printer_knobs的对应参数,然后将自定义的uvm_printer作为sprint()函数的输入就可以了。
举个代码案例,我写了自定义的scoreboard,需要对送进来的transactions的数组进行compare比较,比较出错以后将出错的数组队列里面的每一个different的值全部打印出来,那就可以这样:




  1. class scoreboard extends uvm_scoreboard;
  2.   uvm_table_printer local_printer

  3. //new(),check_phase()省略

  4. function void build_phase(uvm_phase phase);
  5.   super.build_phase(phase);
  6.   local_printer = new();
  7.   local_printer.knobs.begin_elements = -1;
  8. endfunction : build_phase

  9. task run_phase(uvm_phase phase);
  10.   string print_msg, dut_msg, ref_msg;
  11.   my_transaction dut_trans, ref_trans;
  12.   
  13.   forever begin
  14.   /*
  15.   ...
  16.   //compare的主函数省略
  17.   ...
  18.   */  
  19.   //假如比对出错:
  20.    if(! dut_trans.compare(ref_trans)) begin
  21.      dut_msg = dut_trans.sprint(local_printer);
  22.      ref_msg = ref_trans.sprint(local_printer);
  23.      `uvm_error(get_name(), $sformatf("Comparing dut & ref transactions not match!\n dut_trans:\n%s ref_trans:\n%s", dut_msg, ref_msg))
  24.    end //if
  25.   end //forever

  26. endtask : run_phase

  27. endclass //scoreboard


复制代码


注意这里我用uvm_table_printer而不是直接用uvm_printer的原因是,我希望打印的时候是按照table的表格打印的形式,所以直接就实例化uvm_table_printer这个uvm_printer的子类了。你们可以根据自己希望的打印格式来选择。
以上~
其中的那个knobs是用来保存printer里面的变量和参数的,看看它的源码就能知道。
图片.png
其实还可以直接手动调用或重载printer里面的这个function void print_array_range (int min, int max);应该也能起到相同的效果,不过我个人还没测试过。

图片.png




图片.png
发表于 2022-4-21 16:06:10 来自手机 | 显示全部楼层
楼上正解,不过没必要单独定义一个打印机传进去,就用默认的打印机会简单些
发表于 2022-4-22 09:12:11 | 显示全部楼层


qsh123_123 发表于 2022-4-21 14:30
居然有人挖出来10年前的帖子。。不过这个问题的答案我还真的恰巧可以回答。
查阅一下uvm-1.1d的源码,找 ...


感谢感谢。大佬授渔还授鱼, 受益匪浅。
发表于 2023-6-28 20:11:37 | 显示全部楼层


qsh123_123 发表于 2022-4-21 14:30
居然有人挖出来10年前的帖子。。不过这个问题的答案我还真的恰巧可以回答。
查阅一下uvm-1.1d的源码,找 ...


太强了大佬,解决我的问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-12-19 06:26 , Processed in 0.022206 second(s), 7 queries , Gzip On, Redis On.

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