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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: doogo

[原创] 《UVM实战》24小时问答

[复制链接]
发表于 2015-7-13 19:19:35 | 显示全部楼层
张先生,你好。我看了你的书《UVM实战1》。有个问题没弄明白,书里面似乎也没有将。就是如何将一个从uvm_reg_sequence继承出来的sequence像其他sequence一样发送到总线上面去,通过前门配置到寄存器中。看不到你是如何将transaction转换成对应的总线时序发送出去的?有没有类似的例子可以参考啊
发表于 2015-7-20 16:56:36 | 显示全部楼层
多谢,东西很全
发表于 2015-7-22 09:09:05 | 显示全部楼层
丁丁丁丁
发表于 2015-8-27 08:26:50 | 显示全部楼层
UVM 问题,请求帮助回答
复件 UVM问题.rar (7.3 KB, 下载次数: 2 )
发表于 2015-8-27 11:09:13 | 显示全部楼层
最近研究UVM源码中提供的相关例子,在测试register模型时遇到一些问题想向大家请教。摘部分代码如下:
        
          
        
virtual        function void connect_phase(uvm_phase phase);
        
      if (apb !=        null) begin
        
                reg2apb_adapter reg2apb = new("reg2apb");
        
                reg2apb_adapter mon_reg2apb = new("mon_reg2apb");
        
                regmodel.default_map.set_sequencer(apb.sqr,reg2apb);
        
`ifdef        EXPLICIT_MON
        
                apb2reg_predictor.map = regmodel.default_map;
        
                apb2reg_predictor.adapter = mon_reg2apb;
        
                regmodel.default_map.set_auto_predict(0);
        
                apb.mon.ap.connect(apb2reg_predictor.bus_in);
        
`else
        
                regmodel.default_map.set_auto_predict(1);
        
`endif
        
      end
        
             regmodel.print();
        
   endfunction
        
这是在环境中配好转换器。
        转换器中的bus到寄存器函数为:
        virtual        function void bus2reg(uvm_sequence_item bus_item,
        
                                       ref uvm_reg_bus_op rw);
        
    apb_rw apb;
        
    if        (!$cast(apb,bus_item)) begin
        
             `uvm_fatal("NOT_APB_TYPE","Provided bus_item is not        of the correct type")
        
      return;
        
    end
        
           uvm_report_info("kind(adapter)        :",$sformatf("kind:%0h",apb.kind));
        
           uvm_report_info("addr(adapter)        :",$sformatf("addr:%0h",apb.addr));
        
           uvm_report_info("data(adapter)        :",$sformatf("data:%0h",apb.data));
        
    rw.kind =        apb.kind == apb_rw::READ ? UVM_READ : UVM_WRITE;
        
    rw.addr =        apb.addr;
        
    rw.data =        apb.data;
        
    rw.status =        UVM_IS_OK;
        
  endfunction
        
drv会根据收到的transaction转发到总线上,monitor监测总线行为,并把收到transaction进行ap.write(tr)
        
遇到的问题是:运行时带上宏定义EXPLICIT_MON,测试reg_predictor的用法。
        
发现调用一个寄存器readwrite函数时,bus2reg函数会执行两遍,对于read,        最终返回的值不是monitor传回来的,而是drv之前收到并转发出去的transaction中的data字段。感觉regmodel.default_map.set_auto_predict(0);        没有起作用。或者我理解的reg_predictor运行机制有误,我认为非自动预测模式下,bus2reg只会在mon把监测到的transaction传给pre_predictor之后,才会被调用。但目前实验的结果是在drvtransaction转发出去后也会调用,而且该处的调用决定了read函数的返回值。
发表于 2015-8-27 21:43:10 | 显示全部楼层
书很好,正在研读中...
发表于 2015-9-1 10:51:51 | 显示全部楼层
回复 265# farmer851010


    好像是顺序问题,你改为下面的代码,再试试!
`ifdef        EXPLICIT_MON
            regmodel.default_map.set_auto_predict(0);
                apb2reg_predictor.map = regmodel.default_map;        
                apb2reg_predictor.adapter = mon_reg2apb;        
                apb.mon.ap.connect(apb2reg_predictor.bus_in);      
`else        
                regmodel.default_map.set_auto_predict(1);   
`endif
发表于 2015-9-2 15:27:50 | 显示全部楼层
回复 267# johnsonzhxun


    非常感谢。
    顺序调整试过,没有效果。好像跟顺序没有关系
发表于 2015-9-3 11:20:12 | 显示全部楼层
回复 1# doogo

你好,我在用redhat,你的文件所用的setup.vcs我用不了,能不能提供一个能用的setu.vcs对于redhat。感谢
发表于 2015-9-16 08:39:34 | 显示全部楼层
最近研究UVM源码中提供的相关例子,在测试register模型时遇到一些问题想向大家请教。摘部分代码如下:
        
          
        
virtual        function void connect_phase(uvm_phase phase);
        
      if (apb !=        null) begin
        
                reg2apb_adapter reg2apb = new("reg2apb");
        
                reg2apb_adapter mon_reg2apb = new("mon_reg2apb");
        
                regmodel.default_map.set_sequencer(apb.sqr,reg2apb);
        
`ifdef        EXPLICIT_MON
        
                apb2reg_predictor.map = regmodel.default_map;
        
                apb2reg_predictor.adapter = mon_reg2apb;
        
                regmodel.default_map.set_auto_predict(0);
        
                apb.mon.ap.connect(apb2reg_predictor.bus_in);
        
`else
        
                regmodel.default_map.set_auto_predict(1);
        
`endif
        
      end
        
             regmodel.print();
        
   endfunction
        
这是在环境中配好转换器。
        转换器中的bus到寄存器函数为:
        virtual        function void bus2reg(uvm_sequence_item bus_item,
        
                                       ref uvm_reg_bus_op rw);
        
    apb_rw apb;
        
    if        (!$cast(apb,bus_item)) begin
        
             `uvm_fatal("NOT_APB_TYPE","Provided bus_item is not        of the correct type")
        
      return;
        
    end
        
           uvm_report_info("kind(adapter)        :",$sformatf("kind:%0h",apb.kind));
        
           uvm_report_info("addr(adapter)        :",$sformatf("addr:%0h",apb.addr));
        
           uvm_report_info("data(adapter)        :",$sformatf("data:%0h",apb.data));
        
    rw.kind =        apb.kind == apb_rw::READ ? UVM_READ : UVM_WRITE;
        
    rw.addr =        apb.addr;
        
    rw.data =        apb.data;
        
    rw.status =        UVM_IS_OK;
        
  endfunction
        
drv会根据收到的transaction转发到总线上,monitor监测总线行为,并把收到transaction进行ap.write(tr)
        
遇到的问题是:运行时带上宏定义EXPLICIT_MON,测试reg_predictor的用法。
        
发现调用一个寄存器readwrite函数时,bus2reg函数会执行两遍,对于read,        最终返回的值不是monitor传回来的,而是drv之前收到并转发出去的transaction中的data字段。感觉regmodel.default_map.set_auto_predict(0);        没有起作用。或者我理解的reg_predictor运行机制有误,我认为非自动预测模式下,bus2reg只会在mon把监测到的transaction传给pre_predictor之后,才会被调用。但目前实验的结果是在drvtransaction转发出去后也会调用,而且该处的调用决定了read函数的返回值


请求高手帮忙解答,不胜感激!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-19 00:42 , Processed in 0.023468 second(s), 8 queries , Gzip On, Redis On.

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