UVM Sequence

本文详细介绍了如何在UVM中利用HierarchicalSequence构建复杂的测试序列。通过将任务模块化,实现代码复用、易于维护和调试。以ambaAHB协议为例,展示了如何基于基础操作如write和read创建不同层级的序列。文中还阐述了root_seq与sub_seq的区别,并通过一个具体的例子说明了sequence的执行流程和线程交互。
摘要由CSDN通过智能技术生成

UVM Hierarchical Sequence

VIP中通常给颗粒度最小的task,需要自己继承于based_sequence,写颗粒度最小的sequence,然后,复杂的激励场景top_seq中body中进行颗粒度最小的sequence的声明及调用。

处理复杂度高的事务的方法是把其模块化并将其添加到对象管理进程中。有以下好处:

  1. 代码复用
  2. 易于维护
  3. 容易debug
  4. 易于控制复杂场景生成

结合编码规则理解:Top-level sequence 被分解为子sequence,子的sequence又可以被分解为更基础的sequence。
在这里插入图片描述

由一简单协议引起的思考:
例子: amba ahb协议中,有两个基础操作writeread。AHB_BASE_WRITE, AHB_BASE_READ是颗粒度最小的sequence。基于这两个最小颗粒度的sequence,更高一层级的sequence中可能含有n次 AHB_BASE_WRITE或n次AHB_BASE_READ,分别称为:AHB_LOOP_WRITE和AHB_LOOP_READ。Top_level sequence WRITE_FOLLOWED_BY_READ中含有x个AHB_LOOP_READ及m个AHB_LOOP_WRITE,且有一定时序。

root_sequence & sub_sequence

  1. 大多数时候,top_seq充当root_seq。某些情况下,一个sequence可能启动另一个sequence作为root_seq。所以,按此划分:有且只有一个root_seq和一些sub_seq。两者区别是:sub_seq有父seq,而root_seq没有父seq。
  2. 含有父seq的sequence往往会影响测试seq处理正在运行的seq的方式。例如,如果当前运行的序列是含有sub_seq的直接父seq或远父seq,则sequencer需要接受sub_Seq中的item。
  3. sequencer 默认总是先获取root_seq。
  4. root_seq启动自己的执行线程,而sub_seq通常在父seq的执行线程中启动。但这并非充分条件。比如:
    a. 假设序列S1以root_seq的形式在其执行线程中启动另一个序列S2,则序列S2将不会授权予序列S1(例如,与seqr的交互目前被S1捕获),必须等待S2完成后才能继续。
    b. 另一方面,如果序列S1在其执行线程中启动了两个并行子序列S2 & S3(通过使用fork…join语句),那么子序列S2 & S3将获得父序列S1的授权。(整个过程的完成采用raise & drop objections)。

example

// Transaction Item /
class packet extends uvm_sequence_item;
 `uvm_object_utils(packet)
 
 // Constructor
 function new (string name);
 super.new(name);
 endfunction: new
 
 // Packet properties
 rand byte payload;
 
endclass: packet

/// Sequencer Declaration /
typedef uvm_sequencer #(packet) my_sequencer;

// Flat Sub-Sequence Declaration ///
class flat_sub_seq extends uvm_sequence #(packet);
 `uvm_object_utils(packet)
 
 // Sub-Sequence Properties
  rand byte payload;
  rand int count;
  constraint c {payload < 10;}
 
 // Constructor
 function new (string name);
  super.new(name);
 endfunction: new
 
 // Body Task
 virtual task body();

  packet pkt;

 `uvm_do_with(pkt, {payload == default_payload;})
  repeat (count)
 `uvm_do(pkt)

 endtask: body

 endclass: flat_sub_seq
 
// Hierarchical Top-level Sequence //
class hier_top_seq extends uvm_sequence #(packet);
 `uvm_object_utils(hier_top_seq)
 
 // Constructor
 function new (string name);
 super.new(name);
 endfunction: new
 
 // Body Task
 virtual task body();
  
  packet pkt;
  flat_sub_seq fss;
 
 `uvm_do(pkt)
 `uvm_do(fss)
 `uvm_do_with(fss, {payload == 6 && count == 5;})

 endtask: body
 
endclass: hier_top_seq
 
 Test To Start Hierarchical Top-level Sequence 
class test_hier_seq extends uvm_test;
 `uvm_component_utils(test_hier_seq)
 
 // Constructor
 function new (string name, uvm_component parent);
  super.new(name, parent);
 endfunction: new
 
 // Build Function (Build Lower Level Components)
 function void build_phase (uvm_phase phase);
  super.build_phase(phase);
  ..
  ..
 endfunction: build_phase
 
 // Run Task
 virtual task run_phase(uvm_phase phase);
 
 // Create Top-level Sequence
  hier_top_seq hts;
  hts = hier_top_seq::type_id::create("hts", this);
 
  phase.raise_objection(this, "Starting hier_top_seq as Root Sequence");
  hts.start(env.agnt.sqnr);
  phase.drop_objection(this, "Droping hier_top_seq as Root Sequence");
 
 endtask: run_phase
 
endclass: test_hier_seq
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值