iverilog/ivtest/ivltests/queue.v

333 lines
10 KiB
Verilog

module top;
reg pass;
integer res, status, job, value;
initial begin
pass = 1'b1;
// Use id = 1, type = 1 (FIFO) and a size of 3.
$q_initialize(1, 1, 3, status);
if (status !== 0) begin
$display("Failed to initialize queue, got %d", status);
pass = 1'b0;
end
// Use id = 2, type = 2 (LIFO) and a size of 2.
$q_initialize(2, 2, 2, status);
if (status !== 0) begin
$display("Failed to initialize queue, got %d", status);
pass = 1'b0;
end
// Use id = 3, type = 0 (undefined) and a size of 10.
$q_initialize(3, 0, 10, status);
if (status !== 4) begin
$display("Failed to find invalid queue type (0), got %d", status);
pass = 1'b0;
end
// Use id = 3, type = 3 (undefined) and a size of 10.
$q_initialize(3, 3, 10, status);
if (status !== 4) begin
$display("Failed to find invalid queue type (3), got %d", status);
pass = 1'b0;
end
// Use id = 3, type = 1 (FIFO) and a size of 0.
$q_initialize(3, 1, 0, status);
if (status !== 5) begin
$display("Failed to find invalid queue size (0), got %d", status);
pass = 1'b0;
end
// Use id = 3, type = 1 (FIFO) and a size of -1.
$q_initialize(3, 1, -1, status);
if (status !== 5) begin
$display("Failed to find invalid queue size (-1), got %d", status);
pass = 1'b0;
end
// This is a duplicate, so will fail.
$q_initialize(1, 2, 20, status);
if (status !== 6) begin
$display("Failed to report duplicate queue, got %d", status);
pass = 1'b0;
end
// Try to add to an invalid queue.
$q_add(3, 0, 0, status);
if (status !== 2) begin
$display("Failed to report invalid queue ($q_add), got %d", status);
pass = 1'b0;
end
// Try to remove from an invalid queue.
$q_remove(3, job, value, status);
if (status !== 2) begin
$display("Failed to report invalid queue ($q_remove), got %d", status);
pass = 1'b0;
end
// Try to check the status of an invalid queue.
res = $q_full(3, status);
if (status !== 2) begin
$display("Failed to report invalid queue ($q_full), got %d", status);
pass = 1'b0;
end
// Try to examine an invalid queue.
$q_exam(3, 1, value, status);
if (status !== 2) begin
$display("Failed to report invalid queue ($q_exam), got %d", status);
pass = 1'b0;
end
/*
* Check the LIFO code.
*/
// Add two element to the queue and check the queue state.
$q_add(2, 1, 1, status);
if (status !== 0) begin
$display("Failed to add element 1 to the LIFO, got %d", status);
pass = 1'b0;
end
res = $q_full(2, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (1), got %d (%d)", status, res);
pass = 1'b0;
end
$q_add(2, 1, 2, status);
if (status !== 0) begin
$display("Failed to add element 2 to the LIFO, got %d", status);
pass = 1'b0;
end
res = $q_full(2, status);
if (status !== 0 || res !== 1) begin
$display("Failed LIFO queue should be full, got %d (%d)", status, res);
pass = 1'b0;
end
// Check some of the queue statistics.
$q_exam(2, 1, value, status);
if (status !== 0 || value !== 2) begin
$display("Failed LIFO queue current length (full), got %d (%d)",
status, value);
pass = 1'b0;
end
$q_exam(2, 3, value, status);
if (status !== 0 || value !== 2) begin
$display("Failed LIFO queue maximum length (full), got %d (%d)",
status, value);
pass = 1'b0;
end
$q_exam(2, 5, value, status);
if (status !== 0 || value !== 0) begin
$display("Failed LIFO queue longest wait, got %d (%d)", status, value);
pass = 1'b0;
end
// Adding a third element should return queue full.
$q_add(2, 1, 3, status);
if (status !== 1) begin
$display("Failed to report the LIFO queue is full, got %d", status);
pass = 1'b0;
end
// Now remove the elements from the queue.
$q_remove(2, job, value, status);
if (status !== 0 || job !== 1 || value !== 2) begin
$display("Failed to remove element 2 from the LIFO, got %d (%d,%d)",
status, job, value);
pass = 1'b0;
end
res = $q_full(2, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (2), got %d (%d)", status, res);
pass = 1'b0;
end
$q_remove(2, job, value, status);
if (status !== 0 || job !== 1 || value !== 1) begin
$display("Failed to remove element 1 from the LIFO, got %d (%d,%d)",
status, job, value);
pass = 1'b0;
end
res = $q_full(2, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (3), got %d (%d)", status, res);
pass = 1'b0;
end
// Check some of the queue statistics.
$q_exam(2, 1, value, status);
if (status !== 0 || value !== 0) begin
$display("Failed LIFO queue current length (empty), got %d (%d)",
status, value);
pass = 1'b0;
end
$q_exam(2, 3, value, status);
if (status !== 0 || value !== 2) begin
$display("Failed LIFO queue maximum length (empty), got %d (%d)",
status, value);
pass = 1'b0;
end
$q_exam(2, 4, value, status);
if (status !== 0 || value !== 0) begin
$display("Failed LIFO queue shortest wait, got %d (%d)", status, value);
pass = 1'b0;
end
// Removing a third element should return queue empty.
$q_remove(2, job, value, status);
if (status !== 3) begin
$display("Failed to report the LIFO queue is empty, got %d", status);
pass = 1'b0;
end
/*
* Check the FIFO code.
*/
// Add three element to the queue and check the queue state.
$q_add(1, 2, 1, status);
if (status !== 0) begin
$display("Failed to add element 1 to the FIFO, got %d", status);
pass = 1'b0;
end
res = $q_full(1, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (4), got %d (%d)", status, res);
pass = 1'b0;
end
$q_add(1, 2, 2, status);
if (status !== 0) begin
$display("Failed to add element 2 to the FIFO, got %d", status);
pass = 1'b0;
end
res = $q_full(1, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (5), got %d (%d)", status, res);
pass = 1'b0;
end
$q_add(1, 2, 3, status);
if (status !== 0) begin
$display("Failed to add element 3 to the FIFO, got %d", status);
pass = 1'b0;
end
res = $q_full(1, status);
if (status !== 0 || res !== 1) begin
$display("Failed FIFO queue should be full, got %d (%d)", status, res);
pass = 1'b0;
end
// Check some of the queue statistics.
$q_exam(1, 1, value, status);
if (status !== 0 || value !== 3) begin
$display("Failed FIFO queue current length (full), got %d (%d)",
status, value);
pass = 1'b0;
end
$q_exam(1, 3, value, status);
if (status !== 0 || value !== 3) begin
$display("Failed FIFO queue maximum length (full), got %d (%d)",
status, value);
pass = 1'b0;
end
$q_exam(1, 5, value, status);
if (status !== 0 || value !== 0) begin
$display("Failed FIFO queue longest wait, got %d (%d)", status, value);
pass = 1'b0;
end
// Adding a fourth element should return queue full.
$q_add(1, 2, 4, status);
if (status !== 1) begin
$display("Failed to report the FIFO queue is full, got %d", status);
pass = 1'b0;
end
// Now remove some of the elements from the queue.
$q_remove(1, job, value, status);
if (status !== 0 || job !== 2 || value !== 1) begin
$display("Failed to remove element 1 from the FIFO, got %d (%d,%d)",
status, job, value);
pass = 1'b0;
end
res = $q_full(1, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (6), got %d (%d)", status, res);
pass = 1'b0;
end
$q_remove(1, job, value, status);
if (status !== 0 || job !== 2 || value !== 2) begin
$display("Failed to remove element 2 from the FIFO, got %d (%d,%d)",
status, job, value);
pass = 1'b0;
end
res = $q_full(1, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (7), got %d (%d)", status, res);
pass = 1'b0;
end
// Now add an element to wrap around the end.
$q_add(1, 2, 4, status);
if (status !== 0) begin
$display("Failed to add element 4 to the FIFO, got %d", status);
pass = 1'b0;
end
res = $q_full(1, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (8), got %d (%d)", status, res);
pass = 1'b0;
end
// Now empty the queue.
$q_remove(1, job, value, status);
if (status !== 0 || job !== 2 || value !== 3) begin
$display("Failed to remove element 3 from the FIFO, got %d (%d,%d)",
status, job, value);
pass = 1'b0;
end
res = $q_full(1, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (9), got %d (%d)", status, res);
pass = 1'b0;
end
$q_remove(1, job, value, status);
if (status !== 0 || job !== 2 || value !== 4) begin
$display("Failed to remove element 2 from the FIFO, got %d (%d,%d)",
status, job, value);
pass = 1'b0;
end
res = $q_full(1, status);
if (status !== 0 || res !== 0) begin
$display("Failed queue should not be full (A), got %d (%d)", status, res);
pass = 1'b0;
end
// Check some of the queue statistics.
$q_exam(1, 1, value, status);
if (status !== 0 || value !== 0) begin
$display("Failed FIFO queue current length (empty), got %d (%d)",
status, value);
pass = 1'b0;
end
$q_exam(1, 3, value, status);
if (status !== 0 || value !== 3) begin
$display("Failed FIFO queue maximum length (empty), got %d (%d)",
status, value);
pass = 1'b0;
end
$q_exam(1, 4, value, status);
if (status !== 0 || value !== 0) begin
$display("Failed FIFO queue shortest wait, got %d (%d)", status, value);
pass = 1'b0;
end
// Removing a fifth element should return queue empty.
$q_remove(1, job, value, status);
if (status !== 3) begin
$display("Failed to report the FIFO queue is empty, got %d", status);
pass = 1'b0;
end
if (pass) $display("PASSED");
end
endmodule