6.8seqr&driver-sqr与driver的通信(get_next_item,put,item_done等)

 

 

注1:上图有些问题,其中uvm_sequencer内的uvm_seq_item_pull_port应该改为uvm_seq_item_pull_imp;

1.sequencer与driver通信基础

(1) 一个sequence在向sequencer发送transaction前,会先向sequencer发送一个请求, sequencer把这个请求放在一个仲裁队列中. sequencer主要做两件事情: 检测仲裁队列里是否有某个sequence发送transaction的请求; 检测driver是否申请transaction.

(1.1) 如果仲裁队列里有发送请求,但driver没有申请transaction, 那么sequencer将会一直处于等待driver的状态,直到driver申请新的transaction; 此时sequencer同意sequence的发送请求, sequence在得到sequencer的批准后, 产生出一个transaction并交给sequencer, 后者把这个transaction交给driver;

(1.2)如果仲裁队列中没有发送请求,但是driver向sequencer申请新的transaction,那么sequencer将会处于等待sequence的状态,一直到有sequence递交发送请求,sequencer马上同意这个请求, sequence产生transaction并交给sequencer, 最终driver获得这个transaction;

(1.3)如果仲裁队列中有发送请求,同时driver也在向sequencer申请新的transaction,那么将会同意发送请求, sequence产生transaction并交个sequencer, 最终driver获得这个transaction.

(2) driver与sequencer之间的TLM通信采用get模式,即由driver发起请求,从sequencer一端获得item, 再由sequencer将其传递给driver(driver获取的REQ sequence_item来源于sequencer的request FIFO);

(3) 由于driver是请求发起端,sequencer是请求响应端,所以二者例化的端口分别如下:

 

(4) driver消化完当前的request后,可以通过以下几种方式发送response(driver返回的RSP sequence_item放到sequencer的response FIFO);:

(4.1) 方法一:item_done (input RSP rsp_arg=null)方法来告知sequence此次传输已经结束. 参数中的RSP可以选择填入.

driver使用get_next_item得到一个transaction时, sequencer也保留一份刚发送出的transaction; 当出现sequencer发出了transaction, 而driver没有收到的情况时, sequencer会把保留的这份transaction再发送出去. 如果在下次调用get_next_item前, item_done被调用, 那么sequencer就认为driver已经得到了这个transaction,将会把这个transaction删除. 这是为了增加可靠性而使用的握手机制.

(4.2) 方法二:driver也可以通过put_response()或者put()方法来单独发送response. 

(4.3) 方法三:发送response可以通过成对的uvm_driver.rsp_port和uvm_sequencer.rsp_export端口来完成. (uvm_driver.rsp_port.write(RSP)).

2.seqr与driver交互的方法

注:get_next_item/get/peek会导致sequencer发起仲裁过程,接着返回有效的sequence_item句柄;

2.1 get_next_item

(1)阻塞,直到sequencer的request FIFO中有可用的REQ sequence_item,该方法返回一个REQ句柄;

(2) get_next_item实现了driver-seqr握手协议的一半,当握手协议完成时,需要调用item_done();在调用item_done之前,再次调用get_next_item会导致协议错误,并引起driver-seqr死锁;

2.2 try_next_item

(1) get_next_item的非阻塞变形;当seqr的request FIFO内有可用的REQ sequence_item时,会返回REQ句柄;当seqr的request FIFO内没有可用的REQ sequence_item时,会返回null;

(2)如果try_next_item返回一有效的REQ句柄,后面需要调用item_done完成握手;

2.3 item_done

(1) 用来通知sequence当前的sequence item已经消化完毕;

(2) 如果item_done传递了一个RSP sequence_item句柄作为参数,那么该RSP sequence item句柄将会被放到sequencer的response FIFO内; 然后,再传递给sequence;

2.4 peek

2.5 get

(1) 完全可以用来代替get_next_item;

(2) get/peek/put完全是继承基类的方法;

2.6 put/put resonse

(1)put采用blocking方式将response发送回sequence;

(2)put_response采用nonblocking方式将response发送回sequence;

2.7 set_id_info

(1) 当有多个sequences通过sequencer和一个driver交互时,sequencer负责哪个sequence的哪个sequence_item传递给driver;当driver创建了response sequence_item后,该response sequence_item需要route到正确的sequence. UVM通过给每一个sequence_item的id成员变量赋值,来判断其parent sequence; sequencer也会使用这些id变量将response sequence_item route到正确的parent sequence.

(2)在调用start_item时,sequencer会为request sequence_item设置id信息; response sequence_item需要copy request sequence_item的id信息,以便于它能够route到正确的sequence上,set_id_info提供了这样的功能;

2.8 wait_for_sequences

(1) 等待当前的sequence直到产生下一个有效的item;

3.seqr与driver通信示例一

注1:该示例中,seqr和driver的REQ与RSP类型均采用默认类型uvm_sequence_item,当然还可以指定REQ与RSP的类型,后续需要补充示例;

 

 

 

 

 

4.seqr与driver通信示例二

5.seqr与driver通信示例三

 

 

posted on   知北游。。  阅读(2330)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示