路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

集成级测试平台的UVM寄存器模型

已有 1722 次阅读| 2017-7-30 13:47 |个人分类:验证前沿资讯|系统分类:硬件设计

UVM使得验证测试平台的结构得以标准化,各种复用策略及标准对于提高验证质量、缩短项目周期都非常有效。垂直重用是常见的复用策略之一,即同一项目测试平台复用于不同验证层次。验证中常将最底层的IP级验证平台向更高的集成层复用,而UVM寄存器模型则是验证平台复用的一个关键部分。
UVM寄存器模型是针对于design中配置寄存器的匹配模型。通常,IP在单个地址空间中分配其配置寄存器。在上层的集成级,解码逻辑或寄存器控制块构成来自多个IP的一个或多个地址空间。最简单的组合是级联(即,单个较大的地址空间被分成许多非重叠段),并且每个IP占据一个段。一般情况下,IP的地址不是简单的静态划分,一个IP的基址可以由配置寄存器动态决定。
IP地址空间可以从来自相同地址空间的多个地址段(如图1中所示的“(b0)alias”)访问或从另一个地址空间访问(如图1中所示的“(c)duplication”)。甚至组合地址空间可以从位于另一地址空间中的间接数据/索引寄存器访问(如图1中所示的“(a)indirect”)。本文基于UVM寄存器模型,提出了用于建模集成级配置寄存器的技术。
I. 背景简介
A.UVM寄存器模型
UVM提供了寄存器字段,寄存器,寄存器块,寄存器映射等类别。它们可以扩展,配置和组合在一起,用于模型设计配置寄存器。详细文档UVM手册有详解。 UVM寄存器映射会对一段或一个完整的地址空间建模。较底层寄存器映射被添加到较高层寄存器映射中作为子节点。每个子节点会占用其父节点地址空间的一部分。没有父节点的寄存器映射就是顶部映射了,它表示一个完整的地址空间。只要寄存器映射和寄存器在同一寄存器块中被实例化,一个UVM寄存器就可以被添加到多个寄存器映射中。因此,相同的寄存器可以映射到多个地址空间。
在集成级,集成级寄存器映射地址空间和底层寄存器映射地址空间是父子关系。任何父节点都可以有一个或多个子节点,当前的UVM实现也只允许一个子节点有一个父节点 。 UVM寄存器模型的创建者显然注意到多个父节点的必要性,并且一些初始改进工作已经完成。 寄存器映射和寄存器需要在相同寄存器块上实例化这一规则,在IP集成级造成一些麻烦。例如,在IP级别仅定义了一个地址空间,但在集成级则需要两个地址空间。IP寄存器不允许添加到集成级寄存器块的寄存器映射中。唯一合法的解决方案是更新IP级寄存器模型以使其具有更大的地址空间。出于实际原因,通常这并不容易解决。
B.集成级寄存器模型的需求
 较高级别的寄存器模型必须为每个IP级和中间集成级提供与较低级别相同的编程接口,以促进UVM验证组件和squence的重用。无论地址空间组合复杂与否,都是这样。 下面列出了集成级寄存器模型的一些要点。 1)来自较层次的寄存器字段、寄存器、寄存器块和寄存器映射的名称、属性和结构应保持相同 2)任务,函数和较低级别的类成员变量的原型和功能应保持相同 3)在较低层次别提供的特性应保持相同 4)在较高层次引入的任何功能应该对较低层次透明,由SystemVerilog提供的面向对象编程能力可以满足这些重用需求,同时实现由设计定义的各种组合。
II. 集成级寄存器模型的结构
 UVM强调重用以缩短项目开发周期,但是多年前,验证平台的搭建大约并没有着重考虑重用。集成级寄存器模型的早先的结构可能并不满足UVM重用。即使对于新搭建的纯UVM测试平台,仍然需要考虑如何在集成级测试平台组织来自较低级别的片段。当任何先前所述的重用要求被打破时,IP级sequence必须在被集成级重用之前加以更新。当选择这样的结构时,会产生较大的工作量。下面看一些例子。
  A. 扁平结构
当集成级寄存器模型遵循扁平结构时,来自IP的所有寄存器在一个集成级寄存器块中被实例化。为每个寄存器提供新的和更长的名称,以避免任何潜在的冲突。图2中的代码演示了这种结构。
扁平结构导致寄存器模型与较底层寄存器模型不兼容。较低层squence不能复用。 UVM集成级测试平台不应选择此结构。
 B.重封装结构
集成级寄存器模型可以实例化较低层寄存器子块。这是较低层寄存器模型的重新打包。图3中代码演示了这种结构。
重封装结构同样导致与较低级别不兼容的寄存器模型。较底层squence不能重用。 UVM集成级测试台不应选择此结构。
 C.分层结构
当在集成级寄存器模型中直接实例化每个较低层寄存器模型时,创建分层结构。任何较低层次的寄存器模型都是该层次结构中的分支。图4中的代码演示了这种结构。
这种层次结构式与较低级别的寄存器器兼容的。较低级别的sequence能够被重用。而且这种结构的重用是递归性的。UVM集成级测试平台最好选择此结构。当然还有更多类型的结构可以满足重用的要求,这里也不再赘述。
III. 动态基址
Design可以指定一个配置寄存器的偏址以及一组寄存器的基址。UVM也提供了相应的配置。
A.更改一个配置寄存器的偏址
函数uvm_reg_map :: m_set_reg_offset()用于完成这项功能。它有三个参数。第一个是待更改偏移量的寄存器。第二个是新的偏移量。第三个参数表示这个寄存器是否应该取消映射。
B.更改寄存器映射函数的基址
函数uvm_reg_map :: set_base_addr()用于完成这项功能。它只有一个参数,即寄存器映射的新偏移量。一旦更改,添加到此映射的所有寄存器将同时更改其地址。
IV. indirect寄存器
在图1中,“(a)indirect”表示可通过位于“top”地址空间的数据/索引寄存器访问的“internal”地址空间。位于“internal”地址空间中的所有寄存器都是indirect寄存器。 UVM包含indirect数据寄存器的实现及设计模式,但在集成级测试平台上,实现起来有一定困难。
首先,它要求indirect寄存器与indirect数据/索引对在同一寄存器映射中。当设计需要一个IP(一个寄存器映射)中的indirect寄存器、以及另一个IP(另一个寄存器映射)中的indirect数据/索引对时,UVM indirect数据寄存器就不支持了。 第二,它要求indirect寄存器的偏址是连续的,并且要从0开始。第三,添加更多的数据/索引对时很不方便。每个数据/索引对都需要一个专用的寄存器映射。如果IP寄存器模型不提供任何额外的寄存器映射或数据/索引对,则在集成级别添加数据/索引对就比较麻烦了。集成级测试需要一个更通用的indirect寄存器解决方案。常用的解决方案是使用“internal”地址映射提供的地址信息定义实现indirect访问的用户注册表。此用户注册表命名为proxy_map。图5是用于proxy_map和用法的代码。图6说明了proxy_map的工作原理。 Proxy_map是indirect寄存器的本地映射。当proxy_map被指定为要在注册表访问中使用的映射时,该访问请求将被传递给proxy_map。然后proxy_map从indirect空间中的寄存器地址计算索引,并启动对数据/索引对的访问。
对于上面的实现过程,由于数据/索引对与indirect寄存器分开,因此它们可以在不同的寄存器映射中, 因此,上述第一个难题得到解决。 对indirect寄存器的偏移量没有限制,因为寄存器映射支持任意的偏移量,第二个难题也解决了。 最后,添加新的数据/索引对只需要一个新的proxy_map。 第三个难题也解决了。
V. ALIAS寄存器
在集成级,设计可以指定可以在同一地址空间中从两个或多个地址范围访问同一段配置寄存器。图1显示了3个例子 - (b0),(b1)和(b2)。对于这些地址,除了一个主地址范围,其他地址范围都是alias。alias寄存器应被声明为独立寄存器,并且回调值同步,其复杂度主要来自于UVM寄存器映射。 UVM寄存器模型通过寄存器映射之间的父子关系表示地址空间组合。从拓扑的角度来看,alias可以由较低级别的寄存器映射的多个父节点表示。 但UVM源代码的内联注释清楚地表明,不支持多个父节点。对此本文提出名为Replica_map的解决方案。它是用户定义的寄存器映射,如图7所示。
当指定访问IP寄存器以使用replica_map时,访问请求将被传递给replica_map。 然后,寄存器在alias地址范围内的偏移量由其在IP寄存器映射中的偏移量计算。图8显示了replica_map及其alias使用的代码。它是IP寄存器的本地映射。它具有代表IP地址空间的IP级别寄存器映射的句柄。其中函数offset_cal用于计算IP地址空间偏移中的alias偏移量,反之亦然。
在集成级别添加了Replica_map。 如果有更多的alias地址范围,只需为每个地址范围定义一个replica_map。
VI. 在其他地址空间中的duplication寄存器
集成级可能有多个地址空间,并且设计可以指定从所有地址空间访问相同的IP配置寄存器。图1,“(c)duplication”显示了这种拓扑关系。 UVM寄存器模型的标准实现是为每个集成级地址空间在IP级创建一组寄存器映射,并向每组映射添加寄存器。
在图9中,有两个集成级地址空间,由集成级寄存器映射A和B表示。IP只实现一个由IP寄存器映射表示的地址空间。 Replica_map是IP寄存器的本地映射,也是集成级寄存器映射B的子映射。这样的replica_map将IP寄存器复制到另一个地址空间。当指定IP寄存器的访问请求使用replica_map时,该请求将被传递给replica_map。 Replica_map从其main_map(其实际上是IP注册表)计算集成级寄存器映射B中寄存器的偏移量。 IP寄存器有效地复制到另一个地址空间。在集成级别添加了Replica_map。如果有更多的地址空间,只需为每个新地址空间再创建一个。当将寄存器复制到另一个地址空间时,replica_map的使用模型遵循原始的UVM寄存器模型。 前面列出的对于寄存器的所有要求,这里都满足。
图十代码显示了这种用法
VII.总结
集成级UVM寄存器模型都使用IP级寄存器模型作为子寄存器块。本文提出的方法,通过用户定义的寄存器映射(即proxy_map和replica_map),可以提供3种常见类型的寄存器地址空间组合 - alias, duplication和 indirection。解决了UVM寄存器模式的缺陷。为squence和测试平台组件保留相同的编程接口。不需要更改UVM package。IP级的寄存器模型也不需要更改。满足前文第一部分所列举的集成寄存器模型的需求。而且可复用非常高,对于项目的开发是效率提高十分有利的,是一种十分值得借鉴的方法。

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-25 09:33 , Processed in 0.016031 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部