寄存器模型理解

uvm寄存器模型的代码实现及一些扩展知识理解 阅读详情
  • 是什么?

RAL Model 对应于 DUT 中的寄存器,RAL Model 中有 DUT 每一个 寄存器的副本,它是真实硬件寄存器在软件环境中的行为模型;硬件寄存器的一个或多个 bit 的拼接称为一个域 ( field );多一个 field 形成一个 reg;多个 reg 构成一个块 ( block )。uvm library 已经为我们定义好了上述几个概念,我们在使用时只需继承即可。

  • 优势?

    a.方便对 DUT 中寄存器进行读写;
  b.在软件仿真时,可以不耗时的获取寄存器的值(直接从 RAL Model 中获取);
  c.可以很方便的正对寄存器的 coverage 验证点的收集。

 

RAL Model

task my_model::main_phase(uvm_phase phase);
    …
    reg_model.version.read(status, value, UVM_FRONTDOOR);
    reg_model.version.write(status, value, UVM_FRONTDOOR);
    …
endtask

只要一条语句就可以实现上述复杂的过程。像启动 sequence 及将读取结果返回这些事情,都会由寄存器模型来自动完成。在没有寄存器模型之前,只能启动 sequence 通过前门(FRONTDOOR)访问的方式来读取寄存器,局限较大,在 scoreboard(或者其他 component )中难以控制。而有了寄存器模型之后,scoreboard 只与寄存器模型打交道,无论是发送读的指令还是获取读操作的返回值,都可以由寄存器模型完成。有了寄存器模型后,可以在任何耗费时间的phase中使用寄存器模型以前门访问或后门(BACKDOOR)访问的方式来读取寄存器的值,同时还能在某些不耗费时间的 phase(如 check_phase)中使用后门访问的方式来读取寄存器的值。

 

使用ralgen自动产生sv文件

一般寄存器模型的代码是不用自己写的,有很多专门的工具可以生成,例如s家的工具 ralgen

配置文件demo.ralf 如下

block b1 {
    bytes 3;
    register r {
        bytes 1;
        field WDT_EN @'h5 {
            bits 1;
            reset 'h0;
            access rw;
            enum { ENABLE = 1, DISABLE = 0 };
        }
        field DATA_TEST @'h5 {
            bits 2;
            reset 'h0;
            access rw;
            enum { ENABLE = 1, DISABLE = 0 };
        }
    }
}

使用命令

ralgen -t b1 -embed_enum_in_flds -uvm demo.ralf

生成文件如下

`ifndef RAL_B1
`define RAL_B1

import uvm_pkg::*;

class ral_fld_b1_r_WDT_EN extends uvm_reg_field;

	`uvm_object_utils(ral_fld_b1_r_WDT_EN)

	function new(string name = "WDT_EN");
		super.new(name);
	endfunction : new

	typedef enum bit[0:0] { 
		ENABLE = 1, 
		DISABLE = 0
	} WDT_EN_values;
endclass : ral_fld_b1_r_WDT_EN


class ral_fld_b1_r_DATA_TEST extends uvm_reg_field;

	`uvm_object_utils(ral_fld_b1_r_DATA_TEST)

	function new(string name = "DATA_TEST");
		super.new(name);
	endfunction : new

	typedef enum bit[1:0] { 
		ENABLE = 1, 
		DISABLE = 0
	} DATA_TEST_values;
endclass : ral_fld_b1_r_DATA_TEST


class ral_reg_b1_r extends uvm_reg;
	rand ral_fld_b1_r_WDT_EN WDT_EN;
	rand ral_fld_b1_r_DATA_TEST DATA_TEST;

	function new(string name = "b1_r");
		super.new(name, 8,build_coverage(UVM_NO_COVERAGE));
	endfunction: new
   virtual function void build();
      this.WDT_EN = ral_fld_b1_r_WDT_EN::type_id::create("WDT_EN",,get_full_name());
      this.WDT_EN.configure(this, 1, 5, "RW", 0, 1'h0, 1, 0, 0);
      this.DATA_TEST = ral_fld_b1_r_DATA_TEST::type_id::create("DATA_TEST",,get_full_name());
      this.DATA_TEST.configure(this, 2, 5, "RW", 0, 2'h0, 1, 0, 0);
   endfunction: build

	`uvm_object_utils(ral_reg_b1_r)

endclass : ral_reg_b1_r


class ral_block_b1 extends uvm_reg_block;
	rand ral_reg_b1_r r;
	rand ral_fld_b1_r_WDT_EN r_WDT_EN;
	rand ral_fld_b1_r_WDT_EN WDT_EN;
	rand ral_fld_b1_r_DATA_TEST r_DATA_TEST;
	rand ral_fld_b1_r_DATA_TEST DATA_TEST;

	function new(string name = "b1");
		super.new(name, build_coverage(UVM_NO_COVERAGE));
	endfunction: new

   virtual function void build();
      this.default_map = create_map("", 0, 3, UVM_LITTLE_ENDIAN, 0);
      this.r = ral_reg_b1_r::type_id::create("r",,get_full_name());
      this.r.configure(this, null, "");
      this.r.build();
      this.default_map.add_reg(this.r, `UVM_REG_ADDR_WIDTH'h0, "RW", 0);
		this.r_WDT_EN = this.r.WDT_EN;
		this.WDT_EN = this.r.WDT_EN;
		this.r_DATA_TEST = this.r.DATA_TEST;
		this.DATA_TEST = this.r.DATA_TEST;
   endfunction : build

	`uvm_object_utils(ral_block_b1)

endclass : ral_block_b1



`endif

 

backup:

 

包括各个寄存器字段描述、寄存器、寄存器组、寄存器地址映射等信息。

前门和后门访问

前门访问需要adapter

 

 

【UVM基础】深入理解lock_model在寄存器模型中的作用 本文深入探讨了UVM中lock_model在寄存器模型中的关键作用,详细解析其地址计算机制、模型冻结意义及典型应用场景。通过实际案例和调试技巧,帮助验证工程师避免常见错误,掌握层次化设计中的最佳实践,确保寄存器访问的准确性和稳定性。 阅读详情

相关推荐

从零理解UVM寄存器模型:lock_model与地址映射的那些事儿

本文深入解析了UVM寄存器模型中lock_model()函数的核心作用与地址映射机制。通过生动的城市快递系统比喻,阐述了uvm_reg_block、uvm_reg_map与寄存器之间的层级关系,详细说明了相对地址如何通过lock_model()递归计算并锁定为硬件可访问的绝对地址,是确保前门访问准确无误的关键步骤。

weixin_29231027的博客 622

存储器模型

提示 本篇博客是某一位大神关于存储器模型连载文章的链接 1.一个藤上七朵花 大白话存储器模型(1)——“一个藤上七朵花”

qq_46359697的博客 805

深入理解UVM寄存器模型:从相对地址到绝对地址的转换过程

本文深入解析了UVM寄存器模型中从相对地址到绝对地址的转换过程,重点剖析了lock_model()方法的核心作用与递归算法。通过层次化模型实例,详细阐述了地址转换的底层逻辑,并提供了调试地址映射问题的实用技巧与高级应用,帮助验证工程师构建健壮可靠的验证环境。

weixin_29248653的博客 355

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

如果没有寄存器模型如何进行dut的读写访问呢,一般来讲需要启动一个sequence,然后发送给bus_driver,就需要解决两个问题,第一个如何使用参考模型启动sequence,第二个是sequence读取的寄存器的值如何传递给参考模型。uvm_reg_block: 它是一个比较大的单位, 在其中可以加入许多的uvm_reg, 也可以加入其他的uvm_reg_block。写操作时, uvm_reg_map就会将地址转换成绝对地址, 启动一个读或写的sequence, 并将读或写的结果返回。...

约翰克里斯 1927

[UVM源代码研究] 聊聊寄存器模型的后门访问

聊聊寄存器模型的后门访问

sunstat的博客 3375

UVM实战 卷I学习笔记10——UVM中的寄存器模型(4)

目录复杂的寄存器模型*层次化的寄存器模型*reg_file的作用*多个域的寄存器*多个地址的寄存器*加入存储器 复杂的寄存器模型 *层次化的寄存器模型 前面寄存器模型是一个最小、最简单的寄存器模型。在整个实现过程中,只是将一个寄存器加入了uvm_reg_block中,并在最后的base_test中实例化此reg_block。这个例子之所以这么做是因为只有一个寄存器。在现实应用中一般会将uvm_reg_block再加入一个uvm_reg_block中,然后在base_test中实例化后者。从逻辑关系上看,

weixin_41979380的博客 2240

APB_timer中的寄存器模型集成——代码理解

而对于传到bus上也需要用bus的sequencer进行和drv的传递,所以三者是要关联的,这样adapter才能工作。adapter、squencer、map三者的关系,首先需要在环境(一般在env层次时)需要连接三者通过。因为本身rgm充当sequence,adapter充当转换的桥梁,而rgm中因为有lock_model。调用build()函数才能创建uvm_reg,调用uvm_reg里的field等的例化配置。主要进行寄存器块rgm句柄的顶层例化,并将句柄传递给下层environment。

weixin_49816194的博客 1873

【前端验证】通关寄存器与ral_model —— 寄存器的组织形式

ral_model是验证方法学中非常独立且重要的一个篇章。可以说在我维持不长的芯片验证生涯中对ral_model的使用达到了贼溜水平,甚至参考了各种资料组织了部门第一版uvm寄存器验证sequence。但是呢,我从来没有涉足过寄存器的组织与ral_model的生成这部分,这个系列就是为了补齐这部分的短板,距离芯片全栈工程师更进一步啊。当然这个系列还是基于我以往先入门再探究的习惯,先把东西跑出来看到结果确定理论是可行的,再去进行理论拓展和探究。

moon9999的博客 2498

UVM 寄存器模型的理解和使用

2.在reg_block1的build函数中通过add_hdl_path("top_tb.DUT.uart");通过reg1.add_hdl_path("ctrl_reg");1.在reg_model的build函数中例化default_map, 通过default_map.add_submap(reg_block1.default_map, 基地址)2.在reg_block1的build函数中例化default_map, 通过default_map.add_reg(reg1, 偏移地址,“RW”);

m0_57050687的博客 74

[UVM]UVM Register Model(RAL Model)的构建

RAL Model在SoC验证中是非常重要的,通过RAL Model进行寄存器的读写,大大降低的TB对RTL改动的依赖。那么我们应该怎么建立RAL Model呢?本文将总结一种方案。

元直的博客 2282

【前端验证】通关寄存器与ral_model —— 25种常用寄存器类型全览

本文档对于寄存器的属性以synopsys相关文档以及ral_model生成模型时的识别方式为基准。通常讲可以归纳为以下三个方面:读写属性read-write access、写后值modified write value、读后操作read action。注意,这里指的都是软件的操作,对于硬件侧而言,寄存器无法感知到读行为,对于写行为一般允许通过hw_wen和hw_wdata进行操作。

moon9999的博客 2646

深入理解UVM寄存器模型:从相对地址到绝对地址的转换

本文深入解析了UVM寄存器模型中相对地址与绝对地址的转换机制。通过剖析`lock_model()`方法的核心作用,详细阐述了在层次化寄存器结构构建过程中,如何将寄存器的相对偏移递归计算为系统唯一的绝对地址,并探讨了该机制对前门访问的关键影响及常见调试技巧。

u6v7w8x的博客 163

【System Verilog and UVM基础入门6】UVM寄存器模型

一篇文章帮助你掌握前门访问和后门访问

TommiWei的博客 3527

什么是UVM寄存器模型,一篇文章教你分清前门访问和后门访问

通过总线协议(如APB、AHB、AXI等)访问寄存器,模拟真实的硬件行为。

weixin_49118247的博客 757

网络安全面试题

在当今社会网络安全行业越来越发达,也有越来越多的人去学习,为了更好地进行工作,除了学好知识外还要应对企业的面试。 所以在这里我归总了一些网络安全方面的常见面试题,希望对大家有所帮助。 windows常见 1:描述tcp/udp的区别及优劣,及其发展前景 TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能...

fzx_hsaj的博客 6万+

STM32驱动MG996R舵机的PWM控制与闭环原理

舵机是一种典型的模拟闭环伺服系统,其核心是通过电位器反馈实现角度位置的自动校正。工作原理基于负反馈控制:目标PWM脉宽决定期望角度,电位器输出实时反馈实际角度,控制电路计算偏差并驱动电机消除误差。该机制赋予舵机强带载能力与抗干扰性,是机器人、云台、智能执行器等场景的关键执行单元。在嵌入式开发中,STM32通过定时器生成标准20ms周期、0.5–2.5ms脉宽的PWM信号,需严格遵循电气规范,并解决PA15引脚SWJ复用冲突、定时器重映射及CCR精度计算等关键问题。本文深入解析MG996R舵机控制全流程,涵盖

weixin_42600407的博客 563

【UVM进阶】深入理解lock_model在寄存器模型中的关键作用

本文深入解析了UVM寄存器模型中lock_model()函数的关键作用。它并非形式化调用,而是将寄存器相对地址转换为全局绝对地址的核心步骤,是模型从配置阶段转入使用阶段的“最后一道锁”。忘记调用会导致前门访问失败或地址错误,必须在顶层root block调用以确保整个层级化地址映射的正确计算与固化。

vulkan6gpu的博客 219

为什么需要知识图谱?什么是知识图谱?——KG的前世今生

我的知乎专栏,对知识图谱感兴趣的朋友可以关注。标题的命名顺序可能让有的读者不太习惯。通常在介绍一个陌生事物的应用前,我们先给出其定义。之所以换个顺序,是为了不让读者一开始就接触比较冰冷生硬的概念刻板描述(后面我尽量用更具体、准确的例子来表达),另一方面也是为了通过现实生活中的例子自然的引入知识图谱的概念。希望通过这种方式加深读者的印象和理解。为了减轻读者理解的负担,我尽可能地避免引入过多的概念和技术

SimmerChan的专栏 8万+

UVM寄存器模型:reg adapter实现和集成

UVM寄存器模型有内建的抽象的read()和write()等寄存器访问命令,实际的寄存器访问需要通过对用于寄存器访问的总线接口进行驱动来完成。典型的总线接口有AMAB总线家族、I2C总线、SPI总线等都可以用作寄存器访问的总线接口。在UVM验证平台中,要完成寄存器访问,需要进行寄存器模型的抽象的read/write访问动作与具体种类总线的bustransaction之间的转换,这就是adapter(betweenregandbus)所要扮演的角色。...........................

chenxy_bwave的专栏 1万+

【processing】创意编程

首先接到这个作业的时候,我是很崩溃的,我是真的不会画画QAQ,还画自己,这也太难了,于是我决定!还是祸害我爱豆吧!于是我从微博太太那里找了个图临摹 下面是太太的图 先给太太道歉!都是为了作业! 然后我画出来是这样子的 还可以!!!没有特别丑!(虽然也不是特别像吧) 但是画这个真是画死我了,下面贴上代码吧,没啥特殊的就是各种贝塞尔曲线各种圆各种线 //face stroke(70,27,11...

qq_25700571的博客 1267

FPGA经验谈系列文章——3、逻辑级数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Xilinx FPGA开发tips系列——前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的

gzy0506的博客 1万+
上一篇: CFI与SPI flash区别
下一篇: systemverilog 接口理解interface
pine222
博客等级 码龄15年 26粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值