3、采购商(sequencer)和生产商(driver)之间的交易
1)、采购商(sequencer)和生产商(driver)之间的联系方式
通常是生产商(driver)主动联系采购商(sequencer)来获取他手中采购的原料。
sequencer和driver之间的通信是通过tlm通信进行的,driver在tlm通信中的角色是initiator,sequencer在tlm通信中的角色是target,他们之间的通信采用的是get模式,即由driver发起获取item的请求,再由sequencer将item传递传递至driver,driver获得item后给sequencer返回一个response(非必要)。
2)、sequencer和driver之间的通信端口
uvm_seq_item_pull_port #(type REQ = int, type RSP = REQ)
uvm_seq_item_pull_export #(type REQ = int, type RSP = REQ)
uvm_seq_item_pull_imp #(type REQ = int, type imp = int)
由于driver是initiator,所有driver一侧例化了两种port端口:
uvm_seq_item_port #(REQ, RSP) seq_item_port
uvm_analysis_port #(RSP) rsp_port
sequencer是target,在sequencer一侧例化了export和imp端口:
uvm_seq_item_pull_imp #(REQ, RSP, this_type) seq_item_export
uvm_analysis_export #(RSP) rsp_export
3)、sequencer和driver之间的通信方法
通常情况下,我们使用driver::seq_item_port和sequencer::seq_item_export这一对端口,来完成driver和sequencer之间的item传送。
这一组端口支持如下方法:![在这里插入图片描述](https://img-blog.csdnimg.cn/d3011099b5f64352a68dd10fa0a1101d.jpeg#pic_center
4)、sequence、sequencer和driver之间的握手
生产商(driver)的生产机器一直运转,因此他一直需要原料(item),如果没有了原料,他就通过get_next_item()方法去联系采购商(sequencer),来尝试获取原料。get_next_item()是一个阻塞方法,如果没有拿到item,就一直等待,直到有item可以使用。生产商拿到原料后,对其进行加工,把加工的商品(data)出口到另一个国家(DUT)。商品出口之后,生产商通过item_done()方法,把响应(RSP)发送给劳动者。
对于采购商,他负责采购原料给生产商,但是他也并不是对原料照单全收,他会筛查(仲裁)出符合标准的原料交给生厂商。
劳动者(sequence)通过create_item()方法生产(创建、随机)原料,通过start_item()方法,获取筛查(仲裁)通过的权限,再通过finish_item()方法将筛查通过的原料通过采购商送到生产商的手里。finish_item()方法也是一个阻塞方法,他会等待driver拿到item后送回的消息(RSP),收到响应(RSP)后完成item传输流程。