sequence本身·是一个·uvm_object,它无法出现在uvm树中,很难对其进行设置第二个函数,其使用config_db::get函数得到参数最大的障碍就是路径问题
使用get_full_name()可以得到一个component的完整路径,可以在sequence的body中调用此函数,会出现:uvm_test_top.env.i_agt.sqr.case0_sequence sequencer的路径+实例化sequence传递的名字
如果实例化时名字不固定,那么使用通配符*
在get原型函数中,第一个参数必须是component,sequence不是component,所以这里不能使用this指针,只能用nuluvm_root::get()
uvm_config_db#(int)::get(null,get_full_name(),count,count)—可以完整得到sequence的路径
cmp_en 参数决定是否对transaction进行检查
scoreboard是在build_phase中调用get函数,调用的前提时参数已经被设置过了
wait_modified的参数与config_db::get的前三个参数完全一样,当它检查到第三个参数的值被更新过后,它就返回,否则一直等待在那里,其与main_phase中的其他进程在同一时刻被fork起来,当检查到参数值被设置过后,立刻调用config_db::get得到新的参数
sequence→sequencer→driver
sed_id_info函数是将req的id等信息复制到rsp中,可能存在多个sequence在同一个sequencer上启动的情况,只有设置了rsp的id信息,sequencer才能知道将responce返回给哪个sequence
通常一个transaction对应一个response,但是事实是uvm也支持一个transaction对应多个response,但是需要多次调用get_response和put_response,此时由于一个transaction只有一个item_done,因此使用多次item_done(rsp)是会出错的
sequencer中有一个队列,其大小为8,driver将rsp推送给sequencer,当队列中有8个response时,driver在向其中推送新的response,uvm给出错误提示
在sequence中启动get_sequence进程会阻塞在那里,直到response_quence中被放入新的记录,如果driver能够马上将response通过put_response的方式传回response,那么sequence被阻塞的进程会得到释放,但如果driver需要延时一段时间才能将tranction传回,同时sequence能够继续传transaction到driver,由于sequence被阻塞了,根本不可能发出新的transaction。其原因由于sequence发送transaction与get_response在同一个进程中执行的,使用response_handler将二者分离开来,在不同的进程运行得到不同的结果。
response与req的类型基本相同,但uvm也支持它们不同
'uvm_add_to_seq_lib(seq0,simple_seq_library)第一个是此sequence的名字,第二个是要加入的sequence library的名字,一个sequence可以加入多个不同的sequence library
sequence library在定义后如果没有其他sequence注册其中,是没有任何意义的
可以将sequence libraray作为sequencer的default sequence ,uvm会随机选择几个,并启动它们
UVM_SEQ_LIB_RAND是完全的随机,UVM_SEQ_LIB_RANDC是将加入的sequence随机排一个顺序,按此顺序执行