| 
 | 
 
 
发表于 2015-8-28 10:35:39
|
显示全部楼层
 
 
 
回复 10# apsari950  
 
 
    最近研究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的用法。 
         
发现调用一个寄存器read或write函数时,bus2reg函数会执行两遍,对于read,        最终返回的值不是monitor传回来的,而是drv之前收到并转发出去的transaction中的data字段。感觉regmodel.default_map.set_auto_predict(0);        没有起作用。或者我理解的reg_predictor运行机制有误,我认为非自动预测模式下,bus2reg只会在mon把监测到的transaction传给pre_predictor之后,才会被调用。但目前实验的结果是在drv把transaction转发出去后也会调用,而且该处的调用决定了read函数的返回值。 |   
 
 
 
 |