mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-09-03 08:25:32 +02:00
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.
239 lines
6.1 KiB
Verilog
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
|