[UVM源代码研究] 我们在使用UVM寄存器模型内建的sequence检查寄存器时UVM源代码都执行了些啥?

[UVM源代码研究] 我们在使用UVM寄存器模型内建的sequence检查寄存器时UVM源代码都执行了些啥?

UVM源代码为我们提供了以下built-in的sequence,方便我们快速的验证一些通用的寄存器功能(比如reset值(uvm_reg_hw_reset_seq)、每个寄存器的各个bit位的读写功能(uvm_reg_bit_bash_seq))
在这里插入图片描述

本文将以uvm_reg_hw_reset_seq为例介绍下这类内建sequence的典型应用场景以及相关的注意事项

我们实际使用时如下图所示
在这里插入图片描述

这四行代码分别对应着该内建sequence的声明、创建、寄存器模型关联以及启动,sequence的启动一定要放在某个task phase中,其他三步可以放在之前的任何地方。

我们这里有两点疑问:

  1. 执行这个hw_reset的过程是否uvm源代码是否会执行reset操作

  2. seq的启动传递的参数为什么是null?是否可以换成对应的sequencer?

这两个问题都可以查看该uvm_reg_hw_reset_seq的内部代码得到答案
在这里插入图片描述

我们首先来看下uvm_reg_hw_reset_seq中的一个空的virtual task reset_blk的描述。由此我们可以获得上面第一个问题的答案,uvm源代码中的uvm_reg_hw_reset_seq是不会主动帮你去对DUT做reset的,但是它预留了一个hook任务reset_blk,我们可以通过从uvm_reg_hw_reset_seq继承的sequence来override这个任务来实现将reset DUT的工作集成到uvm_reg_hw_reset_seq中,调用reset_blk就在该sequence的执行主体body中完成
在这里插入图片描述

上图中红色框预留了对DUT的reset处理任务,绿色框对寄存器模型进行了reset,蓝色框则是执行该hw_reset检查的主体代码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这里又涉及到了另一个知识点,就是当我们用内建sequence检查寄存器时,如果我们有些寄存器想跳过检查,可以使用如下方法
在这里插入图片描述

我们不仅可以对某一个具体的寄存器做排除,还可以对整个reg_block做排除,而uvm_reg_hw_reset_seq中检查是否被排除的代码分别是93-99(检查reg_block是否被排除)和128-131(检查具体的reg是否被排除),进一步追踪这个get_by_name()函数我们可以知道UVM源代码仅仅关系这个NO_REG_TESTS或者NO_REG_HW_RESET_TEST是否用uvm_resourece_db#(bit)::set过,至于set的值是0还是1,结果都是一样的
在这里插入图片描述

在这里插入图片描述

另外一点,NO_REG_TESTS和NO_REG_HW_RESET_TEST区别在于前者针对所有的内建sequence都排除,而NO_REG_HW_RESET_TEST仅仅针对的是uvm_reg_hw_reset_seq这一单一sequence,又比如uvm_reg_bit_bash_seq使用的是NO_REG_BIT_BASH_TEST
在这里插入图片描述

由于内建sequence的启动是可以出现在任意task phase的任何地方的,所以我们只需要在执行sequence启动前的任何地方执行uvm_resourece_db#(bit)::set就行了。

过上面这些代码截图,我们可以发现其实这些内建sequence本质上并没有放到某个具体的sequencer执行,它只是用了sequence执行时调用body()的机制而已,因而我们传递任何的参数给sequence的start()只需要满足参数类型需求就行了,具体传递的值是多少并不重要,因为根本不会用。uvm_sequence_base中的start任务原型如下
在这里插入图片描述

因而我们传递给start的参数只要是uvm_sequencer_base类型或者它的子类或者null就可以了。

这里还有一个有趣的现象,就是我们一旦通过uvm_resourece_db#(bit)::set之后就无法unset了,也就是当我们跑某个sequence把相应的寄存器排除了之后,后面是没法跑同样的sequence来取消排除的,除非把这个全局变量的set从uvm_resource_db中删除掉,那这样一个"unset"的过程需要怎么做呢?

查看了uvm_resource[_db]相关的源代码,并没有发现有类似"unset"这种方法来清空set的内容,我们看下set里的代码
在这里插入图片描述

所以我们set相当于就是往联合数组rtab[]里添加新的内容,但是rtab添加的内容如何删除并没有提供算法来进行处理,这里就不做讨论了。

总结

本文讨论了寄存器模型内建sequence的相关议题,主要以uvm_reg_hw_reset_seq作为切入点讨论了内建sequence的使用方法,带着文初提出的两点疑问将uvm源代码中相关的内容简单的过了一遍,顺带还对uvm_resource_db的相关内容进行了引深,后续我们还会就uvm_resource_db以及uvm_config_db的使用问题专门展开讨论。

### UVM寄存器模型内建Sequence功能 UVM框架提供了多种内置的测试序列(built-in sequences),用于简化基于寄存器模型的验证工作。这些序列能够自动执行常见的操作,如读取、写入以及校验寄存器的内容,从而减少了手动编写重复性代码的需求[^2]。 #### 内建Sequence的主要用途 - **初始化配置**:通过预定义好的sequence来设置初始状态。 - **随机访问**:允许以伪随机的方式对寄存器进行读/写操作。 - **一致性检查**:确保硬件行为符合预期规格说明中的描述。 对于希望快速启动并稳定运行其验证平台的人来说,利用好这些现成资源是非常重要的一步。 #### 如何使用内建Sequences? 为了调用某个特定类型的内建sequence,在`run_phase`阶段可以通过如下方式实现: ```verilog // 创建一个指向所需类型的具体实例 uvm_reg_hw_reset_seq reset_seq; reset_seq = uvm_reg_hw_reset_seq::type_id::create("reset_seq"); // 设置目标环境下的注册表句柄 reset_seq.model = env.reg_model; // 启动该序列 reset_seq.starting_phase = phase; fork begin reset_seq.start(null); end join_none ``` 上述例子展示了如何创建并启动一个重置所有已知寄存器到默认值的操作流程——这通常是在仿真开始前完成的一个重要步骤[^1]。 另外一种常用的场景是对单个或多个寄存器执行简单的读/写动作;此可采用更通用的形式如`uvm_reg_single_rw_seq`来进行处理: ```verilog class my_register_sequence extends uvm_sequence #(uvm_sequence_item); `uvm_object_utils(my_register_sequence) function new(string name="my_register_sequence"); super.new(name); endfunction task body(); // 定义要交互的目标寄存器列表 foreach(env.reg_model.regs[i]) begin automatic uvm_reg reg = env.reg_model.regs[i]; repeat(5) begin // 对每个寄存器做五次循环 bit[7:0] data; // 构造新的读写请求包 uvm_reg_data_t value; std::randomize(data); // 随机生成数据 // 执行一次写入再跟随一次读回确认 void'(reg.write(status, data)); assert(reg.read(status, value)) else `uvm_fatal(get_type_name(), "Read failed") if(value != data) `uvm_error(get_type_name(), $sformatf("Mismatch! Wrote %h but read back %h",data,value)) end end endtask :body endclass : my_register_sequence ``` 这段代码片段实现了遍历指定范围内的每一个寄存器,并对其实施一系列固定的读写组合命令,以此达到初步检验目的的同也提高了覆盖率水平[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值