[SystemVerilog语法拾遗] systemverilog中task的局部变量串扰问题

[SystemVerilog语法拾遗] systemverilog中task的局部变量串扰问题

同一个task在不同时间调用时可能存在局部变量的相互串扰问题。(这里一定是task才会出现这种问题,function没有时间消耗,不存在内部变量不同时间点调用的相互串扰)。以下面的例子为例:在这里插入图片描述

仿真结果如下:在这里插入图片描述

可以看到在50、100、150、200这四个传入"call1111111"参数的task里打印的确实"call2222222"的值,即在30这个时刻调用的task传入的值,并且task内部的变量i的值再两次调用也出现的串扰的情况。
这是因为systemverilog内部在调用task的时候,给task分配的空间里所有相关的参数都共享同一块内存区域,这样只要两次task调用的时候有时间重合,那必然会出现变量串扰的问题,这一点在绿皮书第二版60页的地方有提到,避免串扰的方法就是增加关键字automatic,让每次调用task时各自分配独立的存储空间,如下图所示:在这里插入图片描述

仿真结果在这里插入图片描述

从仿真结果可以看到,无论是task的接口参数还是内部定义的局部变量都没有出现串扰的情况。

那么这里大家会有一个疑问,既然避免task串扰的问题一直都需要解决,为什么咱们在UVM里定义的task从来没用过这个automatic关键字,并且也没有出现变量串扰的问题呢?
答案很简单,sv中定义在class … endclass直接的task都默认为automatic,而UVM文件的组织都是以class为单元的,所以我们定义的task都是放在class内的,自然也就不会存在automatic的问题了,只有激励写在module/interface/programe里的才会存在automatic应用的问题。

下面截取了 SystemVerilog IEEE 1800-2017 里的一段描述能够很好的解释以上提到的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值