【UVM】reg_model的一些基本操作

UVM的寄存器模型,对一个寄存器bit中有两种数值,mirror值,尽可能的反映DUT中寄存器的值。expected值,尽可能的反映用户期望的值。

几种常用的操作:

read/write:可以前门访问也可以后门访问,如果在env的顶层定义过uvm_auto_predict(1),则UVM会在这两个操作后自动调用do_predict函数来更新寄存器模型中的mirror值。

peek/poke:只用于后门访问,而且完全不管硬件的行为,如向只读寄存器写数据,仍可以写入。应用很少。会自己更新mirror值和expected值。

get/set:得到或设置寄存器模型的期望值。

update操作:可以使用前门访问,也可以使用后门访问,检查期望值与镜像值是否一致,如不一致,则向DUT写入期望值。 通过枚举结构uvm_path_e来定义。

mirror操作:用于读取DUT中寄存器的值并将它们更新到寄存器模型中。可以前门访问也可以后门访问。两种的应用场景:1)check选项关闭,仿真中不断调用。2)check选项打开,用在结束时,检查DUT与寄存器模型的值是否相同。

predict操作:人为的根据DUT来更新寄存器模型中的镜像值。但同时又不对DUT进行任何操作。此时的uvm_path_e是UVM_PREDICT_DIRECT。可以通过加monitor在寄存器总线上。检测到uvm_reg_item操作,便通过TLM传送到uvm_reg_predict模块来更新mirror值。函数内部主要有do_predict操作,这是主要的实现函数。还有一个post_predict的回调函数,可以自己扩展根据mirror值更新期望值。但是pre_predict并不是一个回调函数,仅仅只是一个虚函数原型。可以在do_predict操作之前调用,完成覆盖率采样。

 

由于前门访问会消耗仿真时间,而后门访问不会消耗仿真时间,所以在build_phase,connect_phase只能使用后门访问,所以uvm_path_e中默认定义有一个UVM_DEFAULT_PATH,这样就可以在这些phase隐式的指明后门访问。而在task phase中在显式的指明前门访问。(这时DUT已经开始工作,使用前门访问比较接近硬件)一般在config中使用寄存器模型,先set/randomized再update。后门访问。

### 关于UVM寄存器位基准的相关说明 在SystemVerilog中,Universal Verification Methodology (UVM) 提供了一种标准化的方法来验证硬件设计。其中,`uvm_reg` 和 `uvm_reg_block` 是用于建模寄存器和内存映射的核心组件之一。对于涉及寄存器位级别的操作,通常会使用到 `uvm_reg_field` 来定义单个寄存器字段的行为。 #### 寄存器模型中的基本概念 寄存器模型由多个层次组成,其中包括寄存器块 (`uvm_reg_block`)、寄存器 (`uvm_reg`) 以及寄存器字段 (`uvm_reg_field`)。这些类共同协作以实现对寄存器的抽象访问[^1]。 以下是创建一个简单的寄存器及其位域的例子: ```systemverilog class example_register extends uvm_reg; rand uvm_reg_field field_0; // 定义第一个字段 rand uvm_reg_field field_1; // 定义第二个字段 function new(string name = "example_register"); super.new(name, 32, UVM_NO_COVERAGE); endfunction : new virtual function void build(); field_0 = uvm_reg_field::type_id::create("field_0"); field_0.configure(this, 8, 0, "RW", 0, 8'hFF, 1, 1, 1); // 配置字段属性 field_1 = uvm_reg_field::type_id::create("field_1"); field_1.configure(this, 8, 8, "RO", 0, 8'hAA, 1, 1, 1); // 配置另一个字段 endfunction : build endclass : example_register ``` 上述代码展示了如何通过继承 `uvm_reg` 类并重写其方法来自定义寄存器结构。这里的关键在于调用 `configure()` 方法设置各个字段的具体参数,例如宽度、偏移量、访问权限等[^2]。 #### 使用寄存器模型进行读写操作 一旦建立了完整的寄存器模型之后,就可以利用该模型执行实际的操作了。下面是一个典型的例子展示怎样向某个特定地址空间内的寄存器写入数据然后再将其读回出来比较结果是否一致: ```systemverilog reg_model.example_register.write(status, 'hDEADBEEF, .parent(null)); void'(reg_model.example_register.read(status, data_read, .parent(null))); if(data_read != 'hDEADBEEF) `uvm_error(get_type_name(), $sformatf("Data mismatch! Expected:%h Got:%h", 'hDEADBEEF, data_read)) else `uvm_info(get_type_name(), "Read/Write test passed!", UVM_LOW) ``` 此片段演示了一个标准流程——先往目标位置存储预设数值随后立即检索确认两者相匹配的情况;如果发现差异则记录错误日志反之输出成功消息[^3]。 #### 性能评估考量因素 当谈及关于 **UVM register bit benchmarking** 的话题时,主要关注点可能围绕以下几个方面展开讨论: - 初始化时间消耗; - 单次事务延迟; - 并发处理能力测试等等。 然而值得注意的是,在大多数情况下,除非存在特殊需求否则一般不会单独针对某一段程序做细致入微的时间度量分析因为现代EDA工具链已经内置了许多优化机制能够有效提升整体效率减少不必要的开销[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值