UVM在test组件内启动sequence/virtual sequence的方法

这篇具有很好参考价值的文章主要介绍了UVM在test组件内启动sequence/virtual sequence的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在UVM中需要启动sequence的场景主要分为以下两种:

1. 在 uvm_test 组件中启动顶层 sequence 或者 virtual sequence 运行测例;

2. 在层次化sequence 的顶层 sequence 中启动 sub-sequence;virtual sequence中启动相应的sequence;

情况一:  在uvm_test 组件中启动顶层 sequence 或者 virtual sequence 运行测例

在 test 中启动 sequence,可以有两种方式进行启动,通过start()以及通过default_sequence的方式启动。

通过start()启动:

class my_test extends base_test;

  	`uvm_component_utils(my_test)

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

	task run_phase(uvm_phase phase);
		virtual_sequence  vseq = virtual_sequence::type_id::create("vseq");
		phase.raise_objection(this);
		vseq.start(env.vseqr);
		phase.drop_objection(this);
	endtask

endclass

通过start( ) 方式启动,首先需要创建待启动sequence的对象,之后便可以通过指向该sequence对象的句柄调用对应的task start( ) 来启动该sequence。通过start( ) 方法在uvm_test 的run_time phase 启动 sequence,需要控制相应phase的 objection。

通过default_sequence启动:

方式1,无需实例化sequence。此时传入config_db的参数为 uvm_object_wrapper

class my_test extends base_test;

	`uvm_component_utils(my_test)

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

	function void build_phase(uvm_phase phase);
		super.build_phase(phase);

		uvm_config_db#(uvm_object_wrapper)::set(this, "env.vseqr.main_phase", "default_sequence", virtual_sequence::type_id::get());

	endfunction

	......

endclass

方式二,启动前先对sequence进行例化。此时传入config_db的 参数为 uvm_sequence_base

class my_test extends base_test;

	`uvm_component_utils(my_test)

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

	function void build_phase(uvm_phase phase);
		super.build_phase(phase);

		virtual_sequence  vseq = virtual_sequence::type_id::create("vseq");
        //vseq.randomize() with { };
		uvm_config_db#(uvm_sequence_base)::set(this, "env.vseqr.main_phase", "default_sequence", vseq);

        //uvm_resource_db#(uvm_sequence_base)::set(get_full_name(), ".vseqr.main_phase", "default_sequence", vseq, this);

	endfunction

	......

endclass

通过 default_sequence 的方式启动 sequence,首先注意调用 config_db 的位置最好在uvm_test 的 build_phase 进行,而不能在 run time phase 进行。通过该方式启动sequence的本质是通过工厂机制创建对应的sequence,并且调用 start( ) 完成sequence的发送。 

当通过default_sequence的方式开启sequence时,需要通过sequence来控制objection。因为通过config的方式将sequence配置到对应sequencer的某个phase后,并没有对这个phase的objection进行控制,所以需要通过当前这个sequence进行objection控制。对于UVM1.2版本,只需要在 sequence 的 new( ) 函数中添加 set_automatic_phase_objection(1); 语句即可实现objection的自动控制。

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

注意!:在uvm_test 组件中不能通过 `uvm_do 系列宏开启 顶层sequence或virtual sequence

以 `uvm_do_on 为例:

​`define uvm_do_on(SEQ_OR_ITEM, SEQR) \
  `uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, -1, {})

调用 `uvm_do_on 后,会调用内部包含的 `uvm_do_on_pri_with 宏:

`define uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, PRIORITY, CONSTRAINTS) 
  begin 
  uvm_sequence_base __seq; 
  `uvm_create_on(SEQ_OR_ITEM, SEQR)
  if (!$cast(__seq,SEQ_OR_ITEM)) start_item(SEQ_OR_ITEM, PRIORITY);
  if ((__seq == null || !__seq.do_not_randomize) && !SEQ_OR_ITEM.randomize() with CONSTRAINTS ) begin 
    `uvm_warning("RNDFLD", "Randomization failed in uvm_do_with action") 
  end
  if (!$cast(__seq,SEQ_OR_ITEM)) finish_item(SEQ_OR_ITEM, PRIORITY); 
  else __seq.start(SEQR, this, PRIORITY, 0); 
  end
`define uvm_create_on(SEQ_OR_ITEM, SEQR) 
  begin 
  uvm_object_wrapper w_; 
  w_ = SEQ_OR_ITEM.get_type(); 
  $cast(SEQ_OR_ITEM , create_item(w_, SEQR, `"SEQ_OR_ITEM`"));
  end

 通过分析  `uvm_do_on_pri_with 宏具体操作可以看出,其内部直接调用的一些方法,例如:start_item( ) 、 finish_item( ) 、create_item( )等, 都是属于 uvm_sequence_base 的方法,而这些方法在 uvm_component 类中无法直接被调用。

所以类似的 `uvm_do 系列宏只可以在 sequence 内部被调用,例如在顶层sequence中通过 `uvm_do 开启sub-sequence、在virtual sequence中通过 `uvm_do_on 开启各部分sequence 等。

而在构建用户的 test 时,是无法直接在uvm_test 组件内部直接通过 `uvm_do 系列宏开启最顶层 sequence 或是 virtual sequence。

情况二:在层次化 sequence 中启动 sub-sequence;virtual sequence中启动相应的sequence 

 通过start()启动 sub-sequence :

class sub_sequence extends uvm_sequence;

	`uvm_object_utils(sub_sequence)
	......
	task body();
		......
	endtask

endclass

class top_sequence extends uvm_sequence;

	`uvm_object_utils(top_sequence)
	......

	task body();

		sub_sequence sub_seq;
		sub_seq = sub_sequence::type_id::create("sub_seq");

		......

		sub_seq.start(m_sequencer, this);

		......

	endtask

endclass

通过`uvm_do系列宏启动 sub_sequence:

class sub_sequence extends uvm_sequence;

	`uvm_object_utils(sub_sequence)
	......
	task body();
		......
	endtask

endclass

class top_sequence extends uvm_sequence;

	`uvm_object_utils(top_sequence)
	......

	task body();

		sub_sequence sub_seq;
		
		......

		`uvm_do(sub_seq)

		......

	endtask

endclass

通过start()启动 virtual sequence 中的目标 sequence :

class ahb_sequence extends uvm_sequence;

	`uvm_object_utils(ahb_sequence)
	......
	task body();
		......
	endtask

endclass


class apb_sequence extends uvm_sequence;

	`uvm_object_utils(apb_sequence)
	......
	task body();
		......
	endtask

endclass

class uart_sequence extends uvm_sequence;

	`uvm_object_utils(uart_sequence)
	......
	task body();
		......
	endtask

endclass

class virtual_sequence extends uvm_sequence;
	
	`uvm_object_utils(virtual_sequence)
	`uvm_declare_p_sequencer(virtual_sequencer)

	ahb_sequence	ahb_seq;
	apb_sequence	apb_seq;
	uart_sequence	uart_seq;

	......

	task body();
		
		ahb_seq = ahb_sequence::type_id::create("ahb_seq");
		apb_seq = apb_sequence::type_id::create("apb_seq");
		uart_seq = uart_sequence::type_id::create("uart_seq");
	
		......

		ahb_seq.start(p_sequencer.ahb_seqr);
		apb_seq.start(p_sequencer.apb_seqr);
		uart_seq.start(p_sequencer.uart_seqr);

		......
	endtask

endclass

通过`uvm_do_on系列宏启动 virtual sequence 中的目标 sequence :文章来源地址https://www.toymoban.com/news/detail-498311.html

task body();
		
	ahb_sequence    ahb_seq
	apb_sequence    apb_seq
    uart_sequence   uart_seq

	......

    `uvm_do_on(ahb_seq, p_sequencer.ahb_seqr)
    `uvm_do_on(apb_seq, p_sequencer.apb_seqr)
    `uvm_do_on(uart_seq, p_sequencer.uart_seqr)
	......
endtask

到了这里,关于UVM在test组件内启动sequence/virtual sequence的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UVM验证方法学_config_db机制

    config_db机制是uvm中很重要的机制之一。由于验证平台的结构往往会比较复杂,其中的组件如果要进行互相通信和参数传递,则需要一种高效且稳妥的办法,这就是config_db机制的意义。  目录 一、config_db机制概述 (1)路径 (2)set和get (3)省略get函数 二、跨层次多重设置 三

    2024年02月05日
    浏览(30)
  • Fabric V2.5 test-network启动日志分析

    背景 分析Fabric网络的启动日志可以帮我们理解搭建区块链网络的过程。本文对输出日志进行详细的分析。 启动网络与创建通道 安装链码 链码的生命周期:https://hyperledger-fabric.readthedocs.io/en/release-2.5/chaincode_lifecycle.html

    2024年02月21日
    浏览(29)
  • 记录一次老服务器启动ActiveMq时报的Could not create the Java Virtual Machine.错误

    服务器系统CentOS7  1、出现ActiveMq服务无法连接 2、查看activemq状态 service activemq status 显示activemq not running 3、找到ActiveMq的bin目录,# 后台启动 ./activemq console 提示Could not create the Java Virtual Machine.错误 可以判断是java运行环境的问题 4、再看看java版本 java -version 5、再看看activemq版

    2024年04月22日
    浏览(45)
  • test ui-01-UI 测试组件之 Selenium 入门介绍

    Selenium 是一个涵盖多种工具和库的项目,旨在支持和实现对 Web 浏览器的自动化。 它提供了扩展来模拟用户与浏览器的交互,一个用于扩展浏览器分配的分发服务器,以及符合 W3C WebDriver 规范的基础设施,使您能够为所有主要的 Web 浏览器编写可互换的代码。 这个项目得以实

    2024年02月03日
    浏览(29)
  • test ui-02-UI 测试组件之 Appium 入门介绍

    正如主页所述,Appium的目标是支持许多不同平台(移动、Web、桌面等)的UI自动化。 不仅如此,它还旨在支持用不同语言(JS、Java、Python等)编写的自动化代码。 将所有这些功能组合到一个程序中是一个非常艰巨的任务,如果不是不可能的话! 为了实现这一目标,Appium有效

    2024年02月03日
    浏览(30)
  • k8s 中快速启动curl pod 做api test

    k8s上运行的pod需要进行api测试,由于开发使用的镜像都是最小化构建,不能保证现有的pod中一定有curl工具,于是需要启动一个带有curl工具的测试pod专门进行api测试 上述指令实现在指定namespace下创建一个带有curl tool的pod, 可以用于进行api测试.

    2024年02月12日
    浏览(26)
  • 【IDEA】在idea中启动单元测试报错:No tests were found

    我是一个springboot多模块小项目 以下是我的排错顺序: 1.关闭项目,删除.idea文件夹,重新构建项目 【依旧报错】 2.全部clean再编译 【依旧报错】 3.更改junit版本 【依旧报错】 4.最后,发现是pom文件中缺少了maven插件那一块: 然后刷新一下, 问题解决

    2024年02月11日
    浏览(33)
  • vitest单元测试配合@vue/test-utils之组件单元测试篇

    vitest 是由 vite 提供支持的极速单元测试框架,VueTestUtils 是 Vue.js 的官方测试实用程序库,vitest 本身是不支持单元组件测试的,需要配合 test-utils 来完成组件单元测试,安装与基本 API 就不再赘述,学会阅读文档与查找资料是一个程序员的基本功 demo 由一个组件和测试文件组成

    2024年03月16日
    浏览(41)
  • Quartus如何设置虚拟管脚Virtual Pin(具体设置方法)

    参考链接:如何在Quartus II中设置Virtual pin及常见问题_林晓海的博客-CSDN博客 (原创)QuartusII设置虚拟引脚(Virtual Pin)_weixin_30299539的博客-CSDN博客 报错信息: Error (169281): There are 515 IO input pads in the design, but only 180 IO input pad locations available on the device. 报错原因: 为了验证FPG

    2024年02月05日
    浏览(33)
  • QT5 Virtual Keyboard实现自适应悬浮键盘(多种方法详细记录)

            项目需求实现悬浮键盘,点击QLineEdit或QTextEdit自动弹出自适应悬浮键盘,尝试了以下几种方法后选择了修改QT Virtual Keyboard源码。在这里把其他方法/想法也列出来做一下记录。         项目环境:QT5.13.2  VS2017 目录 方法1:调用windows自带系统软件盘 介绍  代码

    2024年02月02日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包