基于ral model中寄存器测试重复执行的问题追踪

问题描述

假如有uvm_reg_block A, A有以下特性:

 - A有default_map,并且实例化
 - A有四个sub-block的实例:A0/A1/A2/A3, 均为leaf block
 - A0/A1/A2/A3的default_map均通过add_submap的方式,添加到A的default_map中

假如有uvm_reg_block B扩展自uvm_reg_block, B有以下特性:

 - B有default_map,并且实例化
 - B有一个block A的实例
 - B有若干块mem的实例
 - A的实例通过add_submap的方式添加到A的default_map中
 - mem通过default_map.add_mem的方式添加到B的default_map中去

执行uvm_reg_hw_reset_seq,发现A0/A1/A2/A3的寄存器被重复读了2次。

定位发现在uvm_reg_hw_reset_seqdo_block task中,认为B有
一个memory map,即default_mapdefault_map有5个sub map:

 - A
 - A.A0
 - A.A1
 - A.A2
 - A.A3

do_block会对block进行遍历,遍历到叶子block时,进行寄存器的读操作。首先对A进行遍历,此时会执行A0~A3的读操作;接着执行A0的读操作;再接着执行A1的读操作;然后接着执行A2的读操作;最后执行A3的读操作。

因此导致A0/A1/A2/A3的寄存器被重复读了2次。

解决办法

 - B派生子A
 - B中只对mem进行例化,并添加到default_map中

systemRDL是将每个memory独立封装在一个uvm_reg_block中,每个uvm_reg_block有自己的default_map,示例代码如下:

//rdl文件定义
mem U_RAM_0 {
	mementries = 512;
	memwidth = 24;
	sw = rw; 
};

addrmap csr_ahb {
	external U_RAM_0 U_RAM_0 @0x10000000;
};

生成的ral model代码如下:

    // Mem - U_RAM_0
    class U_RAM_0 extends uvm_reg_block;
        `uvm_object_utils(U_RAM_0)
        rand uvm_mem m_mem;
        
        function new(string name = "U_RAM_0");
            super.new(name);
        endfunction : new

        virtual function void build();
            this.default_map = create_map("reg_map", 0, 3.0, UVM_NO_ENDIAN);
            this.m_mem = new("m_mem", 512, 24, "RW");
            this.m_mem.configure(this);
            this.default_map.add_mem(this.m_mem, 0);
        endfunction : build
    endclass : U_RAM_0

例化如下:

class csr_ahb extends uvm_reg_block;
...
	rand U_RAM_0 U_RAM_0;

	this.U_RAM_0 = U_RAM_0::type_id::create("U_RAM_0");
	this.U_RAM_0.configure(this);
	this.U_RAM_0.build();
	this.default_map.add_submap(this.U_BASE_FLOW_RAM_0.default_map, 'h10000000);
endclass
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sunvally

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

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

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

打赏作者

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

抵扣说明:

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

余额充值