您的位置:首页 > 产品设计 > UI/UE

UVM糖果爱好者教程 - 7.虚拟序列

2018-03-30 16:34 351 查看
你知道如果将两个柠檬和两个椰子混合,jelly beans会产生柠檬酥皮派的味道吗?而两种草莓和两种香草的混合,jelly beans会产生草莓脆饼的味道?这篇文章将提供关于创建这些新jelly beans食谱的虚拟序列的解释。

Overview

第一个图显示了本文中使用的验证组件的关系。前一篇文章中的jelly_bean_taster(DUT)是“增强的”,通过两个jelly_bean_ifs同时接受两种jelly-bean的风味。这个新的DUT被称为jelly_bean_taster_subsystem。为了驱动两个接口,使用两个jelly_bean_agent实例。 jelly_bean_recipe_virtual_sequence协调创建jelly-bean的风味,以创造出新的风味。页面底部的第二个图显示了类图中的验证组件,第三个图显示了类图中的验证对象。



Virtual Sequence

虚拟序列在第二行定义了三个新的jelly-bean食谱(LEMON_MERINGUE_PIE,STRAWBERRY_SHORTCAKE和CANDY_APPLE)。每个配方需要两种jelly-bean味。例如,要创建LEMON_MERINGUE_PIE配方,需要两个LEMON jelly beans和两个COCONUT jelly beans。创建两个子序列(same_flavored_jelly_beans_sequence)(第19行)以生成两种风味。 21行的case语句根据食谱准备了两种 jelly-bean味道。在body task末尾,两个子序列并行启动(第42行)。class jelly_bean_recipe_virtual_sequence extends uvm_sequence#( uvm_sequence_item );
typedef enum bit[1:0] { LEMON_MERINGUE_PIE, // 2 LEMON + 2 COCONUT
STRAWBERRY_SHORTCAKE, // 2 STRAWBERRY + 2 VANILLA
CANDY_APPLE // 2 APPLE + 1 CINNAMON
} recipe_e;
rand recipe_e recipe;

jelly_bean_sequencer jb_seqr1;
jelly_bean_sequencer jb_seqr2;

same_flavored_jelly_beans_sequence jb_seq1;
same_flavored_jelly_beans_sequence jb_seq2;

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

task body();
jb_seq1 = same_flavored_jelly_beans_sequence::type_id::create( .name( "jb_seq1" ), .contxt( get_full_name() ) );
jb_seq2 = same_flavored_jelly_beans_sequence::type_id::create( .name( "jb_seq2" ), .contxt( get_full_name() ) );
case ( recipe )
LEMON_MERINGUE_PIE: begin
jb_seq1.flavor = jelly_bean_transaction::LEMON;
jb_seq2.flavor = jelly_bean_transaction::COCONUT;
jb_seq1.num_jelly_beans = 2;
jb_seq2.num_jelly_beans = 2;
end
STRAWBERRY_SHORTCAKE: begin
jb_seq1.flavor = jelly_bean_transaction::STRAWBERRY;
jb_seq2.flavor = jelly_bean_transaction::VANILLA;
jb_seq1.num_jelly_beans = 2;
jb_seq2.num_jelly_beans = 2;
end
CANDY_APPLE: begin
jb_seq1.flavor = jelly_bean_transaction::APPLE;
jb_seq2.flavor = jelly_bean_transaction::CINNAMON;
jb_seq1.num_jelly_beans = 2;
jb_seq2.num_jelly_beans = 1;
end
endcase // case ( recipe )
`uvm_info( get_name(), { "\n", this.sprint() }, UVM_LOW )
fork
jb_seq1.start( .sequencer( jb_seqr1 ), .parent_sequence( this ) );
jb_seq2.start( .sequencer( jb_seqr2 ), .parent_sequence( this ) );
join
endtask: body

`uvm_object_utils_begin( jelly_bean_recipe_virtual_sequence )
`uvm_field_enum ( recipe_e, recipe, UVM_ALL_ON )
`uvm_field_object( jb_seq1, UVM_ALL_ON )
`uvm_field_object( jb_seq2, UVM_ALL_ON )
`uvm_object_utils_end
endclass: jelly_bean_recipe_virtual_sequence

Test

jelly_bean_recipe_test类创建上述虚拟序列。首先,测试将两个jelly_bean_sequencer分配给虚拟序列(第13行和第14行)。通过这样做,子序列jb_seq1将在代理#1中的序列发生器(sequencer)上运行,而子序列jb_seq2将在代理#2中的序列发生器上运行。该测试将随机化虚拟序列并在第15行和第16行上启动序列。请注意,由于没有与虚拟序列关联的序列发生器,因此启动任务的sequencer参数为空。class jelly_bean_recipe_test extends jelly_bean_base_test;
`uvm_component_utils( jelly_bean_recipe_test )

function new( string name, uvm_component parent );
super.new( name, parent );
endfunction: new

task main_phase( uvm_phase phase );
jelly_bean_recipe_virtual_sequence jb_vseq;

phase.raise_objection( .obj( this ) );
jb_vseq = jelly_bean_recipe_virtual_sequence::type_id::create( .name( "jb_vseq" ), .contxt( get_full_name() ) )
4000
;
jb_vseq.jb_seqr1 = jb_env.jb_agent1.jb_seqr;
jb_vseq.jb_seqr2 = jb_env.jb_agent2.jb_seqr;
assert( jb_vseq.randomize() );
jb_vseq.start( .sequencer( null ) );
#100ns ;
phase.drop_objection( .obj( this ) );
endtask: main_phase
endclass: jelly_bean_recipe_test

Simulation

让我们运行一个仿真来看看虚拟序列产生的新味道。在我的例子中,这个序列产生了一个CANDY_APPLE配方。它依次使第一个序列(jb_seq1)生成两个APPLE果冻豆,并使第二个序列(jb_seq2)生成一个CINNAMON果冻豆。UVM_INFO jb.sv(266) @ 0: reporter@@jb_vseq [jb_vseq]
------------------------------------------------------------------------------------
Name Type Size Value
------------------------------------------------------------------------------------
jb_vseq jelly_bean_recipe_virtual_sequence - @1196
recipe recipe_e 2 CANDY_APPLE
jb_seq1 same_flavored_jelly_beans_sequence - @1200
num_jelly_beans integral 32 'h2
flavor jelly_bean_transaction::flavor_e 3 APPLE
req object -
rsp object -
jb_seq2 same_flavored_jelly_beans_sequence - @1204
num_jelly_beans integral 32 'h1
flavor jelly_bean_transaction::flavor_e 3 CINNAMON
req object -
rsp object -
depth int 32 'd1
parent sequence (name) string 0 ""
parent sequence (full name) string 0 ""
sequencer string 0 ""
req object -
rsp object -
------------------------------------------------------------------------------------                                


                                                                        Component Class Diagram



                                        Object Class Diagram

我希望这篇教程能帮助你理解虚拟序列。哦,对于那些对更多jelly-bean食谱感兴趣的人,请咨询本网站。
github获取源码





EDA Playground上查看或者运行代码



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uvm virtual sequence