SystemVerilog线程.循环中嵌套fork join_none

分析下列代码的输出结果:

代码1:

module test();

	initial begin
		for(int j =0; j < 3; j++)
		fork
			$write(j);
		join_none
	 #0 $display("\n");
	end
endmodule

 改代码在循环中内嵌 fsk...join_none,是一种不良代码的执行过程,该代码的执行过程如下:
代码2:

j 语句
0 for (j=0; ...
0 产生线程 $write(j) [线程 0]
1 j++	j=1
1 产生线程 Swrite (j )[线程 1]
2 j++ i=2
2 产生线程 Sprite(j ) (线程 2]
3 j+ + j=3
3 joinnone
3 # 0
3 $write(j ) [线程 0:j=3]
3 $write(j ) [线程 1:j=3]
3 $write(j ) [线程 1:j=3]
3 $display ( )

注意输出结果是3 3 3 而不是2 2 2 和0 1 2 

同理,下列代码的运行结果如下:

代码3:

module test();

	initial begin
		for(int j =0; j <= 3; j++)
		fork
			$write(j);
		join_none
	 #0 $display("\n");
	end
endmodule

综上在循环中嵌套fork...join_none语句当使用自动变量来保存变量的拷贝。
代码4:

module test();

	initial begin
		for(int j =0; j < 3; j++)
		fork
			automatic int k = j;
			$write(k);
		join_none
	 #0 $display("\n");
	end
endmodule

该代码的运行结果如下:

 分析:代码4中fork...join_none 块被分割成两个部分。。带初始化的自动(automatic)变量声明在for循环的线程中运行。在每轮循环中,k的一个拷贝创建并被设置为j的当前值,然后fork...join_none ($write)被调度,包括k的拷贝。在循环完成后,#0阻塞了当前线程,因此三个线程一起运行,打印出各自拷贝值k。当线程运行完毕后,在当前时间片已经没有其他事件残留,这时SystemVerilog就会进到下一个语句执行$display。代码的执行步骤如下:

 

 代码4可以在fork.. join_none的外部声明自动变量,适合在带自动存储的程序内使用,例如

代码5:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值