mirror of
https://github.com/verilator/verilator.git
synced 2025-02-08 06:32:24 +00:00
226 lines
4.7 KiB
Systemverilog
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
|