在UVM中,使用get_response的正确姿势

文摘   2024-10-13 15:02   上海  

1.前言

UVMsequence机制提供了一种sequence→sequencer→driver的单向数据传输机制。但是在复杂的验证平台中,sequence需要得到driver的一个反馈。sequence机制提供对这种反馈的支持,它允许driver将一个response返回给sequence。如果需要使用response,那么在sequence中需要使用get_response任务。

2get_response的定义原型

如下图所示,get_reponse这个task的定义是在uvm_seqence.svh中定义的,它有两个参数,第一个参数是output类型的response;第二个参数是input类型的transaction_id

默认情况下,sequence必须通过调用get_response找回response。如果没有指定transaction_id, 此任务将返回发送给这个sequence的下一个response。如果在response queue里面没有response,此方法将被阻塞,直到收到一个sequence。如果transaction_id被指定,此任务将阻塞,直到在response queue中具有此transaction_id收到。responses队列默认的大小是8。get_response方法必须被尽快调用避免response队列溢出从而阻止response被丢弃。如果在response队列中的一个response被丢弃,错误将会报出,除非错误报告通过
set_response_queue_error_report_disabled被禁止。

3.get_response的基本用法及分析

如果在一个sequence发送完一个item之后,等待driver返回一个transaction,那么通常可以这样写:

而在driver中,则需要这么写:

当我们在driver中调用put_response,其实质是调用uvm_sequencerput_response。如果不需要transaction_id进行匹配时,那么只要response_queue中有了新的记录就取出并作为最终的返回值。put_response是在uvm_sequencer_param_base中定义的函数。

Sequencer会保留最后发送的item,同样,sequencer也会把要发送给sequencersp也保留一份。它会检查这个rsp是属于哪个sequence的,如果sequence_id-1,则说明根本没有进行设置过。在上面的driver的代码中,如果不调用rsp.set_id_info(req)而直接使用put_response,那么就会出现这种情况。

在上面的driver的代码中,设置了set_id_info函数,它将reqid等信息复制到rsp中。由于可能存在多个sequence在同一个sequencer上启动的情况,只有设置了rspid等信息,sequencer才知道将response返回给哪个sequence

4. get_response与其参数transaction_id

接下来,我们来看一下get_response定义中的第二个参数transaction_id。每个transaction都有一个唯一的id,这个id是用来标识这个transaction的。在UVM中,id的作用非常重要。首先,通过id我们可以区分不同的transaction,避免混淆和错误。其次,id还被用于追踪和调试,可以帮助我们找到问题的根源。在某些情况下,我们还可以通过id来对transaction进行排序或过滤。那么,这个id是如何生成的呢?在UVM中,每个transaction都有一个与之关联的sequence_item。当这个transaction被创建时,UVM会自动为它生成一个sequence_item,并且将这个sequence_itemid设置为transactionid。这个sequence_item是用来存储和管理transaction的相关信息,比如发送时间、发送者、目标组件等。通过sequence item,我们可以方便地获取transactionid,并且进行相关的操作和管理。除了获取id,我们还可以使用UVM提供的一些函数和方法来获取transaction的其他信息。比如,我们可以使用get_response来获取transactionresponse,这需要传入transactionid作为参数。通过get_response,我们可以获取到目标组件返回的response,从而了解transaction的处理结果。

在实际应用中,我们需要注意一些细节问题。首先,当一个transaction被创建时,我们需要尽快为其指定一个唯一的id。否则,如果两个transaction使用了相同的id,就会导致混淆和错误。其次,在使用get_response时,我们需要确保传入的id是正确的,否则可能会获取到错误的response。最后,我们还需要注意transactionresponseid的管理和追踪问题,确保能够及时发现问题并进行处理。


综上所述,UVM中的transaction是一个非常重要的概念,而其responseid更是其中的核心部分。通过深入了解responseid的作用和使用方法,我们可以更好地理解和使用UVM中的transaction,从而更好地进行通信系统的验证和测试。

5.使用get_response的正确姿势

在一般的项目中,使用get_response时不带第二个参数多数情况下也不会有问题,但是小编还是强烈建议使用时带上transaction_id这个参数,这是很严谨的做法。具体的使用方法可以参考下面的code如果前面有其他transaction,这段代码里的get_response不带id的话,就会错误地get到前面transactionresponse这在大项目中经常会遇到,比如如果验证对象是一个大NoC,通常会在sequence中模拟多个CPU Core同时发数据,这时如果get_response不带transaction_id就会报错。

....//其他transaction`uvm_create(trans);    ....    .... `uvm_send(trans); get_response(rsp,trans.get_transaction_id());


欢迎加入知识星球。每天都会解答大家提出的技术问题。欢迎加入知识星球,助您快速成长。
最后,由于TX修改规则,为了不错过后续内容,欢迎加入QQ群,

另外,由于微信群已经超过200人,添加小编的微信,拉你进入WX学习群。

最后的最后,如果对您有帮助,希望点个“在看”。好好学习,天天向上

芯片验证日记
分享芯片验证相关的知识。
 最新文章