sequence与driver间交互

start_item和finish_item

·uvm_do可以分解为start_item和finish_item,它们又可以如下分解:

sequencer.wait_for_grant(prior)     (task)  \                        //等待driver同意发送item,对应driver里面get_next_item(req)
                                         start_item    \
parent_req.pre_do(1)                (task)  /           \
                                                     `uvm_do* macros
parent_req.mid_do(item)             (func)  \            /
sequencer.send_request(item)        (func)    \         /
                                          finish_item  /
sequencer.wait_for_item_done()      (task)    /                       //等待driveri tem发送完成,对应driver里面item_done();
parent_req.post_do(item)            (func)   /

response机制概述

通常情况下,UVM sequence机制可以只提供一种sequence->sequencer->driver单项传输机制。同时,sequence机制可以提供一种反馈机制——response机制,反馈路径为driver->sequencer->sequence。

get_response和put_response

如果需要使用rosponse机制就需要在sequence内使用get_response任务;在driver内使用put_response任务。
在调用put_response前需要调用set_id_info函数,其将sequence发送的transaction id等相关信息复制到rsp内,以让sequencer知道将response返回给其哪个sequence(一个sequencer内可以有几个sequence)。

使用response的注意事项

get_response和put_response一一对应,当sequencer启动get_response后就会阻塞进程,直到response_queue被放入新的记录,即driver将response通过put_response返回给sequence。
若希望get_response在driver返回前sequence继续发送transaction,则需要使用response_handler。

实例分析

class case_seq extends uvm_sequence#(case_seq_item);
    virtual task body();
        repeat(10) begin
            item = new();
            item.randomize();
            start_item(item);                                        //等待get_next_item
            finsh_item(item);                                        //等待item_done
            get_response(rsp);                                       //获取reponse
        end
    endtask
    `uvm_object_utils(case_seq)
endclass
class case_driver extends uvm_driver;
    task main_phase(uvm_phase phase);
        while(1) begin
            seq_item_port.get_next_item(req);       //等待start_item,获取req
            driver_one_pkt(req);
            rsp = new("rsp");
            rsp.set_id_info(req);
            seq_item_port.put_response(rsp);        //发送reponse
            seq_item_port.item_done();                  //发送完毕
        end
    endtask
endclass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值