UVM - 7 (Sequence机制)

内容

sequence概述

  • uvm_sequence_item - 数据建模
  • uvm_sequence - 产生数据
  • uvm_squencer - 将产生的数据给到driver
  • uvm_driver - 数据驱动给dut
  • sequencer是uvm组件,一个sequencer可以调用多个sequence

uvm_squence class普通成员

sequence执行流程

  • sequencer和driver是在agent中进行例化的
  • sequencer中可以设置默认的sequence,设置完成之后,会自动执行sequence中的body(),另外会自动执行driver中的get_next_item()
  • sequencer中的start()函数会调用sequence中的body()函数,body()会产生sequence item
  • body()产生数据,driver消耗数据

流程到代码的映射

  • 在main_phaze或者是run_phaze中,使用一个forever死循环
  • req是传递进来的transaction item
  • seq_item_port - squencer和driver的接口,可以调用方法
  • seq_item_port.get_next_item(req) - 获取传入的transaction item
  • seq_item_port.item_done() - 表示传递过来的transaction item已经处理完了,此时会告诉sequence已经处理完了,可以通过sequence产生下一笔数据

  • sequence中的body()函数通过objection机制控制进行TB运行
  • `uvm_do(req) - 产生激励然后发送出去,先产生一个req,然后调用randomize()进行随机化,然后将req发送出去
  • req就是一个transaction对象
  • 所有的宏不用加分号

sequence class要求

  • 自己的sequence必须从uvm_sequence扩展出来
  • body()使用task进行书写
  • body()函数是需要sequencer进行调用starting_phase()函数进行显式调用的
  • set_default_sequence() - 设置默认的sequence,并且执行其中的body()
  • 没有设置默认的sequence,需要显示调用body()

User Sequence with callback

手动创建和发送sequence item

sequencer和driver之间的通信机制

  • sequencer中调用sequence中的body()方法产生数据,产生的数据如何传给driver呢?
  • start_item(req)执行之后会找到对应的sequencer
  • sequencer中有wait_for_grant()被启动
  • sequencer执行begin_tr(req),开始数据传输,数据传输给driver
  • driver在run_phaze的时候执行get_next_item(req) - 获取到数据之后继续向下执行
  • driver执行完成之后,会执行item_done(),返回给sequencer中的finish_item(req)中的wait_for_item_done(),然后就执行完成了一次传输

sequence中的randc随机变量

验证工程师可以实现scenario sequence

  • 可以创建一组sequence
  • uvm_send() - 只是传输数据,没有randomize动作

嵌套sequence

在测试案例中执行user sequences

  • 使用uvm_config_db - 设置执行哪个sequence
posted @ 2024-03-15 12:48  Icer_Newer  阅读(273)  评论(0编辑  收藏  举报