men与reg的区别以及内建sequence

本文介绍了UVM_men和uvm_reg的区别,UVM_men适合模拟读写操作,但不支持预测和影子存储功能。与uvm_reg相比,UVM_men提供了高速的Burst访问方式,但需要考虑总线是否支持。此外,还探讨了UVM针对寄存器模型内建的sequence在验证项目中的重要作用,以及如何排除某些寄存器的内建序列测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.uvm_menk可以用来模拟读写(RW),也可以RO(只读)WO (只写),类型的存储,并且可以配置模拟的数据宽度和地址范围,担因为物理存储一旦映射到UVM_men会带来更大的资源消耗,所以men不支持预测和影子存储功能,即没有镜像值,也没有期望值。

2.与uvm_reg相比,uvm_men同样有常规访问方法read() write()  peek() poke (),还提供了更加高速的通过物理总线的Burst方式连续存储(burst_read burst_write),但要考虑

1.挂载的总线UVC是否支持burst传输,例如APB总线是不支持burst访问的,

2.与read ()write ()相比,burst_read()和burst_read()的参数列表中的一项uvm_reg_data_tvalue[]是采用数组形式,表示用户可以传递多个数据。

 

3.内建sequence

 UVM针对寄存器模型内建了一些sequence,这些自建的sequence作为验证项目开始前的健康检查必选项,对整个项目的平稳运行有很大作用。

7a5d635585ab40948e292ed44701e1a2.png

### 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、付费专栏及课程。

余额充值