DUT参数的随机化

1.通过寄存器模型进行随机化

assert(p_rm.randomize());
p_rm.updata(status, UVM_FRONTDOOR);

(1)对随机化进行constraint

assert(p_rm.reg1.randomize() with { reg_data.value == 5'h3;});
assert(p_rm.reg2.randomize() with { reg_data.value >= 7'h9;});

或者调用整体随机化,针对单个寄存器进行constraint

assert(p_rm.randomize() with {reg1.reg_data.value == 5'h3; reg2.reg_data.value >= 7'h9});

或者通过重载

class dreg1 extends my_reg1;
	constraint{
		reg_data.value == 5'h3;
	}
endclass
class dreg2 extends my_reg2;
	constraint{
		reg_data.value >= 7'h9;
	}
endclass

2.使用单独的参数类

如需要跨寄存器进行constraint:

assert(p_rm.randomize() with {rega.field0.value + regb.field0.value >=100;});

如果对所有测试用例都适用,可写在模型里

class reg_model extends uvm_reg_block;
	constraint reg_ab_cons{
		rega.field0.value + regb.field0.value >=100;
	}
endclass

也可针对DUT中需随机化的参数建立一个dut_parm类,并在其中指定默认约束

class dut_parm extends uvm_object;
	reg_model p_rm;
	…
	rand bit[15:0] a_field0;
	rand bit[15:0] b_field0;
	constraint ab_field_cons{
		a_field0 + b_field0 >= 100;
	}
	task update_reg();
		p_rm.rega.write(status, a_field0, UVM_FROTDOOR);
		p_rm.regb.write(status, b_field0, UVM_FROTDOOR);
	endtask
endclass

这段代码中指定了一个update_reg任务,用于当参数随机化完成后把相关的参数更新到DUT中。

在virtual sequence中可以实例化这个新类,随机化并调用update_reg任务:

class case0_cfg_vseq extends uvm_sequence;
	…
	virtual task body();
		dut_parm pm;
		pm = new("pm");
		assert(pm.randomize());
		pm.p_rm = p_sequencer.p_rm;
		pm.update_reg();
	endtask
	…
endclass

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值