iverilog/ivtest/ivltests/fork_join_dis.v

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