automatic task
task function1(bit [31:0] dat[]);
foreach(dat[i])begin
bit [2:0] offset = dat[i][2:0];
end
endtask
这个任务中,foreach的迭代索引变量 ”i“ 是自动变量,data[i][2:0]是由自动变量索引出来的一个数据。自动变量有个规定就是:声明于自动task或function中的变量对于域来说是本地的,其生命周期从这些task或function调用开始到这些task或function调用结束(引自赛宝龙所著的《IC验证工程师的口袋书》)。放到你这个例子中,自动索引变量 ”i“ 到foreach结束后就释放了,而变量 ”bit [2:0] offset“是静态变量,因为task没有被声明为automatic,那么offset默认就是静态的,这样就有矛盾了,这与C语言中,一个指针指向的空间被释放了但继续使用该指针一样,可以编译通过,但是运行就会崩溃。SystemVerilog是高级语言,直接在编译阶段就禁止这种操作了。
如果你想编译通过,可以在task前面加上automatic,也可以使用 "automatic bit [2:0] offset = dat[i][2:0]",这样task中所有的变量都被显式声明为automatic了