193 lines
4.2 KiB
Coq
193 lines
4.2 KiB
Coq
|
|
// Icarus 0.6, snapshot 20020907
|
||
|
|
// ==================================================
|
||
|
|
// -- confused by disables from within a fork -- vvp fails
|
||
|
|
//
|
||
|
|
// -- to run, incant
|
||
|
|
// iverilog tt.v
|
||
|
|
// vvp a.out
|
||
|
|
//
|
||
|
|
// Veriwell
|
||
|
|
// ========
|
||
|
|
// -- OK
|
||
|
|
//
|
||
|
|
module top;
|
||
|
|
|
||
|
|
integer simple_fail, loop_fail, fork_fail, tlp_fail;
|
||
|
|
integer tfk_fail, tfk2_fail, tfk3_fail;
|
||
|
|
integer tfk2pos, tfk2nega, tfk2negb;
|
||
|
|
integer tfk3pos, tfk3nega, tfk3negb;
|
||
|
|
integer loop_cntr, tlp_cntr;
|
||
|
|
reg fred, abort;
|
||
|
|
|
||
|
|
initial begin
|
||
|
|
#1;
|
||
|
|
simple_fail = 0;
|
||
|
|
loop_fail = 0;
|
||
|
|
fork_fail = 0;
|
||
|
|
tlp_fail = 0;
|
||
|
|
tfk_fail = 0;
|
||
|
|
tfk2_fail = 0;
|
||
|
|
tfk2pos = 0;
|
||
|
|
tfk2nega = 1;
|
||
|
|
tfk2negb = 1;
|
||
|
|
tfk3pos = 0;
|
||
|
|
tfk3nega = 1;
|
||
|
|
tfk3negb = 1;
|
||
|
|
fred = 0;
|
||
|
|
abort = 1;
|
||
|
|
#4;
|
||
|
|
fred = 1;
|
||
|
|
#4
|
||
|
|
$display("Check disable:");
|
||
|
|
if(simple_fail) $display("***** simple block FAILED *****");
|
||
|
|
else $display("***** simple block PASSED *****");
|
||
|
|
if(loop_fail) $display("***** block with loop FAILED *****");
|
||
|
|
else $display("***** block with loop PASSED *****");
|
||
|
|
if(fork_fail) $display("***** forked block FAILED *****");
|
||
|
|
else $display("***** forked block PASSED *****");
|
||
|
|
if(tlp_fail) $display("***** task with loop FAILED *****");
|
||
|
|
else $display("***** task with loop PASSED *****");
|
||
|
|
if(tfk_fail) $display("***** task with forked block FAILED *****");
|
||
|
|
else $display("***** task with forked block PASSED *****");
|
||
|
|
if(tfk2_fail) $display("***** one forked block FAILED *****");
|
||
|
|
else $display("***** one forked block PASSED *****");
|
||
|
|
if(tfk3_fail) $display("***** the other forked block FAILED *****");
|
||
|
|
else $display("***** the other forked block PASSED *****");
|
||
|
|
$display("");
|
||
|
|
$finish(0);
|
||
|
|
end
|
||
|
|
|
||
|
|
// simple block disable
|
||
|
|
initial begin: block_name
|
||
|
|
#2;
|
||
|
|
disable block_name;
|
||
|
|
simple_fail = 1;
|
||
|
|
end
|
||
|
|
|
||
|
|
// more complex: block disable inside for-loop
|
||
|
|
initial begin
|
||
|
|
#2;
|
||
|
|
begin: configloop
|
||
|
|
for (loop_cntr = 0; loop_cntr < 3; loop_cntr=loop_cntr+1) begin
|
||
|
|
wait (fred);
|
||
|
|
if (abort) begin
|
||
|
|
disable configloop;
|
||
|
|
end
|
||
|
|
loop_fail = 1;
|
||
|
|
end
|
||
|
|
end // configloop block
|
||
|
|
if (loop_fail) $display("\n\ttime: %0t, loop_cntr: %0d",$time,loop_cntr);
|
||
|
|
end
|
||
|
|
|
||
|
|
// still more complex: disable from within a forked block
|
||
|
|
initial begin
|
||
|
|
#2;
|
||
|
|
begin: forked_tasks
|
||
|
|
fork
|
||
|
|
begin
|
||
|
|
#5;
|
||
|
|
fork_fail = 1;
|
||
|
|
end
|
||
|
|
begin
|
||
|
|
@(fred);
|
||
|
|
disable forked_tasks;
|
||
|
|
fork_fail = 1;
|
||
|
|
end
|
||
|
|
join
|
||
|
|
fork_fail = 1;
|
||
|
|
end //forked_tasks
|
||
|
|
end
|
||
|
|
|
||
|
|
// disables inside tasks
|
||
|
|
initial begin
|
||
|
|
task_with_loop;
|
||
|
|
end
|
||
|
|
initial begin
|
||
|
|
task_with_fork;
|
||
|
|
end
|
||
|
|
initial begin
|
||
|
|
task_with_fork2;
|
||
|
|
if(tfk2pos || tfk2nega || tfk2negb) tfk2_fail = 1;
|
||
|
|
end
|
||
|
|
initial begin
|
||
|
|
task_with_fork3;
|
||
|
|
if(tfk3pos || tfk3nega || tfk3negb) tfk3_fail = 1;
|
||
|
|
end
|
||
|
|
|
||
|
|
task task_with_loop;
|
||
|
|
begin
|
||
|
|
#2;
|
||
|
|
begin: configtlp
|
||
|
|
for (tlp_cntr = 0; tlp_cntr < 3; tlp_cntr=tlp_cntr+1) begin
|
||
|
|
wait (fred);
|
||
|
|
if (abort) begin
|
||
|
|
disable configtlp;
|
||
|
|
end
|
||
|
|
tlp_fail = 1;
|
||
|
|
end
|
||
|
|
end // configloop block
|
||
|
|
end
|
||
|
|
endtask // task_with_loop
|
||
|
|
|
||
|
|
task task_with_fork; // disable block whick calls fork
|
||
|
|
begin
|
||
|
|
#2;
|
||
|
|
begin: forked_tasks_in_task
|
||
|
|
fork
|
||
|
|
begin: alf
|
||
|
|
#5;
|
||
|
|
tfk_fail = 1;
|
||
|
|
end
|
||
|
|
begin: bet
|
||
|
|
@(fred);
|
||
|
|
disable forked_tasks_in_task;
|
||
|
|
tfk_fail = 1;
|
||
|
|
end
|
||
|
|
join
|
||
|
|
tfk_fail = 1;
|
||
|
|
end //forked_tasks_in_task
|
||
|
|
end
|
||
|
|
endtask // task_with_fork
|
||
|
|
|
||
|
|
task task_with_fork2; // disable *one* of the forked blocks
|
||
|
|
begin
|
||
|
|
#2;
|
||
|
|
begin: forked_tasks_in_task2
|
||
|
|
fork
|
||
|
|
begin: gam
|
||
|
|
#5;
|
||
|
|
tfk2pos = 1;
|
||
|
|
end
|
||
|
|
begin: delt
|
||
|
|
@(fred);
|
||
|
|
disable gam;
|
||
|
|
tfk2nega = 0;
|
||
|
|
end
|
||
|
|
join
|
||
|
|
tfk2negb = 0;
|
||
|
|
end //forked_tasks_in_task
|
||
|
|
end
|
||
|
|
endtask // task_with_fork
|
||
|
|
|
||
|
|
task task_with_fork3; // disable *one* of the forked blocks
|
||
|
|
begin
|
||
|
|
#2;
|
||
|
|
begin: forked_tasks_in_task3
|
||
|
|
fork
|
||
|
|
begin: eps
|
||
|
|
#5;
|
||
|
|
tfk3nega = 0;
|
||
|
|
end
|
||
|
|
begin: zet
|
||
|
|
@(fred);
|
||
|
|
disable zet;
|
||
|
|
tfk3pos = 1;
|
||
|
|
end
|
||
|
|
join
|
||
|
|
tfk3negb = 0;
|
||
|
|
end //forked_tasks_in_task
|
||
|
|
end
|
||
|
|
endtask // task_with_fork
|
||
|
|
|
||
|
|
endmodule
|