UVM糖果爱好者教程 - 17.寄存器读方法(read())揭秘

在上一篇文章“寄存器访问方法”中,我们查看了RAL的主要方法并展示了它们的工作方式。这篇文章将进一步关注read()方法,并展示该方法如何实际读取并返回寄存器的值。具体来说,我们将更详细地解释我们在上一篇文章中看到的read()方法的第1到第5步。

以下序列图显示了read()方法中涉及的步骤。我们假定用户像这样调用方法:

uvm_status_e status;
uvm_reg_data_t value;
jb_reg_block.jb_taste_reg.read( status, value );

                                                                read()方法如何读取并返回寄存器的值

下面中括号中的数字对应于图中的数字。
  • [1]用户调用read()方法。
  • [3] read()方法调用uvm_reg类的XreadX()方法。 XreadX()方法创建与读取对应的uvm_reg_item对象。
  • [4] XreadX()方法调用uvm_reg类的do_read()方法。
  • [6]和[7] do_read()方法检索寄存器的“路径”和寄存器映射(local_map)。我们假设我们使用FRONTDOOR路径。
  • [8] do_read()方法调用uvm_reg_map类的do_read()方法,该方法创建父序列。父序列将用于在后面的步骤中启动总线请求。
  • [9] do_read()方法调用uvm_reg_map类的do_bus_read()方法。 do_bus_read()方法创建与读取对应的uvm_reg_bus_op。
  • [10]和[11] do_bus_read()方法调用与寄存器映射关联的uvm_reg_adapter类的reg2bus()方法以获取相应的总线请求。
  • [12] do_bus_read()方法指定sequencer将总线请求处理到总线请求上。我们假定sequencer与寄存器映射关联。
  • [13] do_bus_read()方法使用上面的sequencer启动父序列。
  • [14] do_bus_read()方法等待序列完成。
  • [15]至[18]如果寄存器适配器的provides_responses属性设置为true,则通过调用get_base_response()来检索单独的总线响应。该响应被转换为uvm_reg_bus_op(显示为rw_access)。
  • [19]和[20]如果寄存器适配器的provides_responses属性设置为false,则包含总线响应的总线请求将转换为uvm_reg_bus_op(显示为rw_access)。
  • [21]至[24]将rw_access的状态和值返回给调用者。
我希望这篇文章有助于理解read()方法在底层如何工作。
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值