UVM-入门实验3

在之前的monitor到checker的通信,以及checker与reference model之间的通信,都是通过mailbox以及在上层进行其句柄的传递实现的。这次实验则使用TLM端口进行通信,做逐步的通信元素和方法的替换
在这里插入图片描述
1.在checker中声明与monitor通信的import端口类型,以及与reference model通信的import端口类型。由于checker与多个monitor以及reference_module通信,是典型的多方向通信类型,因此,需要使用多端口通信的宏声明方法

`uvm_blocking_put_imp_decl(_chnl0)
`uvm_blocking_put_imp_decl(_chnl1)
`uvm_blocking_put_imp_decl(_chnl2)
`uvm_blocking_put_imp_decl(_fmt)
`uvm_blocking_put_imp_decl(_reg)

`uvm_blocking_get_peek_imp_decl(_chnl0)
`uvm_blocking_get_peek_imp_decl(_chnl1)
`uvm_blocking_get_peek_imp_decl(_chnl2)

`uvm_blocking_get_imp_decl(_reg)
class mcdf_checker extends uvm_scoreboard;
声明上面定义的TLM类型
uvm_blocking_put_imp_chnl0 #(mon_data_t, mcdf_checker) chnl0_bp_imp;
uvm_blocking_put_imp_chnl1 #(mon_data_t, mcdf_checker) chnl1_bp_imp;
uvm_blocking_put_imp_chnl2 #(mon_data_t, mcdf_checker) chnl2_bp_imp;
uvm_blocking_put_imp_fmt #(mon_data_t, mcdf_checker) fmt_bp_imp;
uvm_blocking_put_imp_reg #(reg_trans, mcdf_checker) reg_bp_imp;

uvm_blocking_get_peek_imp_chnl0 #(mon_data_t, mcdf_checker) chnl0_bgpk_imp;
uvm_blocking_get_peek_imp_chnl1 #(mon_data_t, mcdf_checker) chnl1_bgpk_imp;
uvm_blocking_get_peek_imp_chnl2 #(mon_data_t, mcdf_checker) chnl2_bgpk_imp;

uvm_blocking_get_imp_reg #(reg_trans, mcdf_checker) reg_bg_imp;
endclass

2.在mcdf_refmod中声明用来与mcdf_checker中import连接的端口,并且完成例化

class mcdf_refmod extends uvm_component;
	uvm_blocking_get_port #(reg_trans) reg_bg_port;
	uvm_blocing_get_peek_port #(mon_data_t) in_bgpk_ports[3];
endclass

3.在mcdf_env的connect_phase()阶段,完成monitor的TLM port与mcdf_checker TLM import的连接

class mcdf_env extends uvm_env
	function void build_phase(uvm_phase phase);
		super.build_phase(phase);
		this.chker = mcdf_checker::type_id::create("chker", this);
		foreach(chnl_agts[i]) begin
			this.chnl_agts[i] = chnl_agent::type_id::create($sformatf("chnl_agts[%0d]", i), this);
		end
		this.reg_agt = reg_agent::type_id::create("reg_agt", this);
		this.fmt_agt = fmt_agent::type_id::create("fmt_agt", this);
		this.cvrg = mcdf_coverage::type_id::create("cvrg", this);
	endgunction
	function void connect_phase(uvm_phase phase);
		super.connect_phase(phase);
		chnl_agts[0].monitor.mon_bp_port.connect(chker.chn10_bp_imp);
		chnl_agts[1].monitor.mon_bp_port.connect(chker.chn11_bp_imp);
		chnl_agts[2].monitor.mon_bp_port.connect(chker.chnl2_bp_imp);
      	reg_agt.monitor.mon_bp_port.connect(chker.reg_bp_imp);
      	fmt_agt.monitor.mon_bp_port.connect(chker.fmt_bp_imp);
	endfunction
endclass

4.在mcdf_checker的connect_phase()阶段,完成mcdf_refmode的TLM port与mcdf_checker的TLM import的连接

function void build_phase(uvm_phase phase);
	super.build_phase(phase);
	foreach(this.chnl_mbs[i]) this.chnl_mbs[i] = new();
	this.fmt_mb = new();
	this.reg_mb = new();
	this.refmod = mcdf_refmod::type_id::create("refmod", this);
endfunction
function void connect_phase(uvm_phase phase);
	super.connect_phase(phase);
	refmod.in_bgpk_ports[0].connect(chnl0_bgpk_imp);
	refmod.in_bgpk_ports[1].connect(chnl1_bgpk_imp);
	refmod.in_bgpk_port[2].connect(chnl2_bgpk_imp);
	refmod.reg_bg_port.connect(reg_bg_imp);
endfunction
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值