UVM之寄存器模型的理解与应用

一、什么是寄存器模型
首先要明白为什么需要寄存器模型,寄存器模型的意义是什么
如果没有寄存器模型如何进行dut的读写访问呢,一般来讲需要启动一个sequence,然后发送给bus_driver,就需要解决两个问题,第一个如何使用参考模型启动sequence,第二个是sequence读取的寄存器的值如何传递给参考模型。
在这里插入图片描述

所以有了寄存器模型之后,就可以方便对dut进行读写
在这里插入图片描述
二、寄存器模型中基本概念
寄存器中有uvm_reg_field,uvm_reg,uvm_reg_block,uvm_reg_map
uvm_reg: 它比uvm_reg_field高一个级别, 但是依然是比较小的单位。 一个寄存器中至少包含一个uvm_reg_field。
uvm_reg_block: 它是一个比较大的单位, 在其中可以加入许多的uvm_reg, 也可以加入其他的uvm_reg_block。 一个寄存器模
型中至少包含一个uvm_reg_block。
uvm_reg_map: 每个寄存器在加入寄存器模型时都有其地址, uvm_reg_map就是存储这些地址, 并将其转换成可以访问的物理
地址( 因为加入寄存器模型中的寄存器地址一般都是偏移地址, 而不是绝对地址) 。 当寄存器模型使用前门访问方式来实现读或
写操作时, uvm_reg_map就会将地址转换成绝对地址, 启动一个读或写的sequence, 并将读或写的结果返回。 在每个reg_block内
部, 至少有一个( 通常也只有一个) uvm_reg_map

2.1 寄存器模型
在这里插入图片描述
在new函数中, 要将invert寄存器的宽度作为参数传递给super.new函数。 这里的宽度并不是指这个寄存器的有效宽度, 而是指
这个寄存器中总共的位数。 如对于一个16位的寄存器, 其中可能只使用了8位, 那么这里要填写的是16, 而不是8。 这个数字一般
与系统总线的宽度一致。 super.new中另外一个参数是是否要加入覆盖率的支持, 这里选择UVM_NO_COVERAGE, 即不支持。
每一个派生自uvm_reg的类都有一个build, 这个build与uvm_component的build_phase并不一样, 它不会自动执行, 而需要手工
调用, 与build_phase相似的是所有的uvm_reg_field都在这里实例化。 当reg_data实例化后, 要调用data.configure函数来配置这个字
段。
configure的第一个参数就是此域( uvm_reg_field) 的父辈, 也即此域位于哪个寄存器中, 这里当然是填写this了。
第二个参数是此域的宽度, 由于DUT中invert的宽度为1, 所以这里为1。
第三个参数是此域的最低位在整个寄存器中的位置, 从0开始计数。 假如一个寄存器如图7-4所示, 其低3位和高5位没有使
用, 其中只有一个字段, 此字段的有效宽度为8位, 那么在调用configure时, 第二个参数就要填写8, 第三个参数则要填写3, 因为
此reg_field是从第4位开始的

2.2 如何将寄存器集成到验证平台
在这里插入图片描述

寄存器模型的前门访问操作可以分成读和写两种。 无论是读或写, 寄存器模型都会通过sequence产生一个uvm_reg_bus_op的
变量, 此变量中存储着操作类型( 读还是写) 和操作的地址, 如果是写操作, 还会有要写入的数据。 此变量中的信息要经过一个
转换器( adapter) 转换后交给bus_sequencer, 随后交给bus_driver, 由bus_driver实现最终的前门访问读写操作。 因此, 必须要定义
好一个转换器。
在这里插入图片描述
在这里插入图片描述
三、前门访问的实现
在这里插入图片描述
在这里插入图片描述
四、加入存储器
例如, 一个DUT的功能是接收一种数据, 它经过一些相当复杂的处理( 操作A) 后将数据存储在存储器中, 这块存储器是
DUT内部的存储器, 并没有为其分配地址。 当存储器中的数据达到一定量时, 将它们读出, 并再另外做一些复杂处理( 如封装成
另外一种形式的帧, 操作B) 后发送出去。 在验证平台中如果只是将DUT输出接口的数据与期望值相比较, 当数据不匹配情况出
现时, 则无法确定问题是出在操作A还是操作B中, 如图7-8a所示。 此时, 如果在输出接口之前再增加一级比较, 就可以快速地定
位问题所在了, 如图7-8b所示。
在这里插入图片描述
五、镜像值与期望值
由于DUT中寄存器的值可能是实时变更的, 寄存器模型并不能实时地知道这种变更, 因此, 寄存器模型中的寄存器的值有时
与DUT中相关寄存器的值并不一致。 对于任意一个寄存器, 寄存器模型中都会有一个专门的变量用于最大可能地与DUT保持同
步, 这个变量在寄存器模型中称为DUT的镜像值( mirrored value)

除了DUT的镜像值外, 寄存器模型中还有期望值( desired value) 。 如目前DUT中invert的值为’h0, 寄存器模型中的镜像值也
为’h0, 但是希望向此寄存器中写入一个’h1, 此时一种方法是直接调用前面介绍的write任务, 将’h1写入, 期望值与镜像值都更新
为’h1; 另外一种方法是通过set函数将期望值设置为’h1( 此时镜像值依然为0) , 之后调用update任务, update任务会检查期望值和
镜像值是否一致, 如果不一致, 那么将会把期望值写入DUT中, 并且更新镜像值

六、寄存器模型高级用法
使用reg_predictor的用法
在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
UVM中,如果不使用寄存器模型,可以通过使用UVM提供的其他功能来扫描寄存器。一种常见的方法是使用UVM提供的register_sequence来实现寄存器的扫描操作。 首先,你需要创建一个继承自uvm_sequence类的自定义sequence类,用于定义寄存器扫描的操作序列。在这个自定义sequence类中,你可以使用UVM提供的register_sequence_item类来定义每个寄存器的扫描操作。 接下来,在你的测试中,你需要创建一个继承自uvm_test类的自定义test类,并在其中实例化你之前定义的自定义sequence类。然后,你可以在test的run_phase中使用uvm_do_with方法来执行寄存器扫描操作。 下面是一个示例代码,演示了如何在UVM中实现寄存器的扫描操作: ```systemverilog class my_register_sequence extends uvm_sequence #(uvm_sequence_item); `uvm_object_utils(my_register_sequence) virtual task body(); // 定义寄存器扫描操作 my_register_sequence_item scan_item; scan_item.operation = SCAN; scan_item.address = 0; // 设置寄存器地址 scan_item.data = 0; // 设置扫描数据 // 执行寄存器扫描操作 uvm_do_with(scan_item, {repeat = 10;}); endtask endclass class my_test extends uvm_test; `uvm_component_utils(my_test) my_register_sequence reg_sequence; function new(string name, uvm_component parent); super.new(name, parent); reg_sequence = my_register_sequence::type_id::create("reg_sequence"); endfunction virtual task run_phase(uvm_phase phase); // 执行寄存器扫描操作 reg_sequence.start(null); reg_sequence.wait_for_sequence_state(UVM_FINISHED); endtask endclass // 在你的测试环境中实例化my_test类,并运行测试 initial begin my_test test = my_test::type_id::create("test"); run_test("test"); end ``` 通过以上代码,你可以在UVM中实现寄存器的扫描操作,而不使用寄存器模型

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

约翰克里斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值