seq&&seqr&&driver源码分析

在UVM的框架中,我们经常看到sequence的body()函数中,经常有`uvm_do这个宏,其实这个宏里面就包含了跟driver的交互所有细节,本章节就从uvm_do说起。

`uvm_do相关的宏

本质上就是uvm_do_on_pri_with()

  • uvm_do(args): args可以为sequence也可以为uvm_sequence_item,当args时sequence的时候,也就是https://www.cnblogs.com/xuqing125/p/15909359.html所讲的第三种方式。本章重点来看args是uvm_sequence_item的时候。

create_item(seq_or_item,sqr)

  • 比较易懂就是创建实例,第一个参数可以是sequence也可以是item

start_item(uvm_sequence_item,sqr)

  • uvm_sequencer_base::wait_for_grant();


    wait_for_grant()
m_wait_for_arbitration_completed

get_next_item(req);

uvm_sequencer::get_next_item
m_select_sequence
  • m_set_arbitration_completed()与start_item的wait_for_gant呼应,然后start_item执行完毕。
  • m_choose_next_request():就是通过仲裁算法以及lock/is_relevant等得到可以用的sequence_item。
  • m_wait_for_available_sequence()是在没有有效的sequence以后调用wait_for_relevant()

finish_item(item)

  • callback函数 mid_do/post_do
send_request
  • 类型转换,牵扯到随机,如果是A是基类,A.randomize()对应的是A里面的变量随机,如果B extends A,B里面有rand bit c,A=B,也就是$case(A,B),这样的话A.randomize就会随机化变量c。
  • m_req_fifo.try_put对应的就是get_next_item里面的peek。
wait_for_item_done
  • finish里面的wait_for_item_done对应到driver里面的item_done!
item_done
一张图概括一下

伪代码可以参考:https://www.edrawmax.cn/online/share.html?code=83c3b8b8799e11ec8a7585ec8adb0e95

你可能感兴趣的:(seq&&seqr&&driver源码分析)