[uvm]寄存器模型

过程记录,持续更新。。。

常用方法整理

read,write区分前门访问和后门访问,可以对reg和field进行处理,会对desire value和mirror value进行修改

peek,poke是后门访问,可以对reg和field进行处理,会对desire value和mirror value进行修改,会对dut 真实值进行修改

mirror,可以对reg和block进行处理,会对desire value和mirror value进行修改,如果配置了uvm_check,当dut真实值和镜像值不相等时,会更新mirror value和desire value,并报error

update,可以对reg和field进行处理,当mirror value和desire value不同时,会用desire value更新mirror value和dut的值

predict,不区分前后门,uvm_predict_direct: 直接预测,相当于强行预测,变更mirror value和desire value; uvm_predict_read/write: 读预测,假设对目标寄存器是读/写操作,再根据是前门访问还是后门访问,决定是否改写mirror value和desire value

set/get

 常见方法应用举例

 

 

### UVM 寄存器模型概述 UVM (Universal Verification Methodology) 寄存器模型提供了一种强大而灵活的框架来管理寄存器模型,使得硬件寄存器的有效验证成为可能[^2]。该模型不仅简化了寄存器级功能验证过程中的复杂度,还提高了代码重用率。 ### 创建 UVM 寄存器模型 创建一个完整的寄存器模型涉及多个方面的工作: #### 定义寄存器字段 每个 `uvm_reg_field` 对象代表单个寄存器内的某个域,并具有四个主要属性:复位值、随机值、镜像值和期望值[^4]。这些属性用于描述寄存器的行为及其预期状态。 ```cpp class my_register extends uvm_reg; rand uvm_reg_field field0; // 字段定义 endclass : my_register ``` #### 构建寄存器类 通过继承自 `uvm_reg` 的方式构建具体的寄存器类,在其中实例化各个字段并设置初始参数。 ```cpp function new(string name = "my_register"); super.new(name); field0 = uvm_reg_field::type_id::create("field0", this); field0.configure(this, 8, 0, "RW", 0, 8'hFF, 1, 0, 1); // 参数配置 endfunction : new ``` ### 将寄存器模型集成至环境 当完成了寄存器本身的定义之后,则需将其融入整个测试平台架构之中。这一步骤主要包括适配器(adapter)与预测器(predictor)组件的设计及链接工作[^5]。 - **Adapter**: 负责将事务转换成总线周期指令序列; - **Predictor**: 根据接收到的数据更新内部映射表; 两者共同作用于确保外部接口协议同内部表示之间的一致性和同步性。 ### 实现读写操作 对于已建立好的寄存器对象来说,可以利用预设的方法来进行数据交互活动。下面展示了一个简单的例子说明怎样执行一次标准的读取动作: ```cpp virtual task read(uvm_reg_data_t& value); reg.read(status, value); if (!status.is_ok()) `uvm_error(get_type_name(), $sformatf("Read failed")) endtask : read ``` 同样地,也可以采用相似的方式实现写入逻辑。 ### 示例总结 上述内容展示了基于UVM框架下的寄存器建模流程,从基本概念出发逐步深入探讨具体实践细节。希望这份指南能够帮助读者更好地理解和掌握这一重要工具的应用技巧[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值