UVM config

config可以用来传递数据配置参数,通常set和get成对使用。

uvm_config_db#(int)::set(this, "env,agent.driver", "pre_num_max", 100);
uvm_config_db#(int)::get(this, "", "pre_num_max", pre_num_max);

需要注意第三个参数名字必须一样。

参数过多也可以实现自动获取,在注册factory时注册变量,但是set时第三个参数名字必须严格与参数名一致

class my_driver extends uvm_driver#(my_transaction);
	...
	int pre_num; 
	....
	'uvm_component_utils_begin(my_driver)
		'uvm_field_int(pre_num, UVM_ALL_ON)
	'uvm_component_utils_end

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

使用factory注册,但是需要注意的是set的时候必须要跟参数名保持一致,在build_phase里自动get了。

若一个变量存在多个set,取最上层的set值,若同层次多个set,取运行上最近的set值,这里层级主要是看相对于自身的路径,比如第二个参数。

需要set多个变量值时,可以再抽象出一个类专门进行赋值操作:

class iconfig extends uvm_object;
	rand int val;

	constraint default_cons{
		val = 7;
	}

	'uvm_object_utils_begin(iconfig)
		'uvm_field_int(val, UVM_ALL_ON)
	'uvm_object_utils_end
endclass

class base_test extends uvm_test;
	iconfig cfg;
	function void build_phase(uvm_phase phase);
		super.build_phase(phase);
		cfg = iconfig::type_id::create("cfg");
		uvm_config_db#(iconfig)::set(this, "env.agent.driver", "cfg", cfg);
		uvm_config_db#(iconfig)::set(this, "env.agent.monitor", "cfg", cfg);
	endfunction
endclass

class my_driver extends uvm_driver#(my_transaction)
	iconfig cfg;
	'uvm_component_utils_begin(my_driver)
		'uvm_field_object(cfg, UVM_ALL_ON | UVM_REFERENCE)
	‘uvm_component_utils_end

	task main_phase(uvm_phase phase);
		super.phase(phase);
		while(1) begin
			seq_item_port.get_next_item(req);
			pre_num = $urand_range(cfg.pre_num_min, cfg.pre_num_max);
			seq_item_port.item_done();
		end
	endtask
endclass

如果某个case需要专门单独赋值可以在case中set,case和base_test处于同一层,取最近赋值就会取到(虽然case继承自base_test,但是他们都会赋值给sequencer的)

如果需要在运行时改变某个验证平台的参数配置,可以在sequence中改变,同时想限制driver发送的包数量也可以在sequence中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值