System Verilog 邮箱传递小结

本文详细阐述了在VHDL设计中,如何通过信箱机制实现不同模块间类对象的跨模块传递。重点讲解了类trans2如何通过句柄获取trans3中tran1对象的操作,以及put和get方法的执行顺序和注意事项。同时,涉及对象创建、作用域和生命周期管理的关键点。

重要点知识:

1、类trans2中只创建tran1的句柄t1,没创建对象,却可以利用信箱获得类trans3中的tran1建立的指向对象的句柄。

2、信箱put、get顺序不能错;如果不加fork...join先运行tr2.run()再运行tr3.run()是错误的。

3、下面代码中put()之后get()并不能直接获得传输值(t1),需要运行完tr3.run()之后才会get到t1。

4、注意传输的句柄、邮箱句柄在两个类中都要创建句柄,其中,负责put()的类还需要创建传输对象、句柄对象。

5、注意负责get()的类与负责put()的类,邮箱句柄需要指向同一邮箱对象。

6、trans2和trans3中都名为maibox req,这不是必须的。trans2可以是maibox tot,只要将req.get()改为tot.get(),tr2.req=tr3.req改为tr2.tot=tr3.req。

此外,注意类中创建对象后,其作用范围、生命周期。


module class_priact;
class trans1;
int a =5;
endclass

class trans2;
	mailbox req;
	task run();
	    trans1 t1;
	    this.req.get(t1);
	    t1.a=t1.a*2;
	    $display("trans2.is %0d",t1.a);
	endtask
endclass

class trans3;
	mailbox req;

	function new();
		this.req=new();
	endfunction	

	task run();
		trans1 t1;
		    t1=new();
		    this.req.put(t1);
		    $display("trans3.is %0d",t1.a);
		    t1.a = t1.a*3;
		$display("t1.a*3.is %0d",t1.a);
	endtask
endclass

initial begin
	trans2 tr2=new();
	trans3 tr3=new();
	tr2.req=tr3.req;
	
  fork
	tr2.run();
 	tr3.run();
  join

end

endmodule
	

 仿真结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值