uvm 寄存器模型内建sequence

1 UVM_REG build-in sequence

uvm_reg_hw_reset_seq
uvm_reg_access_seq
uvm_reg_single_access_seq
uvm_reg_bit_bash_seq
uvm_reg_single_bit_bash_seq
uvm_reg_shared_access_seq

1.1 uvm_reg_hw_reset_seq

uvm_reg_hw_reset_seq用于检查上电复位后寄存器模型与DUT中寄存器的默认值是否相同;
如果想跳过某个寄存器的检查,可以在启动此sequence前使用resource_db设置不检查此寄存器。例如:

function void my_case0::build_phase(uvm_phase phase);
…
uvm_resource_db#(bit)::set({"REG::",rm.invert.get_full_name(),".*"},"NO_REG_TESTS", 1, this);
…
endfunction
//或
function void my_case0::build_phase(uvm_phase phase);
…
uvm_resource_db#(bit)::set({"REG::",rm.invert.get_full_name(),".*"}, "NO_REG_HW_RESET_TEST", 1, this);
....
endfunction

1.2 uvm_reg_single_access_seq

通过其默认地址映射写入寄存器,然后通过后门读取它,然后反转过程,确保得到的结果值与镜像值匹配。

注:

没有可用后门的寄存器,或者只包含只读字段的寄存器,或者字段具有未知访问策略的寄存器,都不能被测试。

1.3 uvm_reg_access_seq

uvm_reg_access_seq用于检查寄存器的读写; 通过在其中的每个寄存器上执行 <uvm_reg_single_access_seq> 序列,来验证一个块内所有寄存器的可访问性。

注:只对所有位都是RW类型的寄存器进行测试,而且写的都是全0或者全ff;

如果要跳过某个寄存器的读写检查,则可以在启动sequence前使用如下的两种方式之一进行设置:

function void my_case0::build_phase(uvm_phase phase);
…
//set for reg access sequence
uvm_resource_db#(bit)::set({"REG::",rm.invert.get_full_name(),".*"},"NO_REG_TESTS", 1, this);
uvm_resource_db#(bit)::set({"REG::",rm.invert.get_full_name(),".*"},"NO_REG_ACCESS_TEST", 1, this);
...
endfunction

1.4 uvm_reg_single_bit_bash_seq

验证单个寄存器的实现,方法是尝试通过寄存器映射的每一个地址映射,向寄存器的每个位写入1和0,确保最终的值与镜像值匹配。
如果想要忽略莫个寄存器的检查,可以使用下面的方法:

uvm_resource_db#(bit)::set({"REG::",regmodel.blk.r0.get_full_name()},
                            "NO_REG_TESTS", 1, this);

注:

包含未知访问策略字段的寄存器无法进行测试。
在这个测试期间,DUT(设备在测试)应该处于空闲状态,并且不应该修改任何寄存器。

1.5 uvm_reg_bit_bash_seq

通过执行<uvm_reg_single_bit_bash_seq>序列来验证一个模块中所有寄存器的实现。

1.6 uvm_reg_share_access_seq

通过在每个地址映射中写入共享寄存器,然后通过其他所有可读的地址映射以及后门接口读取它,确保得到的值与镜像值一致,从而验证共享寄存器的可访问性。

忽略check 方式:

uvm_resource_db#(bit)::set({“REG::”,regmodel.blk.r0.get_full_name()},
“NO_REG_TESTS”, 1, this);

2 UVM_MEM build-in sequence

uvm_mem_single_walk_seq
uvm_mem_walk_seq
uvm_mem_single_access_seq
uvm_mem_access_seq
uvm_mem_shared_access_seq

2.1 uvm_mem_single_walk_seq

在mem指定的地址2.2范围中的每一个地址写入数据,然后再读出对比;

2.2 uvm_mem_walk_seq

对包含所有的uvm_mem执行uvm_mem_single_walk_seq;

2.3 uvm_mem_single_access_seq

类似于uvm_reg_single_access_seq,用来检查硬件存储地址映射的有效性,前提需要存储模型的hdl路径已经指定

2.4 uvm_mem_access_seq

对包含的所有的uvm_mem执行uvm_mem_single_access_seq

2.5 uvm_mem_shared_access_seq

类似于uvm_reg_shared_access_seq,用来检查所有可能访问存储模型路径的有效性;

3 build-in sequence的使用

 ...
  virtual task body();
        uvm_reg_bit_bash_seq ckseq;
        ckseq = new("ckseq");
        ckseq.model = p_sequencer.p_rm;
        repeat(1) begin
            ckseq.start(null);
        end
    endtask
  ...
  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UVM(Universal Verification Methodology)寄存器模型是一用于验证芯片寄存器功能的标准方法。它提供了一个统一的、可重用的框架,用于建立和管理寄存器模型,以及执行寄存器访问和验证。 UVM寄存器模型的主要组成部分包括寄存器模型寄存器层次结构、寄存器操作和寄存器验证环境。 1. 寄存器模型UVM寄存器模型是一个抽象的表示,用于描述芯片内部的寄存器寄存器字段。它提供了一种结构化的方式来定义寄存器的属性、寄存器字段的位宽和访问权限等。 2. 寄存器层次结构:UVM寄存器模型支持多层级的寄存器结构,可以通过层级关系来描述芯片内部的寄存器模块和子模块。这样可以更好地组织和管理寄存器模型,并提供寄存器之间的相互作用和访问。 3. 寄存器操作:UVM提供了一系列的API,用于执行寄存器读写操作。通过这些API,可以向寄存器模型发送读写请求,并获取响应。同时,还可以对寄存器的访问进行配置和控制,如重置、写入默认值等。 4. 寄存器验证环境:UVM寄存器模型可以与其他验证环境进行集成,以验证寄存器功能的正确性。通过使用事务级建模(TLM)接口,可以将寄存器操作与其他验证组件进行交互,并进行功能验证、覆盖率分析和错误注入等。 总之,UVM寄存器模型提供了一种规范化的方法来描述和验证芯片寄存器功能。它具有可重用性、灵活性和扩展性,并能与其他验证组件进行集成,从而提高验证效率和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值