寄存器模型基本概念

寄存器的概述

introduction

• 寄存器:一般为32bit, 可以分为多个reg_filed, 每个field一般代表着独立的功能
• 寄存器域:一般分为RW, RO,WO以及一些特殊的行为
• 保留域:暂时保留以作日后功能的扩展使用,对保留域的读写不起任何作用
• 寄存器块:按照地址排列的寄存器列表

寄存器模型

作用:做预测,做激励
内容:验证环境中的寄存器模型与DUT的寄存器模块的寄存器信息高度一致
应用:
1.对寄存器域进行声明  (保留域也要进行声明)
uvm_reg_field reserved;
rand uvm_reg_field pkt_len;

2.build() 阶段对寄存器域进行例化、配置
Pkt_len = uvm_reg_field::type_id::create("pkt_len");
Pkt_len.configure(this, 3,  3, "RW", 0, 3'h0, 1, 1, 0);

3.定义寄存器块(uvm_reg_block)
在build()阶段对寄存器的句柄进行例化,配置,调用寄存器所在class的build()函数
用uvm_reg_map 来表示寄存器和存储对应的偏移地址,只需要在build阶段例化系统已经定义好的defualt map
(一个block至少对应一个map)

Adapter

功能:桥接功能,在reg2bus( )和 bus2reg( )之间转换 

Reg2bus: 将寄存器模型通过sequence发出的uvm_reg_bus_op型的变量转换成bus_sequencer能够接受的形式
Bus2reg:作用用为当监测到总线上有操作时,它将收集来的transaction转换成寄存器模型能够接受的形式,以便寄存器模型能够更新相应的寄存器的值
因为寄存器无论读写都应该知道总线操作后的状态返回
adapter的集成:
在顶层环境的connect阶段,需要将寄存器模型的map组件与bus sequencer和adapter连接,将寄存器信息,总线侧激励驱动和寄存器级别和硬件总线级别的桥梁关联在一起,实现adapter的桥接功能

访问方式:

1.前门访问

在寄存器模型上进行读写操作(只有读操作和写操作),最终通过总线来实现总线上的物理时序访问,是真实的物理操作
i. Uvm_reg::read()/write() PATH = UVM_FRONTDOOR
ii. Uvm_reg_sequence::read_reg( )/write_reg( ) PATH = UVM_FRONTDOOR

2.后门访问

将寄存器的操作直接作用到DUT内部的寄存器变量,而不是通过物理总线访问(后门访问在波形图上时无法找到操作痕迹的,只能依靠打印信息,这可能增加了调试难度)
前提:寄存器模型在建立时,已经将各个寄存器映射到了DUT一侧的HDL路径上
i.将寄存器模型关联到DUT一端:uvm_reg_block::add_hdl_path( )
ii. 寄存器模型各个寄存器成员与HDL一侧的地址映射: uvm_reg::add_hdl_path_slice( )
iii.结束地址映射关系,保证模型不会被其他用户修改: lock_model( )
访问方法:
i. Uvm_reg::read()/write() PATH = UVM_BACKDOOR
ii. Uvm_reg_sequence::read_reg()/write_reg() PATH=UVM_BACKDOOR
iii. Uvm_reg::peek()/poke()

3.前后门访问的混合应用
1. 通过前门访问验证寄存器访问的物理通路工作是否正常,并且有专门的寄存器测试的前门访问用例来遍历所有的寄存器,在前门访问被验证充分的情况下,在后续测试中使用后门访问来节省访问多个寄存器的时间
2. 对于特殊寄存器应该使用物理方式访问以确保反映真实的硬件行为
3. 先通过后门访问来随机整个寄存器列表,再通过前门访问来配置寄存器

寄存器模型的方法

预测方法:

Mirror value ? Desired value ? Actual value

1. 自动预测:

定义:没有在环境中集成独立的predictor,而是利用寄存器的操作来自动记录每一次寄存器的读写数值,并在后台自动调用predict()方法
调用方法:uvm_reg_map::set_auto_predict( )
问题:若其他sequence直接在总线层面上对寄存器进行读写(跳过寄存器级别的read()/write()操作),或者通过其他总线来访问寄存器等这些额外的情况,都无法自动得到寄存器的镜像值和预期值

2. 显式预测

定义:在物理总线上通过监视器来捕捉总线事务,并将捕捉到的事务传递给外部例化的predictor,该predictor由UVM参数化类uvm_reg_predictor例化并集成到顶层环境中

UVM_REG的访问方法

对于前门访问来说。只有当总线事务完成时,镜像值和期望值才会更新为与总线上相同的值,这种预测方式成为显式预测
对于peek()/poke(),以及后门访问的write()/read(),不通过总线,默认采用自动预测的方式,在零时刻方法调用返回后,镜像值和期望值也相应修改

  1. Reset( ) && get_reset( )
    复位对象为寄存器模型而不是硬件
  2. Mirror()
    可以选择前门访问或者后门访问,不会返回读回的值,但会将对应的镜像值修改,在修改镜像值之前,还可以选择是否要将镜像值和之前的进行比较
  3. Set() && update( )
    Set()方法的对象是寄存器本身,通过set()可以修改期望值
    Update()将不同的寄存器通过前门访问或者后门访问的方式做全部修改(批量操作)
    Set()+update():实现随机化配置寄存器,继而模拟更多不可预知的寄存器应用场景
  4. Mem && Reg
    Uvm_mem:用来模拟RW,RO,WO类型的储存,并且可以配置存储类型的数据宽度和地址范围
    不支持prediction和shadow storage, 没有镜像值和期望值
    提供前门访问和后门访问
    功能:可以利用自带的方法去访问硬件存储
    mem访问方法:read(), write( ), peek( ), poke( ), burst_read( ), burst_write( )
  5. Built-in sequence
    做寄存器的健康检查
    对于需要排除在内建序列外的reg,利用uvm_resource_db来配置“禁止域名”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值