systemverilog disable在task中使用的坑

disable的使用的坑,disable用于结束某个进程。

1.常用的方式,和fork结合使用,控制进程。

如下,j<2,通过for循环启动两个进程,每个进程中又有两个进程,其中一个通过disable(disable 跑p1)来控制另外一个:

`timescale 1ns/1ns
module top();

	initial begin
		fork 
			begin
				for(int j=0;j<2;j++) begin
					fork
						automatic int k=j;
						begin:p1
							while(1) begin
								$display("k=%0d,time=%0t",k,$time);
								#1ns;
							end
						end
						begin
							repeat(k*4) #3ns;
							disable p1;
							$display("disable p1,k=%0d,time=%0t",k,$time);
						end
					join_none
				end
				wait fork;
			end
		join
		$finish;
	end

endmodule

仿真结果,第一个进程j=0,进程开始后,其中第二个子进程直接disable结束第一个子进程,然后结束整个进程。第二进程j=1,进程开始后,其中第二个子进程等了4*3=12ns后才disable结束第一个子进程,然后结束整个进程。这里两个进程中的disable操作没有相互影响,即使第一个子进程名字都是p1.:

k=0,time=0
disable p1,k=0,time=0
k=1,time=0
k=1,time=1
k=1,time=2
k=1,time=3
k=1,time=4
k=1,time=5
k=1,time=6
k=1,time=7
k=1,time=8
k=1,time=9
k=1,time=10
k=1,time=11
disable p1,k=1,time=12

2.如果在task中使用disable需要注意:

比如,将上面代码,修改为如下:

`timescale 1ns/1ns

class P;

function new();
	$display("create lab");
endfunction

task proc(int a);		
	fork
		begin:p1
			while(1) begin
				$display("a=%0d,time=%0t",a,$time);
				#1ns;
			end
		end
		begin
			repeat(a*2) #3ns;
			disable p1;
			$display("disable p1,a=%0d,time=%0t",a,$time);
		end
	join

endtask

endclass

module top();
	P p1;
	initial begin

		p1=new();
		$display("now class proc!!\n\n");
		$display("normal");
		p1.proc(2);
		$display("normal end\n\n\n");

		fork
			begin
				p1.proc(2);
			end
			begin
				p1.proc(100);
			end
		join
		$finish;
	end
endmodule

仿真结果,正常情况下,p1.proc(100),这个task调用会在100*2*3+12=612ns时disable掉p1,所以进程p1在此之前会一直打印,但是结果中并没有,这是因为p1.proc(2)在2*2*3+12=24ns时disable掉了p1进程,并且将p1.proc(100)的p1进程也disable掉了

create lab
now class proc!!


normal
a=2,time=0
a=2,time=1
a=2,time=2
a=2,time=3
a=2,time=4
a=2,time=5
a=2,time=6
a=2,time=7
a=2,time=8
a=2,time=9
a=2,time=10
a=2,time=11
disable p1,a=2,time=12
normal end



a=2,time=12
a=100,time=12
a=2,time=13
a=100,time=13
a=2,time=14
a=100,time=14
a=2,time=15
a=100,time=15
a=2,time=16
a=100,time=16
a=2,time=17
a=100,time=17
a=2,time=18
a=100,time=18
a=2,time=19
a=100,time=19
a=2,time=20
a=100,time=20
a=2,time=21
a=100,time=21
a=2,time=22
a=100,time=22
a=2,time=23
a=100,time=23
disable p1,a=2,time=24
disable p1,a=100,time=612
$finish called from file "lab13_fork.sv", line 99.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值