115 lines
3.0 KiB
Systemverilog
115 lines
3.0 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain.
|
|
// SPDX-FileCopyrightText: 2026 PlanV GmbH
|
|
// 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);
|
|
`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
|
|
// verilog_format: on
|
|
|
|
// Test dynamic array reduction methods (xor, sum, and, or, product)
|
|
// without 'with' clause in constraints.
|
|
// Each method is tested in a separate class to avoid conflicting constraints.
|
|
|
|
module t;
|
|
|
|
class XorTest;
|
|
rand bit [7:0] data[];
|
|
rand bit [7:0] result;
|
|
function new();
|
|
data = new[4];
|
|
endfunction
|
|
constraint c_size {data.size() == 4;}
|
|
constraint c_xor {result == data.xor();}
|
|
endclass
|
|
|
|
class SumTest;
|
|
rand bit [7:0] data[];
|
|
rand bit [7:0] result;
|
|
function new();
|
|
data = new[4];
|
|
endfunction
|
|
constraint c_size {data.size() == 4;}
|
|
constraint c_sum {result == data.sum();}
|
|
endclass
|
|
|
|
class AndTest;
|
|
rand bit [7:0] data[];
|
|
rand bit [7:0] result;
|
|
function new();
|
|
data = new[4];
|
|
endfunction
|
|
constraint c_size {data.size() == 4;}
|
|
constraint c_and {result == data.and();}
|
|
endclass
|
|
|
|
class OrTest;
|
|
rand bit [7:0] data[];
|
|
rand bit [7:0] result;
|
|
function new();
|
|
data = new[4];
|
|
endfunction
|
|
constraint c_size {data.size() == 4;}
|
|
constraint c_or {result == data.or();}
|
|
endclass
|
|
|
|
class ProductTest;
|
|
rand bit [7:0] data[];
|
|
rand bit [7:0] result;
|
|
function new();
|
|
data = new[4];
|
|
endfunction
|
|
constraint c_size {data.size() == 4;}
|
|
constraint c_prod {result == data.product();}
|
|
endclass
|
|
|
|
initial begin
|
|
static XorTest t_xor = new();
|
|
static SumTest t_sum = new();
|
|
static AndTest t_and = new();
|
|
static OrTest t_or = new();
|
|
static ProductTest t_prod = new();
|
|
|
|
repeat (10) begin
|
|
bit [7:0] exp;
|
|
int i;
|
|
|
|
// Test xor
|
|
`checkd(t_xor.randomize(), 1)
|
|
exp = 0;
|
|
foreach (t_xor.data[i]) exp ^= t_xor.data[i];
|
|
`checkh(t_xor.result, exp)
|
|
|
|
// Test sum
|
|
`checkd(t_sum.randomize(), 1)
|
|
exp = 0;
|
|
foreach (t_sum.data[i]) exp += t_sum.data[i];
|
|
`checkh(t_sum.result, exp)
|
|
|
|
// Test and
|
|
`checkd(t_and.randomize(), 1)
|
|
exp = 8'hff;
|
|
foreach (t_and.data[i]) exp &= t_and.data[i];
|
|
`checkh(t_and.result, exp)
|
|
|
|
// Test or
|
|
`checkd(t_or.randomize(), 1)
|
|
exp = 0;
|
|
foreach (t_or.data[i]) exp |= t_or.data[i];
|
|
`checkh(t_or.result, exp)
|
|
|
|
// Test product
|
|
`checkd(t_prod.randomize(), 1)
|
|
exp = 8'd1;
|
|
foreach (t_prod.data[i]) exp *= t_prod.data[i];
|
|
`checkh(t_prod.result, exp)
|
|
end
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
|
|
endmodule
|