关于automatic类型有疑问
时间:10-02
整理:3721RD
点击:
- program test;
- initial begin
- for(int i =0;i<16;i++)
- fork
- automaticint j=i;
- display(j);
- join_none#0;
- end
- endprogram
这个用vivado自带的仿真器仿真,结果是正常的15到0
- program test;
- initial begin
- for(int i =0;i<16;i++)begin
- automatic int j =i;
- fork
- display(j);
- join_none
- end#0;
- end
- endprogram
这个用vivado自带的仿真器仿真,结果全是15,为什么呢?
你都已经仿真出来不同了,主要是fork...join_none和变量作用域造成的。
你好,是不是这样理解:第二个例子里虽然j定义成了automatic类型,但是它没放到fork里面去,本质就和i没什么不同,都只有1份拷贝,所以都是15?
然后我有这个问题主要是因为最近在学SV,看SystemVerilog for Verification一书,无论第二版还是第3版,它在线程一章都有有写类似于我举例的两个例子,但它说两者是等效的,是不是书写错了,还是仿真工具的问题?
原书中的例子1:
- initial begin
- for(int j=0;j<3;j++)
- fork
- automatic int k=j;
- $write(k);
- join_none
- #0$display;
- end
原书中的例子2,它说这是例1的另一种写法:
- program automatic bug_free
- initial begin
- for(int j=0;j<3;j++)begin
- int k=j;
- fork
- $write(k);
- join_none
- end
- #0$display;
- end
- endprogram
书中的例子应该不会错的,经过了多版反复校验了的吧。
你没有仔细看你写的与书中的不同是在program定义是否为automatic。
问题是就算我在program一级,就声明automatic,结果还是16个15(用vivado仿真器).而且我前面的例子虽然在program声明中没加automatic,但是声明j时加了,我的理解是program一级加automatic作用就是相当于整个program块内部变量默认类型为automatic,所以这样写了,有什么不对的地方吗?
呵呵,也许吧,仿真器对语法解释是有不同,所以尽量用通用大众化的写法。
我一般采用你的第一种写法。
刚刚用modelsim试了下,是仿真器的问题。