[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 里的一段描述能够很好的解释以上提到的问题