verilator/test_regress/t/t_randomize_method.v
Ryszard Rozak 87ac61140d
Tests: Don't use indices in check_rand (#5561)
Signed-off-by: Ryszard Rozak <rrozak@antmicro.com>
2024-10-25 11:06:32 -04:00

226 lines
4.7 KiB
Systemverilog

// DESCRIPTION: 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
`define check_rand(cl, field) \
begin \
longint prev_result; \
int ok = 0; \
void'(cl.randomize()); \
prev_result = longint'(field); \
repeat(9) begin \
longint result; \
void'(cl.randomize()); \
result = longint'(field); \
if (result != prev_result) ok = 1; \
prev_result = result; \
end \
if (ok != 1) $stop; \
end
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;
typedef struct {
int i;
StructOuter j;
Enum k;
longint z;
} StructUnpacked;
class BaseCls1;
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 DerivedCls1 extends BaseCls1;
rand Inner i;
rand int j;
int k;
rand Enum l;
function new;
i = new;
j = 0;
k = 0;
l = ONE;
endfunction
endclass
class BaseCls2;
rand int i;
function new;
i = 0;
endfunction
endclass
class DerivedCls2 extends BaseCls2;
rand int j;
function new;
super.new;
j = 0;
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 StructUnpacked str;
function new;
v = 0;
w = 0;
x = 0;
y = 0;
z = 0;
str.i = 0;
str.j = '{x: 1'b0, y: ONE, z: 64'd0, s: '{a: 32'd0, b: 1'b0, c: ONE}};
str.k = ONE;
endfunction
endclass
class ContainsNull;
rand BaseCls1 b;
endclass
class ClsWithInt;
rand int a;
int b;
endclass
class DeriveClsWithInt extends ClsWithInt;
endclass
class DeriveAndContainClsWithInt extends ClsWithInt;
rand ClsWithInt cls1;
ClsWithInt cls2;
function new;
cls1 = new;
cls2 = new;
endfunction
endclass
class ClsUsedOnlyHere;
rand int a;
endclass
typedef ClsUsedOnlyHere cls_used_only_here_t;
class ClsContainUsedOnlyHere;
rand cls_used_only_here_t c;
function new;
c = new;
endfunction
endclass
module t (/*AUTOARG*/);
DerivedCls1 derived1;
DerivedCls2 derived2;
OtherCls other;
BaseCls1 base;
ContainsNull cont;
DeriveClsWithInt der_int;
DeriveAndContainClsWithInt der_contain;
ClsContainUsedOnlyHere cls_cont_used;
initial begin
derived1 = new;
derived2 = new;
other = new;
cont = new;
der_int = new;
der_contain = new;
base = derived1;
cls_cont_used = new;
for (int i = 0; i < 10; i++) begin
void'(base.randomize());
void'(derived2.randomize());
void'(other.randomize());
void'(cont.randomize());
void'(der_int.randomize());
void'(der_contain.randomize());
if (!(derived1.l inside {ONE, TWO, THREE, FOUR})) $stop;
if (!(other.str.j.s.c inside {ONE, TWO, THREE, FOUR})) $stop;
if (!(other.str.j.y inside {ONE, TWO, THREE, FOUR})) $stop;
if (!(other.str.k inside {ONE, TWO, THREE, FOUR})) $stop;
if (derived1.i.e != 0) $stop;
if (derived1.k != 0) $stop;
if (other.v != 0) $stop;
if (cont.b != null) $stop;
if (der_int.b != 0) $stop;
if (der_contain.cls2.a != 0) $stop;
if (der_contain.cls1.b != 0) $stop;
if (der_contain.b != 0) $stop;
end
`check_rand(derived1, derived1.i.a);
`check_rand(derived1, derived1.i.b);
`check_rand(derived1, derived1.i.c);
`check_rand(derived1, derived1.j);
`check_rand(derived1, derived1.l);
`check_rand(derived2, derived2.i);
`check_rand(derived2, derived2.j);
`check_rand(other, other.w);
`check_rand(other, other.x);
`check_rand(other, other.y);
`check_rand(other, other.z);
`check_rand(other, other.str.i);
`check_rand(other, other.str.j.x);
`check_rand(other, other.str.j.y);
`check_rand(other, other.str.j.z);
`check_rand(other, other.str.j.s.a);
`check_rand(other, other.str.j.s.b);
`check_rand(other, other.str.j.s.c);
`check_rand(other, other.str.k);
`check_rand(der_int, der_int.a);
`check_rand(der_contain, der_contain.cls1.a);
`check_rand(der_contain, der_contain.a);
`check_rand(cls_cont_used, cls_cont_used.c.a);
$write("*-* All Finished *-*\n");
$finish;
end
endmodule