在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 10034|回复: 6

[求助] 【共5个问题,指点讨论】关于Verilog和SV中task及其内部变量是static还是automatic

[复制链接]
发表于 2013-8-15 13:51:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
在verilog1995中,所有的task都是static的,也就是说,该task调用之后就只会有一份copy,并行的调用该task会引起clobber argumentsand variables。这句是原话,我直接稍微加了点翻译整过来的。

问题1:那这个是不是就意味着以下代码是错误的呢?




  1. task dis;
  2.      input A, B;
  3.      output reg C;
  4.      C = A + B;
  5. endtask

  6. always @ (*)
  7.      dis(A1, B1, C1);

  8. always @ (*)
  9.      dis(A2, B2, C2);


复制代码



然后在verilog2001,对task的定义增添了automatic,意味着,每一次调用task都会单独开辟一段存储空间,当然调用完之后就会自动释放该task。

问题2:以下的代码自己综合过,可以通过编译,VCS和NC都是可以的。那么按照2001中的解释,是不是以为着以下代码中task dis的定义就是automatic的呢?因为两个always肯定是并行调用task嘛。如果说是static的task定义,那么调用static的task的时候,不是只有一份copy吗?




  1. module task_test(A,B,C);
  2.    input A, B;
  3.    output reg C;
  4.    
  5.    reg  D, E, F;
  6.    
  7. task dis;
  8.   input A, B;
  9.   output reg C;
  10.   C = A + B;
  11. endtask

  12. always @ (*) //should be included in procedure
  13.   begin
  14.     dis(A,B,C);
  15.   end

  16. always @ (*)
  17.   begin
  18.     dis(D, E, F);
  19.   end
  20. 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中不用定义变量。




  1. class A;
  2. ...
  3. endclass

  4. task A::B;
  5. ...
  6. endtask


复制代码


但是如果代码如下,则会报编译错误,说task B中没有定义变量,必须把变量定义上,即A中的变量定义没有传入B中,但是即便在B中定义了变量,task依然不能通过extern在class中定义,所报的错误为:too many actual arguments。虽然我目前还不知道这个错误的原因,也望各位解释。




  1. class A;
  2. ...extern task B;
  3. endclass

  4. task B;
  5. ...
  6. endtask


复制代码
发表于 2013-12-26 17:08:26 | 显示全部楼层
顶起讨论
发表于 2013-12-26 17:11:10 | 显示全部楼层
问题3答案:
Systemverilog中,module和program块中,缺省使用静态存储;如果想使用自动存储,需加入automatic关键词。
发表于 2013-12-26 17:48:23 | 显示全部楼层
问题1: compile 不會fail, 只要不是同一時間 call task dis, simulation result 就不會超出你的 expect, 但若同一個時間點 call task, 會有 unexpected result.

问题2: code 要在 task 後加 automatic, 也就是 "task automatic dis" 才是 automatic, 不然就是 static, compile 不會去判斷是否由兩個地方 call, 來決定是 static 或 automatic
发表于 2013-12-26 18:10:15 | 显示全部楼层
问题3: task 後没寫 automatic 就是 static
问题4: task 中宣告的 variable, default 是非 static 的, 但不要和 automatic 搞混, automatic 是 task 才用到的, 可以把它想成, 每 call 一次宣告為 automatic 的 task, 就又產生一新的此 task, task 內的 variable 又是新的, 只為此 call 所用.
问题5: 是的. task中的变量作用域(scope)只在task内.

代码如下, compile 應不會 error
class A;
    extern task B;
endclass
  
task A::B;
....
endtask
发表于 2013-12-26 21:56:04 | 显示全部楼层
很優秀
发表于 2013-12-27 10:02:27 | 显示全部楼层
第5个问题  应该把它理解为面向对象的问题,而不单单是sv的问题。
class A;
    extern task B;
endclass
  
task A::B;
....
endtask
意思是 taskB 是classA 的一个方法成员 ,只不过采用外部定义的方式。classA中定义的var是它的属性当然可以在A的任何一个方法成员中使用。方法B中的变量是局部变量。
class A;
...extern task B;
endclass

task B;
...
endtask
这种写法 是有问题的,当然可以这样把B 写为类A的友元方法然后调用,但A和B的关系仅仅是同级关系而非从属关系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-20 03:16 , Processed in 0.023699 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表