[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的接口参数还是内部定义的局部变量都没有出现串扰的情况。

本文讨论了SystemVerilog中task的局部变量可能出现的串扰问题,由于task在不同时间调用时共享内存,可能导致数据干扰。通过使用`automatic`关键字,可以为每个调用分配独立存储空间。UVM中的task默认为automatic,因此不易遇到此类问题。
最低0.47元/天 解锁文章
590

被折叠的 条评论
为什么被折叠?



