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

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

日志

[彩虹糖带你入门UVM] 第3节 验证组件之Environment——彩虹糖工厂的全貌 ...

已有 2814 次阅读| 2019-5-29 10:24 |个人分类:验证系统思想|系统分类:芯片设计| UVM

这一篇主要为大家介绍验证环境中的信息收集组件uvm_subscriber,数据结果比较组件(计分板)uvm_scoreboardUVM环境uvm_env,测试用例uvm_test,配置验证环境的configuration以及验证顶层top,最后还将会给出一个仿真的结果。其在整个UVM验证平台中的结构如图3.1中的红色箭头所示。


3.1 UVM验证平台整体结构


上一篇短文主要介绍了彩虹糖验证平台中的SequencerDriverMonitorAgent。以下是上一篇短文中主要介绍的类。

  • sequencer

class jelly_bean_sequencer extends uvm_sequencer#(jelly_bean_transaction);

  • driver

class jelly_bean_driverextends uvm_driver#(jelly_bean_transaction);

  • monitor

class jelly_bean_monitor extends uvm_monitor;

  • agent

class jelly_bean_agent extends uvm_agent;

 

一、功能覆盖率收集组件(function coverage subscriber

功能覆盖率组件jelly_bean_fc_subscriber会对产生的彩虹糖作一个整体的记录。如第21行所示,jelly_bean_fc_subscriberwirte函数中对从monitor中传递过来的transaction进行采样从而判断各种属性例如口味,颜色,甜度,酸度的彩虹糖是否都有产生,以及不同属性组合的彩虹糖是否也都有产生。如代码3.1所示,是jelly_bean_fc_subscriber的实现。

  • 7-10行:利用coverpoint建立功能覆盖率,分析彩虹糖的口味,颜色,甜度,酸度,确保各种属性的彩虹糖是否都有产生。

  • 11行:利用cross来建立功能覆盖率,分析彩虹糖各种属性的不同组合情况是否都有产生。

  • 19行:定义uvm_subscriber中的成员方法write函数,在write函数中进行功能覆盖率的采样。使得jelly_bean_fc_subscriber通过TLM端口和jelly_bean_monitor相连接之后可以使用monitor检测到的彩虹糖信息来判断各种属性的彩虹糖是否都有产生。

  • 21行:触发功能覆盖率的采样行为。



代码3.1 [classjelly_bean_fc_subscriber的实现


二、记分板(scoreboard

数据收集组件uvm_subscriber内设计了write函数和一个TLM端口analysis_export用来完成uvm_subscriber和其他组件之间数据的通信传输。uvm_subscirber的主要功能就是在write函数中体现的。在功能覆盖率收集组件jelly_bean_fc_subscriber中的write函数中触发功能覆盖率的采样,同样的记分板数据收集组件(scoreboardsubscriber)会在其write函数中调用jelly_bean_scoreboardcheck_jelly_bean_taste函数来检查收集到的彩虹糖信息。check_jelly_bean_taste主要来检查DUT即我们的彩虹糖评测员(jelly_bean_taster)的反馈信息是否正确jelly_bean_sb_subscriber的实现如代码3.2所示。

  • 10-15行:定义write函数,在write函数中调用jelly_bean_scoreboardcheck_jelly_bean_taste函数。当jelly_bean_sb_subscriberjelly_bean_monitor之间的TLM端口连接好之后便可以在monitor一侧调用该write函数,对monitor监测到的彩虹糖信息进行检查。


代码3.2 [classjelly_bean_sb_subscriber的实现

 

  • [Note 1]为什么需要一个$cast?

  • 11行只声明了jb_sbjelly_bean_scoreboard类型,而未对其赋值,所以jb_sbNULL值,无法索引到check_jelly_bean_taste函数。

  • 13m_parent是每一个uvm_component所具有的。其是一个uvm_component类型,指向了一个子类对象jelly_bean_scoreboard。由于jb_sbjelly_bean_scoreboard类型,所以把父类句柄复制给子类句柄时使用$cast来转换,使得jb_sb也可以指向jelly_bean_scoreboard对象,进而索引到check_jelly_bean_taste函数并完成预期的检查功能。


我们通过check_jelly_bean_taste函数来检查monitor监测到的信息是否正确。我们期望DUT即我们的彩虹糖评测员,收到酸的巧克力口味的彩虹糖时会表现出负面评价,收到其他口味的彩虹糖时都给出积极的评价。通过对比DUT的反馈信息和监测到的彩虹糖信息来判断彩虹糖评测员是否给出了正确的评价。如果DUT评价正确,彩虹糖的口味和颜色信息都会被打印出来。当DUT评价错误,错误指示信息会被打印出来。如代码3.3所示是jelly_bean_scoreboard的具体实现。

  • 4行:在jelly_bean_scoreboard中声明一个uvm_analysis_export用来和jelly_bean_sb_subscriber中的analysis_export相连接进行TLM通信,传输jelly_bean_transaction

  • 14行:在jelly_bean_scoreboard中创建了jelly_bean_sb_subscriber

  • 19行:在jelly_bean_scoreboard中将创建的uvm_analysis_exportsb_subscriber中的analysis_export连接起来,进行通信。

  • 21-41行:定义check_jelly_bean_taste函数,实现具体的检查行为。其中定义了一个uvm_table_printer来对jelly_bean_transaction中的内容进行规范化的打印。


代码3.3 [classjelly_bean_scoreboard的实现


  • [Note 2] 为什么jelly_bean_scoreboard中使用uvm_analysis_export而不是uvm_analysis_imp?

  • jelly_bean_scoreboard并不是TLM通信的终点,Monitor监测到的数据需要经过jelly_bean_scoreboard送给jelly_bean_sb_subscriber去做检查,所以jelly_bean_sb_subscriber才是信息传送的终点,其内部的端口才是uvm_analysis_imp

  • uvm_subscriber作为jelly_bean_fc_subscriberjelly_bean_sb_subscriber的基类,其预定义有一个analysisimport被称为analysisexportuvm_analysis_imp#(T, class_name) analysis_export

  • 所以jelly_bean_scoreboard中是uvm_analysis_exportjelly_bean_sb_subscriber中是uvm_analysis_imp

 

三、UVM环境(Environment

UVM环境包含了所有创建的验证组件,并在其中完成了各个组件之间的通信端口的连接UVM环境的具体实现如代码3.4所示。

  • 14-16行:在env中创建了构建环境的各个组件,包括jelly_bean_agentjelly_bean_fc_subscriberjelly_bean_scoreboard

  • 21-22行:将jelly_bean_agent中的uvm_analysis_port分别与功能覆盖率收集组件jelly_bean_fc_subscriber和记分板jelly_bean_scoreboard中的analysis_export相连接。便于monitor将监测到的jelly_bean_transaction分别送去分析功能覆盖率以及判断DUT的反馈是否正确。


代码3.4 [classjelly_bean_env的实现

 

四、测试用例(Test

以下测试用例表示的是让彩虹糖工厂生产若干礼品盒装的无糖彩虹糖。该测试用例的具体实现如代码3.5所示。

  • 19行:使用set_type_override将所有jelly_bean_transaction替换成了sugar_free_jelly_bean_transaction,这样彩虹糖工厂生产出来的彩虹糖都是无糖的。

  • 20行:在测试用例中创建整个UVM环境jb_env

  • 10-22行:为测试用例build_phase的部分。在该build_phase主要完成UVM环境配置文件的传递和基础transaction类型的替换即直接使用无糖彩虹糖配方,最后完成整个UVM环境的创建。

  • 28行:创建一个礼品盒装的彩虹糖配方即产生一个gift_boxed_jelly_beans_sequence

  • 29行:随机礼品盒装彩虹糖的配方内容。

  • 31行:使用start方式将sequence交由sequencer发送出去。

  • 2733行:使用objection机制来控制仿真的停止。在第27行提起一个objection防止仿真结束,在第33行在发送完sequence之后等待10ns撤销objection允许仿真结束。

  • 24-34行:为测试用例的run_phase部分。主要完成sequence的创建,随机和发送。


代码3.5 [classjelly_bean_test的实现


五、配置(configuration

将控制验证平台的各种参数集合在一起构成一个配置块,然后在创建验证平台之前将配置信息传递下去,这样就可以很方便地根据实际情况来配置整个验证平台。如代码3.6所示,是配置块的实现。在本文中,该配置块没有产生任何作用,仅仅是为了方便后续验证平台的复用


代码3.6 [class] jelly_bean_configuration的实现


六、顶层(Top

建立好测试用例,搭建好UVM环境之后,还需要建立一个Top模块,在其中例化待测设计,传递interface从而将硬件形式的待测设计和软件形式的验证平台连接起来以及通过run_test来启动uvm仿真。如代码3.7所示是Top模块的具体实现。

  • 5行:例化一个具有某一时钟频率的interface

  • 6行:例化待测设计,并使用interace将其和验证平台连接起来。

  • 8-12行:产生时钟,为待测设计和验证平台提供100M频率的时钟。

  • 15-16行:使用uvm_config_db,以virtualinterface的形式将interface传递给验证环境中的各个组件,比如monitordriver使得其分别可以监测接口上的信号值以及通过接口驱动待测设计。

  • 17行:使用run_test()来启动UVM仿真。


代码3.7 [moduletop的具体实现


七、仿真(Simulation

如图3.1所示,是运行jelly_bean_testEDA工具打印出来的部分log。可以看出整个UVM验证平台功能正常,DUT即彩虹糖评测员反馈的信息正确无误。


3.2 仿真部分log


八、总结

我们按照开头的图3.1所示的结构搭建了整个UVM验证平台。在前几节,描述了UVM的基本运行过程,简单介绍了其中的一些运行机制。接下来的小节将会更深入的介绍一些例如virtual sequence等的UVM细节。


[彩虹糖带你入门UVM] 第0节 概述

[彩虹糖带你入门UVM] 第1节 验证组件之接口

[彩虹糖带你入门UVM] 第2节 验证组件之Agent ——彩虹糖工厂的小车间



点赞

评论 (0 个评论)

facelist

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

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

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

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

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

GMT+8, 2024-3-29 21:12 , Processed in 0.020163 second(s), 12 queries , Gzip On, Redis On.

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