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

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

日志

[彩虹糖带你入门UVM] 第4节 UVM基础之Virtual Sequence和Configuration——彩虹糖出新 ...

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

rockeric.com

柠檬口味和椰子口味的彩虹糖混合在一起可以产生柠檬蛋白派(lemonmeringue pie)的味道,草莓和香草口味的彩虹糖混合在一起可以产生草莓酥饼(strawberry shortcake)的味道。组合不同口味的彩虹糖居然可以产生如此多的奇特口味,不得不说很是期待呀。本小节就将会引入virtual sequence,帮助我们在彩虹糖工厂中创造出更多口味独特的彩虹糖。

另外本小节还会引入Configuration的概念,介绍如何在顶层去配置整个验证环境,从而相应地更改验证环境的结构,进而描述Configuration的产生,传送,接收以及生效的整个过程。利用Configuration机制我们可以根据彩虹糖新口味的需求,快速更改我们彩虹糖工厂的结构和生产流程,创造出新的独特口味的彩虹糖,而不需要重新构建新的工厂

上一篇主要介绍了UVM验证环境中的uvm_subscriberuvm_scoreboard以及整个验证环境uvm_env。还介绍了构造测试场景的测试用例uvm_test,以及我们的验证顶层top。以下是上一篇短文中主要介绍的内容。

subscriber:class jelly_bean_fc_subscriber extends uvm_subscriber#(jelly_bean_transaction);class jelly_bean_sb_subscriber extends uvm_subscriber#(jelly_bean_transaction);scoreboard:class jelly_bean_scoreboard extends uvm_scoreboard;env:class jelly_bean_env extends uvm_env;test:class jelly_bean_test extends uvm_test;top:module top;

一、验证平台结构图

如图4.1所示,是更新之后的验证平台结构图。本节中的DUT即我们的彩虹糖评测员升级为可以同时评估两种口味的彩虹糖了。新的彩虹糖评测员也更名为jelly_bean_taster_subsystem,该DUT具有两个相同的interface: jelly_bean_if用来接受彩虹糖工厂生产出来的彩虹糖。为了供给彩虹糖评测员,彩虹糖工厂还新增加了一个小“车间”Agent来生产彩虹糖。为了协调两个彩虹糖车间,创造出更多独特口味的彩虹糖,彩虹糖工厂随之引入了Virtual Sequence: jelly_bean_recipe_virtual_sequence来控制彩虹糖的口味。

具体来说:

  • 测试的顶层是uvm_testjelly_bean_recipe_testTEST中例化了整个UVM测试环境,预留了uvm_config_db机制来对整个UVM环境ENV和各个Agent进行配置,引入了jelly_bean_recipe_virtual_sequence来构造测试场景。

  • ENV中创建了两个jelly_bean_agent分别通过jelly_bean_if去驱动jelly_bean_taster_subsystem

  • 两个jelly_bean_agent完全一致,都具有自己的monitorsequencerdriver以及subscriber。除此之外,每个agent还具有控制自身结构的配置文件jelly_bean_agent_config,外部可以通过更改这个config文件来控制agent的结构,提高了验证平台的复用性


4.1 彩虹糖工厂验证平台结构图。


二、Virtual Sequence

Virtual Sequence定义了三种新彩虹糖口味的配方,分别是柠檬蛋白派(lemonmeringue pie)口味,草莓酥饼(strawberry shortcake)口味,苹果蜜饯(candy apple)口味。每种新口味的配方都是由两种原始口味的彩虹糖配方混合而成的。比如要生产出柠檬蛋白派口味的彩虹糖需要两份柠檬味的彩虹糖和两份椰子味的彩虹糖。自然而然新的配方Virtual Sequence就是由两个基本的原始彩虹糖配方same_flavored_jelly_beans_sequence构成。两个基本的彩虹糖配方被称为sub-sequences。具体的实现代码如代码4.1所示。

  • 2行:定义了三种新口味的配方名称,注释表明了该新口味的具体构成。

  • 89行:声明了两个jelly_bean_sequencer句柄,用以把构成新口味的两种基本彩虹糖配方即same_flavored_jelly_beans_sequence传送给相应的driver去生产所需的原生口味的彩虹糖。

  • 1112行:声明了两个sub-sequence: same_flavored_jelly_beans_sequence分别代表了两种基本口味的彩虹糖配方,用以构成新口味的彩虹糖。

  • 1920行:在virtual sequence中创建了组成新口味的两种基本口味彩虹糖的配方sub-sequence

  • 21行:利用case语句,根据每种新口味的配方,选择基本口味的彩虹糖,以及调整每种基本口味配方的数量。举例来说要构成草莓酥饼口味的彩虹糖,需要草莓口味的彩虹糖两份,香草口味的彩虹糖两份。

  • 4344行:通过预先声明的两个sequencer,同时将两个配置好的基本彩虹糖配方:jb_seq1jb_seq2发送给各个车间agent中的driver去生产对应基本口味的彩虹糖。


代码4.1 [class] jelly_bean_recipe_virtual_sequence的实现


  • [Note 1]virtual sequence的组成

    • virtual sequence主要由多个不同内容的sub-sequence构成,其通过组合不同的sub-sequence来构建更加复杂的测试场景。

    • virtual sequence中声明了多个sub-sequence对应的sequencer句柄,其选择采用start方式,分别通过相应的sequencer将多个sub-sequence发送出去。

    • 本文并未采用将整个virtual sequence挂载到virtual sequenecer的方式来发送,主要是考虑到virtual sequencer会引入一个不必要的UVM组件,影响整个UVM环境的复用性。


三、包含virtual sequencetest

TEST中主要完成了virtual sequence的创建和随机,并将virtual sequence中声明的sequencer句柄链接到构成UVM环境的真正sequencer上。如此virtual sequence中的jb_seq1就会挂载到jb_agent1中的sequencer上,而jb_seq2则会挂载到jb_agent2中的sequencer上。最后通过start方式触发virtual sequence的发送,注意virtual sequence本身没有挂载到一个具体的sequencer上,所以start函数中的sequencer参数值为NULL。如代码4.2所示,是test的具体实现。

  • 9行:声明了一个用来产生新口味的配方virtual sequence: jelly_bean_recipe_virtual_sequence

  • 12行:创建了该virtual sequence

  • 1314行:分别将virtual sequence中的两个sequencer句柄链接到了UVM环境中的两个agent中的sequencer上,用以完成两个基本sub-sequences的发送。

  • 15行:随机化已创建的virtual sequence,随机该virtual sequence中的配方种类,用以随机选择不同新口味的配方。

  • 16行:利用start方式触发该virtual sequence的发送。


代码4.2 [class] jelly_bean_recipe_test的实现


  • [Note 2]virtual sequencestart函数中sequencer参数为NULL

  • 由于virtual sequence没有一个sequencer可以挂载该sequence,所以sequencer参数为NULL

  • 调用start函数时并非真正的去发送该virtual sequence,而只是触发该virtual sequencebody()任务,从而触发其中各个sub-sequences的自行发送。


四、使用virtual sequence构成的test的运行结果

如图4.2所示,是该virtual sequence构建的测试场景,即利用该virtual sequence提供的新口味彩虹糖配方,彩虹糖工厂生产出来的新口味彩虹糖。


4.2 包含virtual sequencetest的运行结果


具体来看,该virtual sequence随机生成的是一个苹果蜜饯口味(candyapple)彩虹糖的配方。可以看出构成新口味的一个基本配方是苹果口味(apple)的彩虹糖,其份数是2份。另一个基本配方是肉桂口味(cinnamon)的彩虹糖,其份数是1份,符合我们的配方要求


五、Configuration

新的彩虹糖工厂中有两种配置信息jelly_bean_agent_configjelly_bean_env_configagent_config主要来配置彩虹糖工厂中的Agent小车间:jelly_bean_agent,影响Agent的结构和功能,我们可以通过agent_config来决定Agent是否包含monitordriverfc_subscriber等组件env_config主要来配置整个UVM验证环境jelly_bean_env的结构,可以通过env_config来决定验证环境中agentscoreboard的数量


六、agent的配置(agent configuration

jelly_bean_agent_config主要来配置jelly_bean_agentagent_config中有两个配置开关:activehas_jb_fc_sub

active配置决定agent是一个active模式还是一个passive模式。在active模式下,会在agent(jelly_bean_agent)中额外创建sequencer(jelly_bean_sequencer)driver(jelly_bean_driver),但是若agent被配置为passive模式,agent中只会包含一个monitor(jelly_bean_monitor)不会再额外创建sequencerdriver

has_jb_fc_sub配置决定是否会在agent中创建一个功能覆盖率收集组件jelly_bean_fc_subscriber

配置文件中还包含一个virtual interface句柄virtual jelly_bean_if,用来向monitordriver中传递virtual interface句柄。具体的实现如代码4.3所示。

  • 4行:创建了一个uvm_active_passive_enum枚举类型的变量active,并将其赋初值为UVM_ACTIVE。默认将agent配置成active模式,在其中创建除monitor外的driversequencer

  • 5行:创建了一个bit类型的变量has_jb_fc_sub,并将其赋初值为1。默认在agent中创建功能覆盖率收集组件jelly_bean_fc_subscriber

  • 7行:创建了一个virtual jelly_bean_if的句柄jb_if,便于后续virtual interface的传递。


代码4.3 [classjelly_bean_agent_config的实现


根据agent中的配置信息,agent可以被配置成如下4种结构的agent。如图4.3所示


4.3 agent4种可能配置结构图


七、验证环境的配置(Environment Configuration

agent的配置文件jelly_bean_agent_config相类似,UVM验证环境的配置jelly_bean_env_config会影响jelly_bean_env的结构env_config设计了4个配置开关,并且还分别为两个agent创建了一个agent_config配置信息的句柄。4个配置开关has_jb_agent1has_jb_agent2has_jb_sb1has_jb_sb2分别决定UVM验证环境uvm_env中是否包含1jelly_bean_agent2jelly_bean_agent1jelly_bean_scorboard以及2jelly_bean_scorboardagent_config的具体实现如代码4.4所示。

  • 45行:分别创建了一个bit类型的变量has_jb_agent1has_jb_agent2并分别将其赋初值为1,表明jelly_bean_env中默认包含1号和2jelly_bean_agent

  • 67行:分别创建了一个bit类型的变量has_jb_sb1has_jb_sb2并将其分别赋初值为1,表明jelly_bean_env中默认包含1号和2jelly_bean_scoreboard

  • 910行:分别声明了两个jelly_bean_agent的配置信息句柄jb_agent_cfg1jb_agent_cfg2,便于后续在ENV中对agent进行配置。


代码4.4 [classjelly_bean_env_config的实现


八、验证顶层模块(Top Module

验证顶层对整个验证环境的配置主要在于interface的传递Top模块中例化了两个jelly_bean_if,用来连接DUT(jelly_bean_subsystem)和整体验证环境。同时将这两个interfacejb_if1jb_if2通过uvm_config_db::set的方式以virtual interface的形式存储在uvm_config_db库中,以便于后续在其他UVM验证组件中读取。具体的实现如代码4.5所示。

  • 17-20行:将interfacevirtuali nterface的形式存储在了uvm_config_db库中,便于monitordriver来调用,来监测和驱动DUTENV的数据传输。由于topmodule是一个verilog模块并非一个uvm_component。所以set()函数中的cntx参数是NULL。而run_test()任务会创建uvm_test_top实例,所以inst_name参数是uvm_test_top


代码4.5 [moduletop的实现


九、基础测试用例(BaseTest

本文验证环境的配置主要发生在base testBase Test中创建了配置ENVjelly_bean_env_config以及两个配置Agentjelly_bean_agent_config。并将jelly_bean_agent_config的句柄传递给了env_config的配置信息中,这样就可以在ENV的配置信息中索引到下层Agent的配置信息。最后将保存有ENV配置信息的jelly_bean_env_config通过uvm_config_db::set的方式存储在uvm_config_db库中,便于整体验证环境jelly_bean_env在构建自身的时候索引到该配置信息,并根据配置信息来创建ENV

另外Base Test还会以uvm_config_db::get的方式,从uvm_config_db库中读取在TopModule中上传的两个virtual interface,并将其赋给相应的Agent配置信息。具体的实现如代码4.6所示。

  • 16-18行:分别创建ENV的配置文件和两个Agent的配置文件。

  • 20-27行:利用uvm_config_db::get()uvm_config_db库中读取virtual interface: jb_if1jb_if2,并将其分别赋值给两个agent_config中的jelly_bean_if,完成了interfacetopmoduleagentcomponent的传递。

  • 29-30行:分别将创建的Agent的配置文件的句柄赋给ENV配置文件中定义的jb_agent_cfg1jb_agent_cfg2,使得我们可以从jb_env_cfg中读取到各个Agent的配置信息。

  • 32-33行:将已经创建好的ENV的配置信息,通过uvm_config_db::set()的形式,存储到uvm_config_db库中,便于jelly_bean_env在建立自身内部结构的时候读取ENV的配置信息,并按配置信息创建jelly_bean_env中的各个组件。


代码4.6 [classjelly_bean_base_test的实现


十、UVM验证环境(Environment

UVM验证环境jelly_bean_env会先读取上层testENV的配置信息,根据配置信息在build_phase中创建ENV内部的各个组件。如果ENV的配置信息里面表明jelly_bean_env中需要创建1号或者2Agent,则就在ENVbuild_phase中创建相应的Agent,并将相应Agent的配置信息通过uvm_config_db::set()的方式上传到uvm_config_db库中,便于Agent在创建自身的时候读取该配置信息,并根据配置信息创建其内部相应的组件。

最后connect_phase中根据配置信息完成各个AgentScoreboard的连接。具体的实现如代码4.7所示。

  • 17-20行:从uvm_config_db库中,使用get()方式读取ENV的配置信息jb_env_cfg

  • 22-40行:根据获取的配置信息jb_env_cfg,创建内部的各个组件进而构成整个jelly_bean_env

  • 22-25行:创建jelly_bean_agent。如果jb_env_cfg中的配置开关has_jb_agent11,表明需要在ENV中创建1Agent。则先将1Agent的配置信息jb_agent_cfg1使用uvm_config_db::set()的方式上传到uvm_config_db库中,然后再实际创建1Agentjb_agent1

  • 27-29行:创建jelly_bean_scoreboard。如果jb_env_cfg中的配置开关has_jb_sb11,表明需要在ENV中创建1Scoreboard。则使用type_id::create的方式实际创建1Scoreboardjb_sb1

  • 47-48行:根据ENV的配置信息,连接我们的AgentScoreboard。如果配置信息中has_jb_agent1has_jb_sb1都为1,表明ENV中会创建相应的AgentScoreboard,则相应地需要在connect_phase中连接这两个组件的TLM通信端口。


代码4.7 [classjelly_bean_env的实现


十一、Agent

Agent根据上层ENV对其设计的配置信息来创建自身的结构。具体的实现如代码4.8所示。

  • 19行:利用uvm_config_db::get()的方式从uvm_config_db库中读取Agent的配置信息。

  • 24-27行:如果Agent的配置信息中active配置开关为UVM_ACTIVE,表明该Agentactive模式。则为其创建相应的jelly_bean_sequencerjelly_bean_driver

  • 29-31行:如果Agent的配置信息中has_jb_fc_sub的配置开关为1,表明该Agent中含有功能覆盖率收集组件jelly_bean_fc_subscriber。则为其实际创建相应的subscriber组件。

  • 42-45行:如果Agent被配置成active模式,必然有SequencerDriver,则相应地需要在connect_phase中完成SequencerDriver的连接。

  • 47-49行:如果Agent被配置成具有jelly_bean_fc_subscriber,则也需要相应地在connect_phase将其和monitor连接起来,才能完成功能覆盖率的收集。

代码4.8 [classjelly_bean_agent的实现


十二、配置信息在整个验证环境中的流动

如图4.4所示,表示了各个配置信息包括virtual interfacejb_ifENV的配置信息:jb_env_cfgAgent的配置信息:jb_agent_cfg在整个验证环境中的产生,传递过程。


4.4 配置信息在验证环境中的流动


virtual interfacejb_if为例来说明此图。

jb_if首先在top中创建,并被上传到uvm_config_db中,如虚箭头setjb_if所示。然后被读取到jelly_bean_agent_cfg中,如图中虚箭头get jb_if所示。所以可以看出jb_iftop module中产生,继而被存储到uvm_config_db中,然后从uvm_config_db中读取出来赋给jelly_bean_agent_cfg供其使用。

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

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

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

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


点赞

评论 (0 个评论)

facelist

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

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

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

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

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

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

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