UVM寄存器模型的作用和优势?


👉寄存器模型的基础知识可以看:UVM寄存器模型
👉这篇文章随着工作年限的增加,会持续更新…


寄存器模型是根据寄存器描述文档所建立,是真实硬件寄存器在软件世界的模型。在验证的过程中,只有先保证寄存器的功能正确,才能使寄存器模型能够准确反映硬件的状态。那么怎么通过寄存器模型完成对寄存器的访问?寄存器模型又具有什么样的优势呢?

一、对寄存器模型的操作是怎么反映到总线上?

这其中关键的一环就是 adapter 的事务级转换和 map 提供寄存器的偏移地址和访问属性,如下步骤:

  • 寄存器级事务将带有目标寄存器的相关信息放到 uvm_reg_bus_op 实例中,发送给 adapter ;
  • adapter 在接收到 uvm_reg_bus_op 之后,通过内部的 reg2bus( ) 方法从中抽取总线层面所需要的信息,同时生成一个与总线适配的 transaction(也就是 driver 需要拿到的 item 类型),然后 adapter 把这个 transaction 送给 sequencer ;
  • transaction 经过 sequencer 到 driver,被发送到总线上;
  • 如果是对总线做读操做或者是总线上有 response 信号标识访问是否成功,则读回的数据或 response 信号会从 sequencer 按照 response item 的路径返回给 adapter,通过 bus2reg() 将总线返回的transaction 转化为 uvm_reg_bus_op ,最终作为返回值交回到寄存器操作有关的办法。

注意:在 adapter 集成的过程中,需要将 map(寄存器信息)、sequencer 和 adapter 关联在一起,因为 map 中提供了寄存器模型中对应寄存器的偏移地址、访问属性和对应总线。只有知道了这些,才能把信息通过 driver 发送给对应的寄存器,adapter 的桥接功能才能起到作用。

rgm.map.set_sequencer(sequencer,adapter);

二、怎么保证寄存器模型与DUT的寄存器保持一致 ?

1.预测更新

UVM对寄存器模型提供了两种预测方式:自动预测和显示预测。

1.1.1 自动预测(auto predication)

如果在环境中没有继承predicator,而是利用寄存器操作来自动记录每一次寄存器的读写数值,并且在后台调自动用predict( ) 方法的话,称为自动预测。自动预测需要在寄存器模型中打开此功能,如下:在env中集成寄存器模型时打开

function void top_env::connect_phase(uvm_phase phase);
	...
	rgm.map.set_auto_predict(1); //打开自动预测功能
endfunction

注意:

  • 如果其他sequence直接在总线层面上对寄存器进行操作,没有通过寄存器级别的 write( ) / read( )操作方法,或者是其他总线来访问寄存器等,都无法自动得到寄存器的镜像值和期望值;
  • 后门访问时,只能使用自动预测,因为后门访问没有对总线层面操作;

1.1.2 显示预测

显示预测需要在顶层环境中集成 predictor(由参数化类uvm_reg_predictor例化),在总线上通过 monitor 捕捉总线事务。monitor一旦捕捉到了有效事务,会发送给 predictor,再利用 adapter 的桥接作用,实现事务信息转换,并将转换后的寄存器模型有关信息更新到map中,完成对寄存器模型的更新。显示预测对寄存器数值的预测更加准确。

2.mirror( )更新

mirror( ) 方法可以读取 DUT 中寄存器值,如果镜像值/期望值与实际值不同,就更新寄存器模型中的镜像值。如果在仿真中不断地调用它,使得整个寄存器模型的值与DUT中的寄存器的值保持一致。

三、使用寄存器模型的优点?

1.提高了 sequence 的复用性

对于功能验证而言,通过使用寄存器模型对总线做访问,代替了直接从总线访问寄存器。这种方式的优点在于以往由具体地址来指定寄存器的方式,将由寄存器名称来代替。并且寄存器模型封装的一些函数可以直接对寄存器的域进行操作,测试序列更易读。如果后期寄存器的地址做修改,或者是对寄存器域修改,测试激励中不需要跟着一起修改,提高了测试序列的复用性。

举个例子,寄存器模型中包含各个寄存器和寄存器域,我们在写测试激励是是对特定的寄存器或寄存器域的set()它们的desired value,再通过 updata( )的方式完成对寄存器的配置,这就避免了直接从总线上发送具体地址来对整个寄存器做配置。而如果不从寄存器模型对寄存器做配置,首先需要发送寄存器对应地址,并发送对应地址需要对寄存器各个域写入的配置。假如这时需求变了,对应寄存器的地址或者域发生变化。如果是前者通过寄存器模型访问,只需要去寄存器模型中修改相应的configure ()和map,测试激励不用变;而后者直接从总线访问寄存器则需要改变测试激励中的地址和需要写入寄存器的值。

2.提供了后门访问方式

后门访问的方式可以在软件仿真时直接读取寄存器模型中的值,从而不耗时的获取寄存器的值。如果没有寄存器模型,只能通过启动sequence通过前门访问总线的方式来读取寄存器的值。后门访问不消耗仿真时间,在大型设计验证时,在其正常工作前需要配置众多寄存器,如果采用前门访问的方式会需要很长的时间,而如果使用后门访问方式配置会极大地缩短时间。

  • 10
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值