一个简单的寄存器模型

1.设计中具有不同功能字段的单个寄存器示例。

2.在验证中需要为设计中的每一个寄存器都创建一个对象,该对象继承自 uvm_reg 类别,寄存器的每一个字段对应一个 uvm_reg_field 对象。

class reg_ctl extends uvm_reg;
    
    //申明为rand类型便于随机化
    rand uvm_reg_field En; 
    rand uvm_reg_field Mode;
    rand uvm_reg_field Halt;
    rand uvm_reg_field Auto;
    rand uvm_reg_field Speed;

    //super.new中第二个参数为寄存器的宽度这里是32,第三个参数为是否加入覆盖率的支持
    function new (string name = "reg_ctl");
        super.new(name,32,UVM_NO_COVERAGE);
    endfunction

    //每一个派生自uvm_reg的类都有一个build函数,可以在此build中 实例化、配置 uvm_reg_field
    virtual function void build ();

        En  =  uvm_reg_field :: type_id :: create ("En");
        Mode = uvm_reg_field :: type_id :: create ("Mode");
        Halt = uvm_reg_field :: type_id :: create ("Halt");
        Auto = uvm_reg_field :: type_id :: create ("Auto");
        Speed= uvm_reg_field :: type_id :: create ("Speed");

        /*使用 configure 函数配置()
            function void configure (
                                    uvm_reg         parent,         父类
                                    int unsigned    size,           宽度
                                    int unsigned    lsb,            最低位
                                    string          access,         存取方式,RW,RO.....
                                    bit             volatile,       是否易失,一般不使用
                                    uvm_reg_data_t  reset,          复位后的默认值
                                    bit             has_reset,      是否有复位,一般为1
                                    bit             is_rand,        是否可随机,一般为1
                                    bit                             是否可单独存取
            )
        */
        En.configure   (this,1,0,"RW",0,1'h0,1,1,1);
        Mode.configure (this,3,1,"RW",0,3'h2,1,1,1);
        Halt.configure (this,1,4,"RW",0,1'h1,1,1,1);
        Auto.configure (this,1,5,"RW",0,1'h0,1,1,1);
        Speed.configure (this,5,11,"RW",0,5'h1c,1,1,1);
    endfunction
endclass

3.定义好一个寄存器之后,需要在 reg_block 的派生的类中将其实例化。

class reg_block extends uvm_reg_block;

    rand reg_ctl m_reg_ctl;

    `uvm_object_utils(reg_block)
    function new (string name = "reg_block");
        super.new(name,UVM_NO_COVERAGE);
    endfunction
        
    //在build中经行实例化
    virtual function viod build ();

        //一个uvm_reg_block 中 要有一个对应的 uvm_reg_map,系统有一个已经定义好的default_map,只需要用create_map对其进行实例化
        //第一个参数是名字,第二个参数是基地址,第三个参数是总线宽度单位是byte,第四个是大小端。
        default_map = create_map ("default_map",0,4,UVM_BIG_ENDIAN);

        //实例化reg_ctl
        m_reg_ctl = reg_ctl :: type_id :: create ::("m_reg_ctl",get_full_name);

        //configure函数用来指定寄存器进行  后门  访问的路径
        //第一个参数:此uvm_reg_block的指针,第二个参数:reg_file的指针,第三个:后门访问路径
        m_reg_ctl.configure(this,null,"");

        //调用reg_ctl中的build函数
        m_reg_ctl.build();

        //将此寄存器加入到 uvm_reg_map 中
        //uvm_reg_map 的作用用于储存寄存器的地址
        //第一个:名字,第二个:寄存器的地址,第三个:存取方式
        default_map.add_reg (m_reg_ctl,h'0,"RW");
    endfunction
endclass

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值