UVM::sequence_item的定义

sequence_item的定义以及注意事项:

1,

class packet extends uvm_sequence_item;

	rand int len;
	rand int crc;

	function new (string name = "packet");
		super.new(name);
		this.crc.rand_mode(0);
	endfunction

	constraint len_c{
		len > 0;
	}

endclass

2,

import uvm_pkg::*;

class packet extends uvm_sequence_item;
	uvm_cmdline_processor clp = uvm_cmdline_processor::get_inst();
	string clp_arg;

	rand int addr;
	rand int data;
	rand int len;
	int len_arg;
	int len_flg;
	rand int crc;
				
	function new (string name = "packet");
		super.new(name);
		this.crc.rand_mode(0);
		if(clp.get_arg_value("+len=",this.clp_arg)) begin   
			this.len_arg=this.clp_arg.atoi();
			this.len_flg=1;
		end
	endfunction

	constraint addr_data_c{
		addr > 16'hffff;
		data > 0;
	}
	constraint len_c{
		if(len_flg == 1){
			len == len_arg;
		}else {
			len > 0;
		}
	}

endclass


所有的item必须继承uvm_sequence_item。
所有的定义为rand,但是可以通过this.crc.rand_mode(0)来关掉随机化,这里的crc就是通过其他数据生成的,不能随机化。
可以添加多个constraint 组。
constraint里边还可以根据cmdline的参数来选择不同的rand。


//A=ABSTRACT Y=PHYSICAL
//F=REFERENCE, S=SHALLOW, D=DEEP
//K=PACK, R=RECORD, P=PRINT, M=COMPARE, C=COPY
//--------------------------- AYFSD K R P M C
parameter UVM_DEFAULT = 'b000010101010101;
parameter UVM_ALL_ON = 'b000000101010101;

So, UVM_DEFAULT turns on the "D"EEP bit, whereas UVM_ALL_ON (ironically) has it turned off. 


参考:

http://forums.accellera.org/topic/991-uvm-all-on-vs-uvm-default/

UVM环境中,子序列(sequence)继承自父序列(sequence)是一种常见的做法,以实现代码的复用和扩展性。当创建一个新的序列`sequence_a`继承自现有的`sequence_b`时,可以在`sequence_a`中定义新的事务(transaction)或结构体,并在序列体中对这些结构体的成员变量进行赋值操作。在测试(uvm_test)中,可以获取这些结构体的值,用于后续的验证逻辑。 下面是一个简化的例子: 首先定义一个基类序列`sequence_b`,这个序列本身可以是空的或者实现一些基础的事务生成逻辑。 ```verilog class sequence_b extends uvm_sequence #(some_transaction); // 基类序列的内容 endclass ``` 然后定义子类序列`sequence_a`,继承自`sequence_b`。在这个子类序列中,可以定义一个新的结构体,并在序列体`body()`方法中对这个结构体的成员进行赋值。 ```verilog class sequence_a extends sequence_b; typedef struct { bit [7:0] value; // 其他成员变量 } my_struct_t; virtual task body(); my_struct_t my_struct; some_transaction tx; super.body(); // 调用父序列的body方法 `uvm_info("SEQ_A", "Starting sequence_a body", UVM_LOW) // 初始化结构体变量 my_struct.value = 8'hAA; // 例如,赋值为16进制的AA // 创建一个新的事务实例 tx = some_transaction::type_id::create("tx"); // 将结构体的数据赋值给事务的成员变量 tx.some_field = my_struct.value; // 将事务发送到驱动 start_item(tx); if (!tx.randomize()) begin `uvm_error("RAND_FAIL", "Transaction randomization failed") end finish_item(tx); `uvm_info("SEQ_A", "Ending sequence_a body", UVM_LOW) endtask endclass ``` 在`uvm_test`类中,可以启动序列`sequence_a`,并获取事务中的结构体变量值。 ```verilog class my_test extends uvm_test; ... virtual function void run_phase(uvm_phase phase); sequence_a seq; phase.raise_objection(this); seq = sequence_a::type_id::create("seq"); seq.start(m_sequencer); // m_sequencer是序列器的实例 phase.drop_objection(this); endfunction ... endclass ``` 通过这种方式,`uvm_test`可以获取到通过序列生成并发送到驱动的事务中结构体的值,进而用于测试的其他部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值