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.