UVM RAL寄存器模型(基础)

寄存器模型概述

RAL(Register Abstract Layer,寄存器抽象层),对寄存器这个部件的建模。

寄存器模型要做的事:就是在验证环境的世界里面,复刻RTL中的寄存器。(便于观测与使用)

构造寄存器模型

寄存器组中有的,寄存器模型也应该要有,顶多是多了一些抽象。基于这个想法,构造寄存器模型的工作,便可以从硬件寄存器组的设计,一一映射为对应的数据结构。

寄存器最小单元——域段(field)

一个寄存器要切分成多少个域段、每个域段的位宽、默认值、读写属性以及分别用于什么功能的控制或状态的指示,是根据功能规范来定义的。对域段的建模,UVM类库提供的类型叫uvm_reg_field

寄存器模型(reg)

寄存器是可作为单个实体被访问的多个域段的集合,它可以被映射到一个或者多个地址上(memory-mapped)被访问。UVM提供的类型叫uvm_reg。为了提供后门访问(backdoor access),uvm_reg还增加了成员来表示其对应的硬件寄存器在RTL中的层次路径。

//uvm_reg
class reg_invert extends uvm_reg;

    rand uvm_reg_field reg_data; //寄存器模型中的最小单元(存储寄存器数值的变量)

    virtual function void build();//uvm_reg_field实例化
        reg_data = uvm_reg_field::type_id::create("reg_data");
//uvm_reg_field::config parameter:parent,size(宽度),lsb_pos(有效起始位),access(访问方式),volatile(是否异失),reset_value(复位后默认值),has_reset(是否有复位),is_rand(是否支持随机化),individually accessible(单独存取)
        reg_data.config(this,1,0,"RW",1,0,1,1,0);//实例化后配置字段
    endfunction
    
    `uvm__object_utils(reg_invert) //object注册

    function new(input string name="reg_invert");
        //parameter: name.size,has_coverage
        super.new(name,16,UVM_NO_COVERAGE);//将“reg_invert”寄存器的总宽度传递给super.new函数
    endfunction
    
endclass

寄存器访问译码表(Memory Map)

寄存器接口从访问地址到使能对应寄存器所需要的查找表。指定了每个寄存器的偏移地址(offset)、访问属性、大小端、对应的总线等配置。对memory map的建模,UVM提供的类型叫uvm_reg_map

每个寄存器加入寄存器模型时都有其地址,uvm_reg_map就是存储这些地址,并将其转换成可以访问的物理地址(因为加入寄存器模型的地址一般都是offset),当寄存器模型通过frontdoor来访问时,就需要uvm_reg_map(default_map)来转换成绝对地址,启动一个读/写sequence,并返回结果。

 寄存器组(uvm_reg_block)

寄存器组由多个寄存器及其访问译码表。

一个uvm_reg_block一定要对应一个uvm_reg_map。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值