verilator/test_regress/t/t_randomize_method.v
2020-12-07 17:55:22 -05:00

137 lines
3.0 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2020 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
typedef enum bit[15:0] {
ONE = 3,
TWO = 5,
THREE = 8,
FOUR = 13
} Enum;
typedef struct packed {
int a;
bit b;
Enum c;
} StructInner;
typedef struct packed {
bit x;
StructInner s;
Enum y;
longint z;
} StructOuter;
class BaseCls;
endclass
class Inner;
rand logic[7:0] a;
rand logic[15:0] b;
rand logic[3:0] c;
rand logic[11:0] d;
int e;
function new;
a = 0;
b = 0;
c = 0;
d = 0;
e = 0;
endfunction
endclass
class DerivedCls extends BaseCls;
rand Inner i;
rand int j;
int k;
rand Enum l;
function new;
i = new;
j = 0;
k = 0;
l = ONE;
endfunction
endclass
class OtherCls;
logic[63:0] v;
rand logic[63:0] w;
rand logic[47:0] x;
rand logic[31:0] y;
rand logic[23:0] z;
rand StructOuter str;
function new;
v = 0;
w = 0;
x = 0;
y = 0;
z = 0;
str = '{x: 1'b0, y: ONE, z: 64'd0, s: '{a: 32'd0, b: 1'b0, c: ONE}};
endfunction
endclass
module t (/*AUTOARG*/);
bit ok = 0;
longint checksum;
task checksum_next(longint x);
checksum = x ^ {checksum[62:0],checksum[63]^checksum[2]^checksum[0]};
endtask;
DerivedCls derived;
OtherCls other;
BaseCls base;
initial begin
int rand_result;
longint prev_checksum;
for (int i = 0; i < 10; i++) begin
derived = new;
other = new;
base = derived;
rand_result = base.randomize();
rand_result = other.randomize();
if (!(derived.l inside {ONE, TWO, THREE, FOUR})) $stop;
if (!(other.str.s.c inside {ONE, TWO, THREE, FOUR})) $stop;
if (!(other.str.y inside {ONE, TWO, THREE, FOUR})) $stop;
if (derived.i.e != 0) $stop;
if (derived.k != 0) $stop;
if (other.v != 0) $stop;
checksum = 0;
checksum_next(longint'(derived.i.a));
checksum_next(longint'(derived.i.b));
checksum_next(longint'(derived.i.c));
checksum_next(longint'(derived.j));
checksum_next(longint'(derived.l));
checksum_next(longint'(other.w));
checksum_next(longint'(other.x));
checksum_next(longint'(other.y));
checksum_next(longint'(other.z));
checksum_next(longint'(other.str.x));
checksum_next(longint'(other.str.y));
checksum_next(longint'(other.str.z));
checksum_next(longint'(other.str.s.a));
checksum_next(longint'(other.str.s.b));
checksum_next(longint'(other.str.s.c));
$write("checksum: %d\n", checksum);
if (i > 0 && checksum != prev_checksum) begin
ok = 1;
end
prev_checksum = checksum;
end
if (ok) begin
$write("*-* All Finished *-*\n");
$finish;
end
else $stop;
end
endmodule