转载:UVM RAL模型:用法和应用_寄存器 (sohu.com)

在系统设计中通常会面临两大挑战:缩小技术节点的规模和上市时间(TTM,Time to Market)。为了适应激烈的市场竞争,大多数系统都是以通用方式设计的,这意味着同一设计可以通过不同的配置实现不同的应用方式。配置数量越多,设计中的寄存器数量越多。最重要的是,由于当前市场对数据存储的大量需求,存储大小也越来越大。为了访问和验证大量寄存器和巨大的存储,需要一些创新的方法。因此,UVM提供了用于寄存器管理及访问的基类库,称为UVM RAL(Register Abstraction Layer,寄存器抽象层)。

顾名思义,UVM RAL是访问设计寄存器的高级面向对象抽象层。RAL模型模仿了设计寄存器,并且整个模型是完全可配置的。由于其抽象行为,RAL模型可以 轻松地从模块级别迁移到系统级别。

本文提供了有关UVM RAL的不同级别的相关内容,包括:如何将同一个RAL模型用于多个接口,RAL模型内部的存储实现及其访问方法,预测器模型的信息以及根据其操作预测寄存器值等。它还有一个现成的UVM寄存器序列列表。仅通过配置这些序列,用户就可以访问和验证所有设计寄存器和存储的功能。

介绍:

任何设计验证的首要步骤是其寄存器验证,即检查寄存器的可访问性及其功能。执行此寄存器验证,并不一定需要使用UVM RAL模型,但是在不使用它进行验证时,用户必须注意每个寄存器的属性和复位值。同样,用户必须确保使用所有可能的值来验证每个寄存器域。在整个寄存器范围内手动执行这些检查是一项很耗时的任务,因此使用UVM RAL模型是一种非常有效的方法。

UVM RAL是面向设计内部寄存器的模型。要访问这些设计寄存器,UVM RAL提供了现成的基类和API。RAL模型的一些特性包括:

  • 就像寄存器的设计一样,它支持不同的寄存器属性,例如R / W,RO,WO,W1C等。
  • 支持两种不同的寄存器访问路径,前门访问和后门访问。
  • 同一模型可以通过多条总线访问。
  • 它的抽象性质允许在模块级别以及系统级别使用相同的模型。
  • 内置比较方法,可将寄存器值与其预测值进行比较。

每个RAL模型主要具有以下三个结构层次:

  • uvm_reg_block是最顶层的层次结构,通常,uvm_reg_block具有所有寄存器(uvm_reg)的一个实例,或者可能具有其他uvm_reg_block的实例。
  • uvm_reg模拟设计内部的寄存器。根据其定义,每个寄存器可以具有一个或多个uvm_reg_field。
  • uvm_reg_field代表寄存器的域。

图1 RAL层次图解

RAL模型模仿设计寄存器,更新设计寄存器的值,同时更新RAL模型寄存器的值。为此,UVM具有通用的API,可以同时更新设计和RAL模型寄存器。除寄存器外,RAL模型也可以用来对存储建模,其优点之一是burst 操作。本文的后半部分中,给出了一个存储burst操作的示例,同时提供了有关预测器模型,寄存器覆盖率和UVM预定义寄存器序列的一些信息。

RAL寄存器映射和适配器

RAL模型集成的基本步骤之一是适配器(adapter)类的实现。此类具有两个基本的函数:bus2reg用于将总线sequence items转换为uvm_reg_bus_op(RAL模型中已知),和reg2bus实现相反的功能。用户定义的适配器类应通过扩展uvm_reg_adapter基类来实现。这意味着所有前门寄存器的读/写操作都通过此适配器类进行。由于适配器类的实现取决于总线,因此,每个总线都必须具有自己的适配器类。

每个前门寄存器的写/读操作都通过reg2bus和bus2reg API进行。对于不同的总线,例如APB和AXI,如果它们访问相同的RAL模型,则需要为每条总线创建适配器类。因此,对于每个寄存器映射,必须按如下所示设置RAL模型sequencer:

使用特定寄存器map访问RAL模型寄存器的示例:

UVM存储器

UVM RAL模型也可以用来对存储建模,称为uvm_mem。像uvm_reg一样,uvm_mem的目的在于模仿设计内部的存储器。下面的代码显示了如何在RAL模型中实现存储建模:

该存储器的优点之一是其burst读/写操作,如下所示:

像寄存器一样,存储器访问也可以通过前门和后门进行。uvm_mem没有空间来存储期望的数据,这意味着该uvm_mem的缺点之一是它不支持内置数据比较。

UVM预测器

如前所述,寄存器模型具有内置的自检机制。每当访问寄存器时,uvm_reg都会更新为相同的值,并且该值会变为其预测值。这种预测可以通过三种不同的方式进行:

  • 隐式预测
  • 显式预测
  • 被动预测

隐式预测

隐式预测是最简单、最常见的预测方法。每当发生寄存器写/读操作时,UVMRAL模型基类都会调用该特定uvm_reg类的predict方法。要启用此功能,用户必须调用uvm_reg_map的set_auto_predict(1)方法,如下所示。默认情况下,该方法是禁用的。

图2 隐式预测流程

如上图所示,启用自动预测后,寄存器模型会在每次写/读操作时预测该值。在这里,期望用户必须通过调用uvm_reg的write或read方法来启动寄存器操作。

显式预测

使用显式预测,用户必须创建uvm_reg_predictor类的句柄,该类是RAL模型的基类。该预测器类需要与监视器类相连。监视器对发生在接口上的寄存器写/读操作进行采样,并将捕捉到的事务传递给预测器。Predictor类借助适配器将总线事务转换为寄存器事务,然后调用该寄存器的predict方法。

在编码方面,利用三个基本步骤可以实现显式预测:创建,配置和连接。

  • 创建

  • 配置

  • 连接

这种预测方法的优势在于,因为预测是基于接口上驱动的数据进行的,所以寄存器模型总是与实际数据保持同步。

被动预测

当未通过寄存器模型进行寄存器读/写操作时,此方法很有用。被动预测根据在总线接口上观察到的操作来预测寄存器值,与显式预测非常相似。

寄存器覆盖率

UVM RAL提供了一个API来采样用户定义的覆盖组。为了对这些覆盖组进行采样,用户必须覆盖(override)uvm_reg/uvm_reg_block类的sample方法。对于RAL模型覆盖,用户必须使能寄存器预测。

以下代码显示了扩展uvm_reg_block内部的covergroup实现,其中涵盖了寄存器及其操作。

下面的uvm_reg类内部的covergroup实现示例显示,其意图是覆盖访问寄存器所用的不同值。

选择性覆盖组采样也是可能的,为此,用户必须提供适当的功能覆盖类型标识符。

UVM RAL预定义序列

UVM软件包提供了一组现成的序列,以测试寄存器的功能,例如其访问或复位值。所有这些序列在操作上都是唯一的,其中有几个寄存器序列的描述如下表所示:

序列名称

功能

uvm_reg_hw_reset_seq

检查每个寄存器的复位值是否与硬件复位值匹配。

uvm_reg_bit_bash_seq

检查所有支持读写访问的域,依次写入1和0,并读出后做比较,用于检查寄存器域属性的有效性。

uvm_reg_access_seq

用前门访问方式写入每个寄存器,从后门读回数值进行比较。然后执行反向操作,即通过后门进行写操作,并通过前门进行检查。

uvm_mem_walk_seq

在目标存储的指定地址范围的每个地址写入数据,并将其与读取值进行比较。

uvm_mem_access_seq

对于存储器的每个位置,通过前门写入,从后门读回数值进行比较。然后,执行反向操作,即通过后门进行写操作,并通过前门进行验证。

uvm_reg_shared_access_seq

通过每个地址映射写入所有寄存器,并通过读取所有地址映射来确认其写入值。

uvm_mem_shared_access_seq

通过每个地址映射写入所有内存位置,并通过读取所有地址映射确定其写入值。

uvm_reg_mem_shared_access_seq

执行uvm_reg_shared_access_seq,然后执行uvm_mem_shared_access_seq

uvm_reg_mem_built_in_seq

执行所选/所有上述预定义序列。

uvm_reg_mem_hdl_paths_seq

检查指定的HDL路径是否可访问。

上述每个测试都有一个禁用属性,用户可以通过该属性跳过任何寄存器/存储器的特定测试。通过设置属性:“NO_REG_TEST”或“NO_MEM_TEST”,用户可以从上述所有测试中排除特定的寄存器/存储器。

总结

UVM RAL是访问和验证设计寄存器和存储器的简单方法。与实际设计一样,uvm_mem支持burst写入和读取操作。除了访问寄存器之外,UVM还有现成的API,可用于对寄存器覆盖率进行采样。此外,由于不同UVM寄存器预定义序列的多个场景,寄存器验证的任务也变得简单。由于其分层结构和大量可用的API,RAL模型具有足够的灵活性。除了以标准方式访问API外,用户还可以使用这些API进行其他一系列操作,例如,通过其地址访问寄存器或更新任何特定的寄存器域。总体而言,UVM RAL是功能强大的抽象层,它支持寄存器验证所需的所有功能,并且由于其组织结构,强烈建议在基于UVM的测试平台中利用RAL模型进行寄存器验证。

原文来自:

https://www.design-reuse.com/articles/46675/uvm-ral-model-usage-and-application.html

UVM RAL模型和内置seq的更多相关文章

  1. JavaScript的事件、DOM模型、事件流模型以及内置对象详解(三)

    JS中的事件 JS中的事件分类 1.鼠标事件: click/dbclick/mouseover/mouseout 2.HTML事件: onload/onunload/onsubmit/onresize ...

  2. Odoo模型的内置方法(可按需重写)

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826222.html ==========模型层面========== 一:_table_exist 检查 ...

  3. Django(60)Django内置User模型源码分析及自定义User

    前言 Django为我们提供了内置的User模型,不需要我们再额外定义用户模型,建立用户体系了.它的完整的路径是在django.contrib.auth.models.User. User模型源码分析 ...

  4. cakePHP模型内置回调函数afterFind()的使用。

    在用find获取数据后,我们要对所获取到的数据做一些处理,这时,直接在模型层覆盖cakephp内置的回调函数,使用find时会自动调用. 其中$baomings 就是find 到的 $this-> ...

  5. 11 The Go Memory Model go语言内置模型

    The Go Memory Model go语言内置模型 Version of May 31, 2014 Introduction 介绍 Advice 建议 Happens Before 在发生之前 ...

  6. xadmin 配置内置User模型

    xadmin 配置内置USER模型 默认展示 在你的User模型对应的app下创建adminx 文件 import xadmin from django.contrib.auth import get ...

  7. 161.内置User模型的基本使用

    User模型 user模型是这个框架的核心部分,他的完整路径是在django.contrib.auth.models.User.对User对象做一个简单的了解. 字段: 内置的User模型有以下字段: ...

  8. Entity Framework 6 Recipes 2nd Edition(11-12)译 -> 定义内置函数

    11-12. 定义内置函数 问题 想要定义一个在eSQL 和LINQ 查询里使用的内置函数. 解决方案 我们要在数据库中使用IsNull 函数,但是EF没有为eSQL 或LINQ发布这个函数. 假设我 ...

  9. Oracle学习笔记十四 内置程序包

    扩展数据库的功能 为 PL/SQL 提供对 SQL 功能的访问 用户 SYS 拥有所有程序包 是公有同义词 可以由任何用户访问 一些内置程序包 程序包名称 说明 STANDARD和DBMS_STAND ...

随机推荐

  1. Insecure CAPTCHA (不安全的验证码)

    dvwa不能正常显示,需要在配置文件中加入谷歌的密钥: $_DVWA[ 'recaptcha_public_key' ] = '6LfX8tQUAAAAAOqhpvS7-b4RQ_9GVQIh48dR ...

  2. CodeForce-791B Bear and Friendship Condition(并查集)

    Bear Limak examines a social network. Its main functionality is that two members can become friends ...

  3. TypeScript与面向对象

    目录 1.引 2.类(class) 3.构造函数和this 4.继承 5.super 6.抽象类 7.接口 8.属性的封装 9.泛型 1.引 简而言之就是程序之中所有的操作都需要通过对象来完成.一切操 ...

  4. supermvc 操作备要

    模板暂时仅支持smarty,需要指定模板文件   系统配置文件在supermvc文件夹下 sconfig.php 修改项目目录下的conf下的config.php 会覆盖系统默认配置   contro ...

  5. Jmeter系列(8)- 参数化:JSON提取器、全局参数化、CSV文件导入

    JSON提取器 同一个响应结果需要提取多个参数进行参数化,下方输入项用分号(;)进行间隔.请求引用时${变量名} 全局参数化 此处全局参数化用的是用户自定义的变量 CSV文件导入

  6. Python爬虫之PySpider框架

    概述 pyspider 是一个支持任务监控.项目管理.多种数据库,具有 WebUI 的爬虫框架,它采用 Python 语言编写,分布式架构.详细特性如下: 拥有 Web 脚本编辑界面,任务监控器,项目 ...

  7. gitlab与git命令

    gitlab安装目录 /etc/gitlab#配置文件目录 /run/gitlab#运行pid目录 /opt/gitlab#安装目录 /var/opt/gitlab#数据目录 /var/log/git ...

  8. 鸿蒙内核源码分析(汇编基础篇) | CPU在哪里打卡上班? | 百篇博客分析OpenHarmony源码 | v22.01

    百篇博客系列篇.本篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪里打卡上班 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在 ...

  9. 深入浅出WPF-11.Template(模板)01

    模板 在WPF中,模板可以分为两大类: 控件模板(ControlTemplate)是算法内容的表现形式,一个控件怎么组织其内部的结构才能让它更符合业务逻辑,让用户操作更舒服,都是由她控制的.它决定了控 ...

  10. java多线程--wait和sleep

    调用sleep方法将时线程进入休眠状态 如 public class ThreadTest implements Runnable{ @Override public void run() { try ...