马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
在verilog1995中,所有的task都是static的,也就是说,该task调用之后就只会有一份copy,并行的调用该task会引起clobber argumentsand variables。这句是原话,我直接稍微加了点翻译整过来的。
问题1:那这个是不是就意味着以下代码是错误的呢?
- task dis;
- input A, B;
- output reg C;
- C = A + B;
- endtask
- always @ (*)
- dis(A1, B1, C1);
- always @ (*)
- dis(A2, B2, C2);
复制代码
然后在verilog2001,对task的定义增添了automatic,意味着,每一次调用task都会单独开辟一段存储空间,当然调用完之后就会自动释放该task。
问题2:以下的代码自己综合过,可以通过编译,VCS和NC都是可以的。那么按照2001中的解释,是不是以为着以下代码中task dis的定义就是automatic的呢?因为两个always肯定是并行调用task嘛。如果说是static的task定义,那么调用static的task的时候,不是只有一份copy吗?
- module task_test(A,B,C);
- input A, B;
- output reg C;
-
- reg D, E, F;
-
- task dis;
- input A, B;
- output reg C;
- C = A + B;
- endtask
- always @ (*) //should be included in procedure
- begin
- dis(A,B,C);
- end
- always @ (*)
- begin
- dis(D, E, F);
- end
- endmodule
复制代码
在SV中,又新添加了定义。即,可以在automatic的task中定义static的变量,也可以在static的task中定义automatic的变量。前者用于变量共享,后者用于堆栈存储变量。
问题3:默认的task到底是static还是automatic(verilog和SV两者)?
问题4:默认的static task中变量是不是是static而非automatic,而默认的automatic task中变量是不是automatic而非static?
问题5:task中的变量作用域(scope)是在task内吗?即是局部变量,对于class中的其他task是么有影响的吗?
关于问题5,我自己的解答是,如若task定义的时候代码写作如下,那么A中的变量可以在task中直接使用,task中不用定义变量。
- class A;
- ...
- endclass
- task A::B;
- ...
- endtask
复制代码
但是如果代码如下,则会报编译错误,说task B中没有定义变量,必须把变量定义上,即A中的变量定义没有传入B中,但是即便在B中定义了变量,task依然不能通过extern在class中定义,所报的错误为:too many actual arguments。虽然我目前还不知道这个错误的原因,也望各位解释。
- class A;
- ...extern task B;
- endclass
- task B;
- ...
- endtask
复制代码 |