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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: asic_wang

[原创] UVM phase的用法研究------个人总结

[复制链接]
 楼主| 发表于 2013-5-8 17:13:11 | 显示全部楼层
五、当我们调用run_test()函数的时候发生了什么?
      ------------uvm_phase class中的m_run_phases()函数

1、函数原型
task uvm_phase::m_run_phases();
  主体1:
  uvm_root top = uvm_root::get();
  主体2:
  // initiate by starting first phase in common domain
  begin
    uvm_phase ph = uvm_domain::get_common_domain();
    void'(m_phase_hopper.try_put(ph));
  end
  主体3:
  forever begin
    uvm_phase phase;
    m_phase_hopper.get(phase);
    fork
      begin
        phase.execute_phase();
      end
    join_none
    #0;  // let the process start running
  end
endtask
2、执行流程
   (1)我们都会在test top中的某个initial中写上 run_test()(当然稍微大型一点的工程都是是通过
           Makefile中的-UVM_TESTCASE选项把具体的testcase传递给run_test函数的,这不是我在
           这里要讨论的话题),主要是这run_test()中会调用phase::m_run_phases()。
   (2)如上所标述的,这个m_run_phases函数共有三个主体
           主体1:很简单,就是得到整个test env的树形结构的根节点,即uvm_top,有了根节点,对
                      树形结构来说就掌控了一切。但是这个函数里没有用到top,哈哈。
           主体2:得到common_domain,也就是从common (UVM_PHASE_DOMAIN) id=204节点
                      开始,沿着左边的支路一直走到common_end (UVM_PHASE_TERMINAL) id=210
                      节点结束。这些个节点都是属于common domain的东东。(请回看一下第一页的帖子
                      四、UVM phase的组织架构中的那个树形图)。
                      common domain是标杆,任何时候、任何env都是不会变的。
                      得到common domain之后,就把它放入到一个FIFO中。
           主体3:通过条用execute_phase函数干正事。这个主体是一个forever循环,这意味中原则上
                      你可以创建无数个自己的domain!
 楼主| 发表于 2013-5-8 17:37:56 | 显示全部楼层
3、主体3部分的理解一
     举例来说,如果用户自己没有自己定义新的domain,使用默认的uvm的phase机制。
     这个主体3部分会如何运行呢?
     我们先跳过具体细节,说说主要发生的时候。
     因为m_phase_hopper一开始就是只有common (UVM_PHASE_DOMAIN)
     放进去了,所以最开始执行的时候m_phase_hopper.size == 1是毫无疑问的。
     最开始的时候从common (UVM_PHASE_DOMAIN) id=204开始运行,调用这个
     节点的execute_phase函数,当这个节点该做的事情做了之后会在某个地方的某行
     程序往m_phase_hopper里面put下一个节点,也就是build (UVM_PHASE_NODE),
     因为主体3一直在那个get,在随时候命,所以那边一put这个就马上get到了,
     接着执行了build (UVM_PHASE_NODE),接着轮到connect (UVM_PHASE_NODE)
     .........一直到最后一个common_end (UVM_PHASE_TERMINAL)节点搞完之后,
     因为它没有successor了,所以在某个程序的某行代码会设置一个标志表示都已搞完,
     不难想象,在run_test函数里有个进程在一直等待着这个标志的设定,这个握手事件
     一合拍,那个整个uvm的运行就是完鸟!
     顺便提一句,在碰到树形结构有分叉的地方,用fork join_none让它们都并行搞起来,
     事实上主体3就是这么搞的。
 楼主| 发表于 2013-5-8 17:47:18 | 显示全部楼层
3、主体3部分的理解二
     其实我想和大家交流的是,在UVM源代码中有大量的这种结构性代码:
     fork
          A:xxxxxxxxxx
     join_none
     #0;
     wait(xxx)或者其它类型的阻塞事件如mailbox.get()等等
     B:xxxxxxx
     如果对这个很了解的朋友这部分就不用看了。
     要看懂这种代码需要对verilog/sv的timeslot的调度有深刻的理解,standard上
     讲的很清楚。
     其实我想说的是一定要加#0;这句话,不然fork join_none里面的A是不会被
     执行,除非后面的wait或者阻塞性事件得道满足。
     如果wait或者阻塞性时间的解锁又是要靠A中的执行才能实现的话,不加#0就会、
     造成死锁。
 楼主| 发表于 2013-5-8 20:17:11 | 显示全部楼层
接下来有空想讨论一下 uvm_phase class里的execute_phase()函数,这个函数应该是uvm中复杂度较高的几个中间的一个。
发表于 2013-5-17 19:56:42 | 显示全部楼层
成哥发达,什么时候给我们开个讲座吧
发表于 2013-5-18 14:50:39 | 显示全部楼层
多谢总结
 楼主| 发表于 2013-5-19 09:58:16 | 显示全部楼层
回复 55# gtruanlongbing


    奔Or小麦。 表调戏我
发表于 2013-5-19 16:15:04 | 显示全部楼层
.............................
发表于 2013-9-21 11:24:55 | 显示全部楼层
写的确实不错
发表于 2013-9-23 16:47:14 | 显示全部楼层
很受益。。。期待更新中。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-11-25 08:32 , Processed in 0.019853 second(s), 6 queries , Gzip On, Redis On.

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