UVM 寄存器内建测试序列(built-in sequences)

原文链接:https://blog.csdn.net/qq_42419590/article/details/121487295

UVM 寄存器内建测试序列(built-in sequences)

不少有经验的UVM用户可能会忽略UVM针对寄存器模型内建的一些sequence,实际上如果可以将这些自建的序列作为验证项目一开始的健康检查必选项的化,这对于整个项目的平稳运行会有不小的贡献。
这是因为在项目一开始的阶段,设计内部的逻辑还不稳定,对于verifier而言,如果想要跟上设计的进度,可以展开验证的部分无外乎是系统控制信号(时钟、复位、电源)和寄存器的验证。

在项目早期,寄存器模型的验证可以为后期各个功能点验证打下良好的基础。比如,通过内建的寄存器或者存储序列可以实现完善的寄存器复位值检查,又比如检查读写寄存器的读写功能是否正常等。

不过有一些寄存器即便可以测试,也建议将其作为例外而过滤出去,例如一些重要的系统控制信号(时钟、复位、电源),当写入某些值以后,会使得系统全部或者局部复位、时钟也可能被关闭,这就可能阻碍寄存器的下一步检查。

所以UVM提供了一些特殊域,用来禁止sequence检查这些寄存器或者存储。

内建序列

在这里插入图片描述

在这里插入图片描述

内建序列示例

下面的例码演示如何利用内建序列完成MCDF寄存器测试一开始的健康检查。分别添加了uvm_reg_hw_reset_seq、uvm_reg_bit_bash_seq和uvm_reg_access_seq来测试寄存器模型。
从代码的整洁性来看,用户并不需要额外再添加什么,这种使用方法非常方便,且又能完成寄存器的大规模集成测试。

class mcdf_example_seq extends uvm_reg_sequence;
	mcdf_rgm rgm;
	`uvm_object_utils(mcdf_example_seq)
	`uvm_declare_p_sequencer(mcdf_bus_sequencer)
	...
	task body();
		uvm_status_e status;
		uvm_reg_data_t data;
		uvm_reg_hw_reset_seq reg_rst_seq=new();
		uvm_reg_bit_bash_seq reg_bit_bash_seq=new();
		uvm_reg_access_seq reg_acc_seq=new();
		if(!uvm_config_db#(mcdf_rgm)::get(null,get_full_name(),"rgm",rgm))begin
			`uvm_error("GETRGM",“no top-down RGM handle is assigned”)
		end
		//wait reset asserted and release
		@(negedge p_sequencer.vif.rstn);
		@(posedge p_sequencer.vif.rstn);
		`uvm_info("BLTINSEQ","register reset sequence started",UVM_LOW)
		reg_rst_seq.model=rgm;
		reg_rst_seq.start(sequencer);
		`uvm_info("BLTINSEQ","register reset sequence finished",UVM_LOW)
		`uvm_info("BLTINSEQ","register bit bash sequence started",UVM_LOW)
		//reset hardware register and register model
		reg_acc_seq.model=rgm;
		reg_acc_seq.start(m_sequencer);
		`uvm_info("BLTINSEQ","register access sequence finished",UVM_LOW)
	endtask
endclass

寄存器健康检查

对于一些寄存器,如果想将其排除在某些内建序列测试范围之外,用户可以额外添加上面列表中提到的"禁止域名"。由于uvm_reg_block和uvm_reg均是uvm_object类而不是uvm_component类,所以可以使用uvm_resource_db来配置"禁止域名"。

下面的代码摘自mcdf_rgm::build()方法,这相当于寄存器模型在自己的建立阶段设定了一些属性。当然,uvm_resource_db的配置也可以在更高层指定,只不过考虑到uvm_resource_db不具备层次化的覆盖属性,我们建议只在一个地方进行"禁止域名"的配置。

class mcdf_rgm extends uvm_reg_block;
	...
	virtual function build();
	...
	//disable build-in seq attributes
	uvm_resource_db#(bit)::set({"REG::",this.chnl0_stat_reg.get_full_name()},
										"NO_REG_ACCESS_TEST",1);
	uvm_resource_db#(bit)::set({"REG::",this.chnl1_stat_reg.get_full_name()},
										"NO_REG_ACCESS_TEST",1);
	uvm_resource_db#(bit)::set({"REG::",this.chnl2_stat_reg.get_full_name()},
										"NO_REG_ACCESS_TEST",1);
	endfunction
endclass		
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UVM中,如果不使用寄存器模型,可以通过使用UVM提供的其他功能来扫描寄存器。一种常见的方法是使用UVM提供的register_sequence来实现寄存器的扫描操作。 首先,你需要创建一个继承自uvm_sequence类的自定义sequence类,用于定义寄存器扫描的操作序列。在这个自定义sequence类中,你可以使用UVM提供的register_sequence_item类来定义每个寄存器的扫描操作。 接下来,在你的测试中,你需要创建一个继承自uvm_test类的自定义test类,并在其中实例化你之前定义的自定义sequence类。然后,你可以在test的run_phase中使用uvm_do_with方法来执行寄存器扫描操作。 下面是一个示例代码,演示了如何在UVM中实现寄存器的扫描操作: ```systemverilog class my_register_sequence extends uvm_sequence #(uvm_sequence_item); `uvm_object_utils(my_register_sequence) virtual task body(); // 定义寄存器扫描操作 my_register_sequence_item scan_item; scan_item.operation = SCAN; scan_item.address = 0; // 设置寄存器地址 scan_item.data = 0; // 设置扫描数据 // 执行寄存器扫描操作 uvm_do_with(scan_item, {repeat = 10;}); endtask endclass class my_test extends uvm_test; `uvm_component_utils(my_test) my_register_sequence reg_sequence; function new(string name, uvm_component parent); super.new(name, parent); reg_sequence = my_register_sequence::type_id::create("reg_sequence"); endfunction virtual task run_phase(uvm_phase phase); // 执行寄存器扫描操作 reg_sequence.start(null); reg_sequence.wait_for_sequence_state(UVM_FINISHED); endtask endclass // 在你的测试环境中实例化my_test类,并运行测试 initial begin my_test test = my_test::type_id::create("test"); run_test("test"); end ``` 通过以上代码,你可以在UVM中实现寄存器的扫描操作,而不使用寄存器模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值