前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【UVM COOKBOOK】Sequences||UVM Sequences

【UVM COOKBOOK】Sequences||UVM Sequences

作者头像
空白的贝塔
发布2021-10-28 15:52:16
9080
发布2021-10-28 15:52:16
举报
文章被收录于专栏:摸鱼范式

不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我

欢迎大家加入2023届数字IC交流群,QQ群号 628200294

【UVM COOKBOOK】

“后台回复COOKBOOK,即可获取PDF笔记以及原版COOKBOOK ”

后台回复即可获取

UVM Sequences

UVM中的Sequence

UVM sequence在事务层面提供了一种面向对象的激励生成方法,一方面让测试用例编写更加高效,另一方面提高了测试用例的可复用性。

控制sequence执行

sequence通过调用uvm_sequence的start启动,把sequence挂载到sequencer上,然后调用sequence的body方法。在sequence的body方法内部,可以启动其他的sequence或生成sequence_items并将其发送给driver。通常,激励的生成是从test类的run() 方法中的一个主控sequence开始的,然后该sequence产生其他sequence,这些sequence在测试平台内生成激励。不同的sequence运行过程中,sequence可以分层的、并行的或以随机顺序执行。sequence也可以随机化,从而改变控制或数据变量。也可以创建sequence库,但不建议这样做。

为了处理从sequence发送过来的item,driver可以通过访问sequencer中的方法,这些方法提供了一些替代方法,用于指示item被消耗了,或者item响应将返回sequence

“这里也许是说driver中和sequencer的接口交互 ”

sequence中item的处理,通常依赖于driver的对item的解析方法。常见的driver模型包括:

  • 单向非流水线
  • 双向非流水线
  • 流水线

注意

sequence一旦启动,必须保证能够正常结束,否则会导致sequence和driver之间锁死。

sequence生成激励的几种情况

控制多个driver上的激励生成

driver、sequencer、sequence_item和sequence组成的的sequence架构围绕单个接口工作。在大多数情况下,测试平台需要处理多个接口上的事务,这就需要使用virtual sequence。virtual sequence是可以在多个sequencer上启动子sequence的sequence。实现virtual sequence时,通过让他获取不同sequencer的句柄实现。通常通过一个virtual sequencer包含不同的sequencer实现。

控制连接到单个driver上的多个sequence

多个sequence可以与driver同时交互。sequencer本身具有仲裁机制,保证在任何时间点只有一个 sequence_item可以发送到driver。具体发送哪个item的选择取决于用户可设置的sequence仲裁算法。sequencer有五个内置的仲裁机制和一个用于用户定义算法的钩子。sequence在启动时设置优先级,在某些仲裁算法中,优先级能够使sequence的发送更加有序。

如果响应从driver返回到多个sequence之一,sequencer会使用sequence_item中的序列id字段路由到正确的sequence中。driver中的响应处理代码应该使用set_id_info方法来确保任何响应item具有与接收到的对应的item具有相同ID。

“意思时把rsp发回去之间复制一下req的id给rsp ”

在某些情况下,例如处理中断,sequence需要独占对driver的访问权,在这种情况下,sequence可以使用grab 或者 lock方法。

“具体的机制可以参考白皮书 ”

分层

在许多情况下,sequence生成可以抽象为层的数据流,例如串行通信通道和通过寄存器间接访问总线。通过用不同层级的sequence构成新的sequence,高层次sequence到低层次sequence这一过程会更加清晰。通过分层的sequence能非常快速地构建复杂的激励。

等待硬件事件

虽然driver会负责正常的硬件同步,但sequence运行过程中可能需要与硬件事件同步,例如边界信号的转换或复位事件的结束。不应该去修改driver然后为sequence_item添加一个新的字段,而是建议在包含指向virtual interface的指针的配置对象中实现 wait_for_hardware_event 方法。

“拓展阅读Wait for Interface Signals in UVM | Universal Verification Methodology (learnuvmverification.com)[1] ”

“下面是拓展阅读中的例子 ”

代码语言:javascript
复制
///// Transaction Class
class transaction extends uvm_sequence_item;
 `uvm_object_utils(transaction)
 
 rand logic [31:0] addr;
 rand logic [31:0] write_data;
  rand bit read;
 rand int delay;
 
 bit error;
 logic [31:0] read_data;
 
 function new (string name);
  super.new(name);
 endfunction: new
 
 constraint at_least_1 { delay inside {[1:20]};}
 
 constraint 32bit_align {addr[1:0] == 0;}
 
endclass: transaction

///// Bus Configuration Object
class bus_config extends uvm_object;
 `uvm_object_utils(bus_config)
 
 virtual bus_interface bus_if;
 
 function new (string name);
  super.new(name);
 endfunction: new
 
 /// wait_for_clock
 task wait_for_clock( int m = 1 );
  repeat ( m ) begin
   @(posedge bus_if.clk);
  end
 endtask: wait_for_clock
 
 /// wait_for_reset
 task wait_for_reset;
  @(posedge bus_if.reset);
 endtask: wait_for_reset
 
endclass: bus_config

///// Bus Sequence
class bus_seq extends uvm_sequence #(transaction);
 `uvm_object_utils(bus_seq)
 
 transaction txn;
 bus_config bus_cfg;
 
 rand int limit = 25;
 
 function new (string name);
  super.new(name);
 endfunction: new
 
 task body;
  int i = 5;
  txn = transaction::type_id::create("txn", this);
 /// Get the Configuration object
  if(!uvm_config_db #(bus_config)::get(null, get_full_name(), "config", bus_cfg)) begin
   `uvm_error(" SEQ BODY ", "bus_config is not found")
  end
    repeat (limit) begin
   start_item(txn);
   if(!txn.randomize() with {addr inside {[32'h0010_0000:32'h0010_001C]};}) begin
    `uvm_error(" SEQ BODY ", " Transaction randomization failed")
   end
   finish_item(txn);
 /// wait for interface clock
   bus_cfg.wait_for_clock(i);
   i++;
 /// The txn handle points to the object that the driver has updated with response data
   `uvm_info(" SEQ BODY ", " txn.read_data ", UVM_LOW)
   end
 endtask: body
endclass: bus_seq
通过中断驱动的激励

使用中断来触发sequence的执行是等待硬件事件的一种变体。这可能导致中断服务程序的独占访问权限,或者它可能在模拟硬件设备的控制状态机,当它准备好或完成任务时生成中断。

“原文没有展开讨论,应该是在模拟硬件中的中断或者状态机 ”

Sequence Items

UVM产生激励是通过sequence sequencer以及driver三者配合实现的。生成激励的flow的框架是围绕sequence构建的,但是生成数据流使用sequence_items作为数据对象。由于 sequence_items 是构建sequence的基础,因此在设计时需要注意一些问题。Sequence_item的内容由driver在pin一级的时序决定的;通过支持随即约束,sequence item能够更加简单地生成新的item;此外,还包括了其他参数如用于分析的回调钩子。

数据属性成员

sequence_item 的内容与driver的需求密切相关。driver根据sequence_items 的内容来确定要执行哪种类型的pin级事务。item的内容一般有以下几种:

  • 控制 - 即什么类型的传输,数据有多大
  • Payload - 即传输的主要数据内容
  • 配置 - 即操作模式、错误行为等
  • 分析 - 即有助于分析的字段,例如时间戳、校验和等

随机化注意事项

Sequence_items 在sequence内随机化然后发送到driver中。因此,激励数据属性声明为 rand,并且默认生成值合法或在将他约束到一个合法范围内。在一个sequence中,sequence_items通常使用内联约束随机化,这些约束和item内部的约束共同作用产生最终结果。

由于 sequence_items 用于请求和响应sequence和driver之间的传输的,因此遵循准则。是请求属性应该是 rand,而响应属性不应该是rand。这样可以优化随机化过程,并确保任何收集的响应信息不会被任何随机化破坏。例如,考虑以下总线协议 sequence_item:

代码语言:javascript
复制
class bus_seq_item extends uvm_sequence_item; 
// Request data properties are rand 
 rand logic[31:0] addr; 
 rand logic[31:0] write_data; 
 rand bit read_not_write; 
 rand int delay; 
// Response data properties are NOT rand 
 bit error; 
 logic[31:0] read_data; 
 `uvm_object_utils(bus_seq_item) 
 function new(string name = "bus_seq_item"); 
  super.new(name); 
 endfunction 
// Delay between bus cycles is in a sensible range 
 constraint at_least_1 { delay inside {[1:20]};} 
// 32 bit aligned transfers 
 constraint align_32 {addr[1:0] == 0;} 
// etc 
endclass: bus_seq_item 

Sequence Item 方法

uvm_sequence_item 通过 uvm_transaction 类从 uvm_object 继承而来。uvm_object 有许多虚方法,用于实现常见的数据对象功能(复制、克隆、比较、打印、事务记录),建议覆盖这些虚拟方法让 sequence_item 更具通用性。sequence_item 通常用于分析流量,推荐添加有助于功能覆盖或分析的实用函数。

参考资料

[1]

Wait for Interface Signals in UVM | Universal Verification Methodology (learnuvmverification.com): http://www.learnuvmverification.com/index.php/2015/12/04/wait-for-interface-signals-in-uvm/

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 摸鱼范式 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【UVM COOKBOOK】
    • UVM Sequences
      • UVM中的Sequence
      • 控制sequence执行
      • sequence生成激励的几种情况
    • Sequence Items
      • 数据属性成员
      • 随机化注意事项
      • Sequence Item 方法
      • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档