76 lines
1.8 KiB
Systemverilog
76 lines
1.8 KiB
Systemverilog
module fork_examples;
|
|
|
|
bit a, b;
|
|
|
|
initial begin
|
|
a = 1'b0;
|
|
b = 1'b0;
|
|
repeat(5) begin
|
|
#50 a = 1'b1;
|
|
#50 b = 1'b1;
|
|
#50 a = 1'b0;
|
|
#50 a = 1'b1;
|
|
#100 b = 1'b0;
|
|
end
|
|
end
|
|
|
|
initial begin
|
|
// example 1
|
|
fork
|
|
forever begin
|
|
@(a);
|
|
$display("Example 1: Observed a change in a, new value = %b at %0t", a, $time);
|
|
end
|
|
@(negedge b);
|
|
join_any
|
|
disable fork;
|
|
$display("Exiting example 1 at %0t", $time);
|
|
|
|
// example 2
|
|
fork
|
|
begin
|
|
fork
|
|
forever begin
|
|
@(a);
|
|
$display("Example 2: Observed a change in a, new value = %b at %0t", a, $time);
|
|
end
|
|
forever begin
|
|
@(b);
|
|
$display("Example 2: Observed a change in b, new value = %b at %0t", b, $time);
|
|
end
|
|
join_none
|
|
end
|
|
begin
|
|
#300;
|
|
$display("Example 2: After 300 at %0t", $time);
|
|
end
|
|
join
|
|
$display("Exiting example 2 at %0t", $time);
|
|
|
|
// example 3
|
|
fork
|
|
begin
|
|
#100;
|
|
$display("Example 3: After 100 at %0t", $time);
|
|
end
|
|
wait(a == b);
|
|
join
|
|
$display("Exiting example 3 at %0t", $time);
|
|
|
|
// example 4 - which values of i will be displayed?
|
|
for (int i = 0; i < 3; i++) begin
|
|
fork
|
|
$display("Example 4: i = %0d at %0t", i, $time);
|
|
join_none
|
|
end
|
|
$display("Exiting example 4 at %0t", $time);
|
|
|
|
#200; // some delay
|
|
|
|
// example 5 - which threads will be killed?
|
|
disable fork;
|
|
$display("Exiting example 5 at %0t", $time);
|
|
end
|
|
|
|
endmodule : fork_examples
|