UVM环境中数据输送的整个过程,以及ahb ram的driver如何写。 您所在的位置:网站首页 uvm宏 UVM环境中数据输送的整个过程,以及ahb ram的driver如何写。

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

#UVM环境中数据输送的整个过程,以及ahb ram的driver如何写。| 来源: 网络整理| 查看: 265

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就可以完成一次数据的传输。

 

 

 

 

 

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有