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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2739|回复: 5

[求助] uvm_phase机制

[复制链接]
发表于 2020-5-23 14:11:53 | 显示全部楼层 |阅读模式

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

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

x
uvm中的run_phase和reset的疑惑;run_phase阶段中发送数据;reset_phase中也发送数据,怎么保证dut是先接收到reset_phase的数据?
代码如下:
virtual task run_phase(uvm_phase phase);
    `uvm_info("TRACE", $sformatf("%m"), UVM_HIGH);
    forever begin
      seq_item_port.get_next_item(req);
      send(req);
      `uvm_info("DRV_RUN", {"\n", req.sprint()}, UVM_MEDIUM);
      seq_item_port.item_done();
    end
  endtask: run_phase

virtual task reset_phase(uvm_phase phase);
super.reset_phase(phase);
  `uvm_info("TRACE", $sformatf("%m"), UVM_HIGH);  
    phase.raise_objection(this);
       sigs.cb_master.haddr<=0;
       sigs.cb_master.hburst<=3'b0; //single transfer
       sigs.cb_master.hbusreq<=0;
       sigs.cb_master.hlock<=0;
       sigs.cb_master.hprot<=4'b0;
       sigs.cb_master.hsize<=3'h0;
       sigs.cb_master.htrans<=2'h0; //NONSEQ
       sigs.cb_master.hwrite<=1'h0;
       sigs.cb_master.hwdata<=0;  //the data to be writen
    phase.drop_objection(this);
endtask:reset_phase  


virtual task send(packet tr);
fork
begin
    forever begin
      if(sigs.reset_n )begin
        sigs.cb_master.hbusreq <=1'b1;
        break;
      end else begin
       @(sigs.cb_master);
      end
    end

    wait(sigs.cb_master.hgrant);
       begin
       sigs.cb_master.haddr <= tr.haddr;
       sigs.cb_master.htrans <= tr.htrans;
       sigs.cb_master.hburst <=tr.hburst;
       sigs.cb_master.hlock <=tr.hlock;
       sigs.cb_master.hprot <=tr.hprot;
       sigs.cb_master.hsize <=tr.hsize;
       sigs.cb_master.hwrite <=tr.hwrite;
       @sigs.cb_master;
       sigs.cb_master.hwdata <=tr.hwdata;
     //  sigs.cb_master.hwrite <=1'b0;
      // tr.hrdata<=sigs.cb_master.hrdata;
       end
  end     
join     
endtask:send

发表于 2020-5-23 14:28:13 | 显示全部楼层
通常run_phase和12task phase是不能混着用,更何况是对相同的接口
发表于 2020-5-23 17:55:44 | 显示全部楼层
不要混用run_phase和与之并行的12个小phase,要么只用run_phase要么只用12个小phase,实在不行应该可以通过uvm_event来同步,不过这是多此一举,你直接用main_phase应该就没问题
发表于 2020-5-27 22:17:44 | 显示全部楼层
这么说吧,run_phase中是一直在等待sequencer发过来驱动请求,run_phase和12个run_time_phase是并行执行的,如果不把forever写入到run_phase中,那么就需要在多个phase中写上这样的代码。
至于上面的代码怎么保证reset在run_phase之前执行,实际上依靠上层在那个phase中运行seq下发item。一般好像没有谁会在reset中去执行具体的seq 下发item把。如果要保证reset的执行,那么可以在forever循环之前等一下reset。
另外如果在cfg和main 这样的phase中多写上几个forever循环,在遇到上一个phase的现场清理不干净可能会报上几个error
发表于 2020-6-3 14:03:38 | 显示全部楼层
就不能换个phase?非得在run phase里面弄?
发表于 2020-6-3 16:27:56 | 显示全部楼层
这里的写法是没有问题。可以看得出来,写代码的verifer的意图是:在run_phase中驱动data,在reset_phase做reset。但是这里刚好有个陷阱,就是reset_pahse中不一定是用来做reset的,它仍然是可以做驱动data的,或者是做其他事情。按照这个verifer的想法来做的话,需要由建case的人员来保障在reset_phase的时候,不要发sequence,但这是不科学的,并没有规定reset_phase不能发sequence的。
因此,提议如下:
1,run_phase做数据驱动是合理的,不需要改动。
2,删除文中reset_phase的reset相关操作;
3,在run_phase中做复位操作。即开一个线程等着复位信号,如果复位了,就复位接口,并release objection。

欢迎大佬斧正
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-11-13 22:47 , Processed in 0.018389 second(s), 7 queries , Gzip On, Redis On.

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