231 lines
5.0 KiB
Systemverilog
231 lines
5.0 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain.
|
|
// SPDX-FileCopyrightText: 2024 Wilson Snyder
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
// verilog_format: off
|
|
`define stop $stop
|
|
`define checkd(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0d exp=%0d\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
|
|
// verilog_format: on
|
|
|
|
// Test that item.index in array reduction constraints is supported
|
|
// Test 1: Basic item.index usage with sum
|
|
class Test1_BasicIndex;
|
|
rand bit [3:0] data[5];
|
|
|
|
constraint c {
|
|
// Sum of indices: 0+1+2+3+4 = 10
|
|
// Cast to match result type (32-bit)
|
|
data.sum() with (item.index) <= 10;
|
|
}
|
|
endclass
|
|
|
|
// Test 2: item.index with item in expression
|
|
class Test2_IndexPlusItem;
|
|
rand bit [3:0] data[5];
|
|
|
|
constraint c {
|
|
// Cast both to same width for expression
|
|
data.sum() with (int'(item) + item.index) <= 50;
|
|
}
|
|
endclass
|
|
|
|
// Test 3: Conditional based on index
|
|
class Test3_ConditionalOnIndex;
|
|
rand bit [3:0] data[5];
|
|
|
|
constraint c {
|
|
// Only sum items at even indices
|
|
data.sum() with ((item.index % 2 == 0) ? int'(item) : 0) <= 20;
|
|
}
|
|
endclass
|
|
|
|
// Test 4: item.index with product
|
|
class Test4_ProductWithIndex;
|
|
rand bit [2:0] data[4];
|
|
|
|
constraint c {
|
|
// Product of (item + index + 1) to avoid zero
|
|
data.product() with (int'(item) + item.index + 1) <= 1000;
|
|
}
|
|
endclass
|
|
|
|
// Test 5: item.index with xor (using 32-bit result)
|
|
class Test5_XorWithIndex;
|
|
rand int data[4];
|
|
|
|
constraint c {
|
|
// Use int array so no casting needed
|
|
data.xor() with (item ^ item.index) >= 0;
|
|
}
|
|
endclass
|
|
|
|
// Test 6: item.index with and (using 32-bit result)
|
|
class Test6_AndWithIndex;
|
|
rand int data[4];
|
|
|
|
constraint c {data.and() with (item | item.index) != 0;}
|
|
endclass
|
|
|
|
// Test 7: item.index with or (using 32-bit result)
|
|
class Test7_OrWithIndex;
|
|
rand int data[4];
|
|
|
|
constraint c {data.or() with (item & item.index) >= 0;}
|
|
endclass
|
|
|
|
// Test 8: Complex expression with multiple uses
|
|
class Test8_ComplexExpression;
|
|
rand bit [3:0] data[6];
|
|
|
|
constraint c {
|
|
// Use item.index multiple times in expression
|
|
data.sum() with (int'(item) * item.index + item.index) <= 100;
|
|
}
|
|
endclass
|
|
|
|
// Test 9: Just item.index (no item reference)
|
|
class Test9_JustIndex;
|
|
rand bit [3:0] data[5];
|
|
|
|
constraint c {
|
|
// This tests sum of just indices
|
|
data.sum() with (item.index * 2) == 20; // 0+2+4+6+8 = 20
|
|
}
|
|
endclass
|
|
|
|
// Test 10: Dynamic array with item.index
|
|
class Test10_DynamicArray;
|
|
rand bit [3:0] dyn_data[];
|
|
|
|
function new();
|
|
dyn_data = new[5];
|
|
endfunction
|
|
|
|
constraint c_size {dyn_data.size() == 5;}
|
|
|
|
constraint c {
|
|
// item.index with dynamic array
|
|
dyn_data.sum() with (item.index) <= 10;
|
|
}
|
|
endclass
|
|
|
|
// Test 11: Larger array (16 elements)
|
|
class Test11_LargerArray;
|
|
rand bit [3:0] data[16];
|
|
|
|
constraint c {
|
|
// Sum of indices: 0+1+2+...+15 = 120
|
|
data.sum() with (item.index) <= 120;
|
|
}
|
|
endclass
|
|
|
|
// Test 12: Large array with complex expression
|
|
class Test12_LargeComplex;
|
|
rand int data[20];
|
|
|
|
constraint c {
|
|
// Complex expression with larger array
|
|
data.sum() with ((item.index < 10) ? item : item * 2) <= 5000;
|
|
foreach (data[i]) data[i] inside {[1 : 100]};
|
|
}
|
|
endclass
|
|
|
|
// Test 13: Very large array (stress test)
|
|
class Test13_VeryLargeArray;
|
|
rand int data[50];
|
|
|
|
constraint c {
|
|
// Test scalability - sum of first 50 indices = 1225
|
|
data.sum() with (item.index) == 1225;
|
|
}
|
|
endclass
|
|
|
|
module t;
|
|
initial begin
|
|
Test1_BasicIndex t1;
|
|
Test2_IndexPlusItem t2;
|
|
Test3_ConditionalOnIndex t3;
|
|
Test4_ProductWithIndex t4;
|
|
Test5_XorWithIndex t5;
|
|
Test6_AndWithIndex t6;
|
|
Test7_OrWithIndex t7;
|
|
Test8_ComplexExpression t8;
|
|
Test9_JustIndex t9;
|
|
Test10_DynamicArray t10;
|
|
Test11_LargerArray t11;
|
|
Test12_LargeComplex t12;
|
|
Test13_VeryLargeArray t13;
|
|
int i;
|
|
|
|
// Test 1: Basic index
|
|
t1 = new;
|
|
i = t1.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 2: Index plus item
|
|
t2 = new;
|
|
i = t2.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 3: Conditional on index
|
|
t3 = new;
|
|
i = t3.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 4: Product with index
|
|
t4 = new;
|
|
i = t4.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 5: XOR with index
|
|
t5 = new;
|
|
i = t5.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 6: AND with index
|
|
t6 = new;
|
|
i = t6.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 7: OR with index
|
|
t7 = new;
|
|
i = t7.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 8: Complex expression
|
|
t8 = new;
|
|
i = t8.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 9: Just index
|
|
t9 = new;
|
|
i = t9.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 10: Dynamic array
|
|
t10 = new;
|
|
i = t10.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 11: Larger array (16 elements)
|
|
t11 = new;
|
|
i = t11.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 12: Large complex
|
|
t12 = new;
|
|
i = t12.randomize();
|
|
`checkd(i, 1)
|
|
|
|
// Test 13: Very large array (50 elements)
|
|
t13 = new;
|
|
i = t13.randomize();
|
|
`checkd(i, 1)
|
|
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
endmodule
|