Files
iverilog/ivtest/ivltests/queue_stat.v
T
Stephen Williams cea237b407 Add ivtest to the iverilog source tree
By adding ivtest to the iverilog source tree, it is easier to keep
the regression test synchronized with the source that is being tested.
This should be especially helpful for PRs that add a new feature, and
have a matching ivtest PR with the regression test for that feature.
2022-01-15 10:18:50 -08:00

239 lines
6.1 KiB
Verilog

/*
* I expect the following statistics results:
* 0 x 0 x x x
* 1 x 1 x 0 0
* 2 1 2 x 1 0
* 3 1 3 x 2 1
* 2 1 3 3 2 2
* 2 1 3 3 3 2
* 3 1 3 3 4 2
* 1 1 3 3 1 3
* 0 1 3 2 x 3
* 1 2 3 2 0 2
* 0 2 3 1 x 3
* 1 3 3 1 0 2
* 2 2 3 1 1 2
* 3 2 3 1 2 2
*
* x implies there is no defined value for that statistic.
*/
module top;
reg pass;
integer res, status, value, value2;
integer id, job, item;
initial begin
pass = 1'b1;
id = 1;
// Use id = 1, type = 1 (FIFO) and a size of 5.
$display("----- INIT -----");
$q_initialize(id, 1, 5, status);
if (status !== 0) begin
$display("Failed to initialize queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
// Add an element to the queue.
job = 1;
item = 10;
$display("----- ADD -----");
$q_add(id, job, item, status);
if (status !== 0) begin
$display("Failed to add element to the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1;
// Add a second element to the queue.
job = 1;
item = 20;
$display("----- ADD -----");
$q_add(id, job, item, status);
if (status !== 0) begin
$display("Failed to add element to the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1;
// Add a third element to the queue.
job = 1;
item = 30;
$display("----- ADD -----");
$q_add(id, job, item, status);
if (status !== 0) begin
$display("Failed to add element to the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1;
// Remove an element from the queue.
$display("----- REMOVE -----");
$q_remove(id, value, value2, status);
if (status !== 0) begin
$display("Failed to remove element from the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1
print_stats(id);
#1;
// Add a fourth element to the queue.
job = 1;
item = 30;
$display("----- ADD -----");
$q_add(id, job, item, status);
if (status !== 0) begin
$display("Failed to add element to the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1;
// Remove two elements from the queue.
$display("----- REMOVE TWO -----");
$q_remove(id, value, value2, status);
if (status !== 0) begin
$display("Failed to remove element (1) from the queue, got %d", status);
pass = 1'b0;
end
$q_remove(id, value, value2, status);
if (status !== 0) begin
$display("Failed to remove element (2) from the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1;
// Remove an element from the queue.
$display("----- REMOVE -----");
$q_remove(id, value, value2, status);
if (status !== 0) begin
$display("Failed to remove element from the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1;
// Add a fifth element to the queue.
job = 1;
item = 50;
$display("----- ADD -----");
$q_add(id, job, item, status);
if (status !== 0) begin
$display("Failed to add element to the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1;
// Remove an element from the queue.
$display("----- REMOVE -----");
$q_remove(id, value, value2, status);
if (status !== 0) begin
$display("Failed to remove element from the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#7;
// Add a sixth element to the queue.
job = 1;
item = 60;
$display("----- ADD -----");
$q_add(id, job, item, status);
if (status !== 0) begin
$display("Failed to add element to the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1;
// Add a seventh element to the queue.
job = 1;
item = 70;
$display("----- ADD -----");
$q_add(id, job, item, status);
if (status !== 0) begin
$display("Failed to add element to the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
#1;
// Add a eight element to the queue.
job = 1;
item = 80;
$display("----- ADD -----");
$q_add(id, job, item, status);
if (status !== 0) begin
$display("Failed to add element to the queue, got %d", status);
pass = 1'b0;
end
print_stats(id);
if (pass) $display("PASSED");
end
task print_stats;
input id;
integer id;
integer len, inter, max, short, long, avg, status;
// Icarus uses a status code of 10 to indicate no statistics available.
begin
len = 32'bx;
inter = 32'bx;
max = 32'bx;
short = 32'bx;
long = 32'bx;
avg = 32'bx;
$display("Queue statistics at time %0d", $time);
// Get the queue length.
$q_exam(id, 1, len, status);
if ((status !== 0) && (status !== 10)) begin
$display(" Failed to get the length, status %0d", status);
pass = 1'b0;
end
// Get the mean inter-arrival time.
$q_exam(id, 2, inter, status);
if ((status !== 0) && (status !== 10)) begin
$display(" Failed to get the inter-arrival, status %0d", status);
pass = 1'b0;
end
// Get the maximum length.
$q_exam(id, 3, max, status);
if ((status !== 0) && (status !== 10)) begin
$display(" Failed to get the maximum length, status %0d", status);
pass = 1'b0;
end
// Get the shortest wait time.
$q_exam(id, 4, short, status);
if ((status !== 0) && (status !== 10)) begin
$display(" Failed to get the shortest wait time, status %0d", status);
pass = 1'b0;
end
// Get the longest wait time.
$q_exam(id, 5, long, status);
if ((status !== 0) && (status !== 10)) begin
$display(" Failed to get the longest wait time, status %0d", status);
pass = 1'b0;
end
// Get the average wait time.
$q_exam(id, 6, avg, status);
if ((status !== 0) && (status !== 10)) begin
$display(" Failed to get the average wait time, status %0d", status);
pass = 1'b0;
end
$display(" %0d, %0d, %0d, %0d, %0d, %0d",
len, inter, max, short, long, avg);
end
endtask
endmodule