在SystemVerilog中我们经常会用到static,用以表示一种“静态”,而这种“静态”经常用来表示变量在整个仿真过程中的“存活期”,即生命周期。关于这个所谓的生命周期我们先通过一个示例有个直观的了解。
【示例】
【仿真结果】
示例中,任务add2x2在initial过程块中被调用了两次,两次调用的时间不同,传入的参数也不同,但是最终的仿真结果是相同的,并且从仿真波形上可以看到任务add2x2中的temp在3ns时,从1变成了2,并且正是因为这次temp的变化导致第一次调用add2x2的结果被第二次调用add2x2影响,从而导致最后的加法结果也发生了变化。我们对示例进行修改再看下仿真结果会如何。
【示例】任务标识符前增加automatic关键字
【仿真结果】
该示例与上例不同之处仅在于add2x2声明时增加了一个关键字automatic,其他代码都一模一样,但是此时两个示例的仿真结果不同,即第一次调用add2x2的结果并没有受到第二次add2x2执行的影响,这是为什么呢?其实这主要与SystemVerilog中变量的生命周期有关,在SystemVerilog中lifetime主要是针对变量而言的,主要用于表述变量在整个仿真过程中是否一直占用空间。在SystemVerilog中,lifetime主要有两种:一种是static静态的,一种是automatic动态的,一般静态变量存在于整个仿真过程中直到仿真结束,而动态则仅存在于其被调用的过程中。变量声明时所在的代码决定了该变量具有静态的生命周期还是动态的生命周期,本文将通过示例对lifetime各种应用场景进行说明。
1 声明于module/program/interface/checker/task/function之外的变量,具有静态的生命周期
【示例】