微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 关于automatic类型有疑问

关于automatic类型有疑问

时间:10-02 整理:3721RD 点击:

  1. program test;

  2. initial begin
  3. for(int i =0;i<16;i++)
  4. fork
  5. automaticint j=i;
  6. display(j);
  7. join_none#0;
  8. end

  9. endprogram

复制代码


这个用vivado自带的仿真器仿真,结果是正常的15到0

  1. program test;

  2. initial begin
  3. for(int i =0;i<16;i++)begin
  4. automatic int j =i;
  5. fork
  6. display(j);
  7. join_none
  8. end#0;
  9. end
  10. endprogram

复制代码



这个用vivado自带的仿真器仿真,结果全是15,为什么呢?

你都已经仿真出来不同了,主要是fork...join_none和变量作用域造成的。

你好,是不是这样理解:第二个例子里虽然j定义成了automatic类型,但是它没放到fork里面去,本质就和i没什么不同,都只有1份拷贝,所以都是15?
然后我有这个问题主要是因为最近在学SV,看SystemVerilog for Verification一书,无论第二版还是第3版,它在线程一章都有有写类似于我举例的两个例子,但它说两者是等效的,是不是书写错了,还是仿真工具的问题?
原书中的例子1:

  1. initial begin
  2. for(int j=0;j<3;j++)
  3. fork
  4. automatic int k=j;
  5. $write(k);
  6. join_none
  7. #0$display;
  8. end

复制代码


原书中的例子2,它说这是例1的另一种写法:

  1. program automatic bug_free
  2. initial begin
  3. for(int j=0;j<3;j++)begin
  4. int k=j;
  5. fork
  6. $write(k);
  7. join_none
  8. end
  9. #0$display;
  10. end
  11. endprogram

复制代码

书中的例子应该不会错的,经过了多版反复校验了的吧。
你没有仔细看你写的与书中的不同是在program定义是否为automatic。

问题是就算我在program一级,就声明automatic,结果还是16个15(用vivado仿真器).而且我前面的例子虽然在program声明中没加automatic,但是声明j时加了,我的理解是program一级加automatic作用就是相当于整个program块内部变量默认类型为automatic,所以这样写了,有什么不对的地方吗?

呵呵,也许吧,仿真器对语法解释是有不同,所以尽量用通用大众化的写法。
我一般采用你的第一种写法。

刚刚用modelsim试了下,是仿真器的问题。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top