UVM环境中数据输送的整个过程,以及ahb ram的driver如何写。

transaction是如何产生,又如何由环境发往DUT的呢?为了理解这两个问题,我们不得不学习uvm下的sequence、sequencer和driver之间的关系。

我们先谈transaction是怎么产生的,是在什么时候产生的。这里我们一定会想到我们自己写的sequence,transaction的产生和sequence挂载到sequencer上是不是有关系呢,谁在前谁在后。下面我将结合原来来讨论一下。

在AHB ram模块里,在user_test这一层里,我们首先创建例化了sequence,即为sequence分配了空间,然后将seq的句柄通过start挂载到virt_sqr上。这里我们就要将一下uvm_sequence_base中的start方法:

这里我们只需要关注第一个set_item_context函数,他为sequence选择了它所需要挂载的sequencer,也即m_sequencer。

接下来就通过fork join进入了body()阶段,这里的body()就会用到我们在sequence中写的body();在我们自己写的body里一般使用·uvm_do_on_with()的方式去给sequencer和约束条件。通过uvm_seq_defines里我们可以看到·uvm_do、uvm_do_on_with等宏定义都基于一个宏·uvm_do_on_pri_with这个宏;

在这个宏里面我们要注意两点:1.·uvm_creat_on();2.$cast语句的作用

 uvm_create_on()宏的功能是创建一个seq或者item类型的实例。$cast是用来区分是item类型还是seq类型的,如果说是seq类型,$cast返回1,通过start来启动seq(即seq被困在了start里);如果是item类型,因为item继承于transaction,他和uvm_sequence_base处于两个不同的分支,因此不能进行类型转换,则通过start_item和finish_item;

在清楚了item的产生之后,我们需要了解一下item是怎么进行传输的。(详细过程请看UVM基础-Seq-Sqr-Driver交互详解_Lucky是一名ICer的博客-CSDN博客)item传输起源于driver里调用的seq.get_next_item()。

m_select_sequence()会根据seq_id在seq队列中选择一个seq并且还会记录已经拿过的seq。并且从该seq中那一个item返回。这个时候被选择的那个seq在调用start的时候就会进入start_item。

这里我们就要关注start_item了。

 同样是先把item挂载到相应的sequencer上,然后调用uvm_sequencer_base里面的wait_for_grant函数后完成start_item。(中间涉及到一些仲裁被我忽略掉了)。接下来进行随机化。再接下来进入finish_item:

这里我们需要关注的是wait_for_item_done():

 

这里我们需要等到item_done获取rsp的transaction_id和sequence_id之后,才能结束finish_item,完成握手。 

在清楚了uvm内部的item是怎么产生和发送之后,在看ahb_ram内部的driver如何驱动数据便变的清晰许多:

当seq完成了挂载之后,driver就可以使用uvm_driver里面定义的port去调用imp:uvm_sequencer_base中的方法:get_next_item(req),然后将req数据向vif的做驱动,完成之后clone一个rsp,将开始req的id给rsp调用item_done就可以完成一次数据的传输。

 

 

 

 

 

 

 

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值