109 lines
2.6 KiB
Verilog
109 lines
2.6 KiB
Verilog
module top;
|
|
reg [1:0] a, b, c, d, e;
|
|
reg passed;
|
|
|
|
initial begin
|
|
a = 2'b00;
|
|
b = 2'b00;
|
|
c = 2'b00;
|
|
d = 2'b00;
|
|
e = 2'b00;
|
|
passed =1'b1;
|
|
#2;
|
|
// Check that only the first process has run so far.
|
|
if (a !== 2'b01) begin
|
|
$display("First process in named fork has not run: %b", a);
|
|
passed = 1'b0;
|
|
end
|
|
if (b !== 2'b01) begin
|
|
$display("First process in named block has not run: %b", b);
|
|
passed = 1'b0;
|
|
end
|
|
if (c !== 2'b01) begin
|
|
$display("First process in parent ending has not run: %b", c);
|
|
passed = 1'b0;
|
|
end
|
|
if (d !== 2'b01) begin
|
|
$display("First process in parent alive has not run: %b", d);
|
|
passed = 1'b0;
|
|
end
|
|
if (e !== 2'b01) begin
|
|
$display("First process in parent ending (disable) has not run: %b", e);
|
|
passed = 1'b0;
|
|
end
|
|
// This external lexical disable should disable the second process even
|
|
// though the parent has already ended.
|
|
disable top.be_name;
|
|
#2;
|
|
// Check that the second process only runs for the parent ending
|
|
// and alive cases.
|
|
if (a !== 2'b01) begin
|
|
$display("Second process in named fork ran: %b", a);
|
|
passed = 1'b0;
|
|
end
|
|
if (b !== 2'b01) begin
|
|
$display("Second process in named block ran: %b", b);
|
|
passed = 1'b0;
|
|
end
|
|
if (c !== 2'b11) begin
|
|
$display("Second process in parent ending has not run: %b", c);
|
|
passed = 1'b0;
|
|
end
|
|
if (d !== 2'b11) begin
|
|
$display("Second process in parent alive has not run: %b", d);
|
|
passed = 1'b0;
|
|
end
|
|
if (e !== 2'b01) begin
|
|
$display("Second process in parent ending (disable) ran: %b", e);
|
|
passed = 1'b0;
|
|
end
|
|
|
|
if (passed) $display("PASSED");
|
|
end
|
|
|
|
// Verify that disabling a named fork kills any detached processes.
|
|
initial begin
|
|
fork: fa_name
|
|
#1 a[0] = 1'b1;
|
|
#3 a[1] = 1'b1;
|
|
join_any
|
|
disable fa_name;
|
|
end
|
|
|
|
// Verify that disabling a named block kills any detached processes.
|
|
initial begin: bb_name
|
|
fork
|
|
#1 b[0] = 1'b1;
|
|
#3 b[1] = 1'b1;
|
|
join_any
|
|
disable bb_name;
|
|
end
|
|
|
|
// Verify that a detached process survives the parent ending.
|
|
initial begin
|
|
fork
|
|
#1 c[0] = 1'b1;
|
|
#3 c[1] = 1'b1;
|
|
join_any
|
|
end
|
|
|
|
// Verify that a detached process runs if the parent is still alive.
|
|
initial begin
|
|
fork
|
|
#1 d[0] = 1'b1;
|
|
#3 d[1] = 1'b1;
|
|
join_any
|
|
#4;
|
|
end
|
|
|
|
// Verify that a detached process survives the parent ending, but can
|
|
// still be disabled lexically by disabling the block that started it.
|
|
initial begin: be_name
|
|
fork
|
|
#1 e[0] = 1'b1;
|
|
#3 e[1] = 1'b1;
|
|
join_any
|
|
end
|
|
|
|
endmodule
|