6.sequencer和driver端口和方法
(1)概述
通信是双向的,drive是initial。
(2)端口
-
uvm_analysis_port是广播端口,driver专门广播response的。
-
sequencer中有含有import口的response的fifo,没有request的fifo,所以只会例化export,另外需要注意的是uvm_seq_item_pull_imp例化seq_item_export。
-
成对的端口:seq_item_port与 seq_item_export; rsp_port与 rsp_export。
(3)方法
-
item_done: driver 写入rsq到sequencer的fifo中,sequence则用get获取。
-
output REQ指的是sequencer发出了REQ,driver get到了,所以要output;input指的是driver要输入些数据到方法中。
(4)uvm_sequencer和uvm_driver是参数类,必要时需类型转换
(5)driver回复response的多种方法
7.事务传输实例
(1)实例:uvm_sequence_item::bus_trans、uvm_sequence::flat_seq
-
两次类型转换主要是因为create_item和get_response返回的时父类型uvm_sequence_item。
-
start_item: 立即返回,是函数,表示item开始排队,等待发送。
-
finish_item是blocking的,start_item不是阻塞的是立即返回的。
function uvm_sequence_item create_item(uvm_object_wrapper type_var,
uvm_sequencer_base l_sequencer, string name);
代码:
(2)实例:uvm_sequencer::sequencer、uvm_driver::driver
-
get_sequence_id:由于没有做域的自动化声明,所以不会被copy()。rsp.sequence_id来决定这个rsp是哪个sequence发送的。
代码:
(3)实例:uvm_env::env、uvm_test::test1
-
seq.start():sequence就知道挂载在名叫sqr的sequencer上,sequence自动执行body(),但并没随机化。
代码:
(4)输出结果
8.通信时序
(1)框图
(2)详细时序
9.握手建议
(1)
(2)