2020-04-05 15:30:23 +02:00
// 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
2024-02-09 00:39:13 +01:00
`define stop $stop
2025-04-04 03:26:53 +02:00
`define checkp(gotv,expv_s) do begin string gotv_s; gotv_s = $sformatf("%p", gotv); if ((gotv_s) != (expv_s)) begin $write("%%Error: %s:%0d: got='%s' exp='%s'\n", `__FILE__,`__LINE__, (gotv_s), (expv_s)); `stop; end end while(0);
2020-04-05 15:30:23 +02:00
2022-01-01 19:48:53 +01:00
// See also t_class_param_mod.v
typedef class Cls ;
class Wrap # ( parameter P = 13 ) ;
2021-12-13 01:49:06 +01:00
function int get_p ;
return c1 . get_p ( ) ;
endfunction
2022-01-01 19:48:53 +01:00
function new ;
c1 = new ;
endfunction
Cls # ( PMINUS1 + 1 ) c1 ;
localparam PMINUS1 = P - 1 ; // Checking works when last
2021-12-13 01:49:06 +01:00
endclass
2022-08-28 16:24:55 +02:00
class Wrap2 # ( parameter P = 35 ) ;
function int get_p ;
return c1 . get_p ( ) ;
endfunction
function new ;
c1 = new ;
endfunction
Wrap # ( PMINUS1 + 1 ) c1 ;
localparam PMINUS1 = P - 1 ; // Checking works when last
endclass
2022-01-01 19:48:53 +01:00
class Cls # ( parameter PBASE = 12 ) ;
bit [ PBASE - 1 : 0 ] member ;
function bit [ PBASE - 1 : 0 ] get_member ;
return member ;
endfunction
static function int get_p ;
return PBASE ;
endfunction
typedef enum { E_PBASE = PBASE } enum_t ;
2025-02-17 13:47:41 +01:00
class ClsInner ;
bit [ PBASE - 1 : 0 ] member ;
endclass
2022-01-01 19:48:53 +01:00
endclass
2021-12-12 21:26:29 +01:00
2022-01-01 19:48:53 +01:00
typedef Cls # ( 8 ) Cls8_t ;
2021-12-13 01:49:06 +01:00
2022-12-30 12:05:01 +01:00
class SelfRefClassTypeParam # ( type T = logic ) ;
typedef SelfRefClassTypeParam # ( int ) self_int_t ;
T field ;
endclass
class SelfRefClassIntParam # ( int P = 1 ) ;
typedef SelfRefClassIntParam # ( 10 ) self_int_t ;
endclass
2023-01-31 04:20:56 +01:00
class Sum # ( type T ) ;
static int sum ;
static function void add ( T element ) ;
sum + = int ' ( element ) ;
2025-05-04 22:34:37 +02:00
endfunction
2023-01-31 04:20:56 +01:00
endclass
class IntQueue ;
int q [ $ ] ;
function int getSum ( ) ;
foreach ( q [ i ] )
Sum # ( int ) : : add ( q [ i ] ) ;
return Sum # ( int ) : : sum ;
endfunction
endclass
2023-02-02 08:36:11 +01:00
class ClsStatic ;
static int x = 1 ;
static function int get_2 ;
return 2 ;
endfunction
endclass
class ClsParam # ( type T ) ;
typedef T param_t ;
endclass
2023-02-02 23:59:47 +01:00
class ClsWithParamField ;
int m_field = Sum # ( int ) : : sum ;
int m_queue [ $ ] ;
function int get ( int index ) ;
return m_queue [ index ] ;
endfunction
endclass
2023-02-07 15:10:19 +01:00
class DictWrapper ;
int m_dict [ string ] ;
endclass
class DictOperator # ( type T ) extends T ;
function void set ( string s , int x ) ;
m_dict [ s ] = x ;
endfunction
function int get ( string s ) ;
return m_dict [ s ] ;
endfunction
endclass
2023-02-17 17:17:35 +01:00
class Getter1 # ( int T = 0 ) ;
static function int get_1 ( ) ;
return Getter1 # ( 1 ) : : T ;
endfunction
endclass
class Getter2 # ( int T = 5 ) ;
static function int get_T ( ) ;
return T ;
endfunction
static function int get_2 ( ) ;
return Getter2 # ( 2 ) : : get_T ( ) ;
endfunction
endclass
2023-06-27 10:40:45 +02:00
class ClsParamString # ( string S = " abcde " ) ;
typedef ClsParamString # ( S ) this_type ;
static this_type m_inst ;
int x = 0 ;
string name = S ;
endclass
typedef ClsParamString # ( " abcde " ) cls_param_string_def_t ;
typedef ClsParamString # ( " xyz " ) cls_param_string_not_def_t ;
2025-09-13 15:28:43 +02:00
module t ;
2021-12-12 21:26:29 +01:00
2020-04-05 15:30:23 +02:00
Cls c12 ;
2022-01-01 19:48:53 +01:00
Cls # ( . PBASE ( 4 ) ) c4 ;
Cls8_t c8 ;
2025-02-17 13:47:41 +01:00
Cls # ( ) : : ClsInner ci ;
Cls # ( 8 ) : : ClsInner ci8 ;
2022-01-01 19:48:53 +01:00
Wrap # ( . P ( 16 ) ) w16 ;
2022-08-28 16:24:55 +02:00
Wrap2 # ( . P ( 32 ) ) w32 ;
2022-12-30 12:05:01 +01:00
SelfRefClassTypeParam src_logic ;
2023-08-26 15:06:26 +02:00
SelfRefClassTypeParam # ( ) : : self_int_t src_int ;
2022-12-30 12:05:01 +01:00
SelfRefClassIntParam src1 ;
2023-08-26 15:06:26 +02:00
SelfRefClassIntParam # ( ) : : self_int_t src10 ;
2023-01-31 04:20:56 +01:00
IntQueue qi ;
2023-02-02 23:59:47 +01:00
ClsWithParamField cls_param_field ;
2023-02-07 15:10:19 +01:00
DictOperator # ( DictWrapper ) dict_op ;
2023-02-17 17:17:35 +01:00
Getter1 getter1 ;
Getter1 # ( 1 ) getter1_param_1 ;
Getter2 getter2 ;
2023-06-27 10:40:45 +02:00
cls_param_string_def_t cps_def ;
cls_param_string_not_def_t cps_not_def ;
2023-01-31 04:20:56 +01:00
int arr [ 1 : 0 ] = ' { 1 , 2 } ;
2020-04-05 15:30:23 +02:00
initial begin
c12 = new ;
c4 = new ;
2022-01-01 19:48:53 +01:00
c8 = new ;
2025-02-17 13:47:41 +01:00
ci = new ;
ci8 = new ;
2021-12-13 01:49:06 +01:00
w16 = new ;
2022-08-28 16:24:55 +02:00
w32 = new ;
2022-12-30 12:05:01 +01:00
src_int = new ;
src_logic = new ;
src1 = new ;
src10 = new ;
2023-01-31 04:20:56 +01:00
qi = new ;
2023-02-02 23:59:47 +01:00
cls_param_field = new ;
2023-02-07 15:10:19 +01:00
dict_op = new ;
2023-02-17 17:17:35 +01:00
getter1 = new ;
getter1_param_1 = new ;
getter2 = new ;
2022-01-01 19:48:53 +01:00
if ( Cls # ( ) : : PBASE ! = 12 ) $stop ;
if ( Cls # ( 4 ) : : PBASE ! = 4 ) $stop ;
if ( Cls8_t : : PBASE ! = 8 ) $stop ;
if ( Cls # ( ) : : E_PBASE ! = 12 ) $stop ;
if ( Cls # ( 4 ) : : E_PBASE ! = 4 ) $stop ;
if ( Cls8_t : : E_PBASE ! = 8 ) $stop ;
if ( c12 . PBASE ! = 12 ) $stop ;
if ( c4 . PBASE ! = 4 ) $stop ;
if ( c8 . PBASE ! = 8 ) $stop ;
if ( Cls # ( ) : : get_p ( ) ! = 12 ) $stop ;
if ( Cls # ( 4 ) : : get_p ( ) ! = 4 ) $stop ;
if ( Cls8_t : : get_p ( ) ! = 8 ) $stop ;
2020-04-05 15:30:23 +02:00
if ( c12 . get_p ( ) ! = 12 ) $stop ;
if ( c4 . get_p ( ) ! = 4 ) $stop ;
2022-01-01 19:48:53 +01:00
if ( c8 . get_p ( ) ! = 8 ) $stop ;
2021-12-13 01:49:06 +01:00
if ( w16 . get_p ( ) ! = 16 ) $stop ;
2022-08-28 16:24:55 +02:00
if ( w32 . get_p ( ) ! = 32 ) $stop ;
2022-01-01 19:48:53 +01:00
2020-04-05 15:30:23 +02:00
// verilator lint_off WIDTH
c12 . member = 32 'haaaaaaaa ;
c4 . member = 32 'haaaaaaaa ;
2022-01-01 19:48:53 +01:00
c8 . member = 32 'haaaaaaaa ;
2020-04-05 15:30:23 +02:00
// verilator lint_on WIDTH
2025-02-17 13:47:41 +01:00
ci . member = 12 'haaa ;
ci8 . member = 8 'hff ;
if ( ci . member ! = 12 'haaa ) $stop ;
if ( ci8 . member ! = 8 'hff ) $stop ;
2020-04-05 15:30:23 +02:00
if ( c12 . member ! = 12 'haaa ) $stop ;
if ( c4 . member ! = 4 'ha ) $stop ;
if ( c12 . get_member ( ) ! = 12 'haaa ) $stop ;
if ( c4 . get_member ( ) ! = 4 'ha ) $stop ;
2024-07-20 12:51:50 +02:00
`checkp ( c12 , " '{member:'haaa} " ) ;
`checkp ( c4 , " '{member:'ha} " ) ;
2021-12-12 21:26:29 +01:00
2022-12-30 12:05:01 +01:00
if ( $bits ( src_logic . field ) ! = 1 ) $stop ;
if ( $bits ( src_int . field ) ! = 32 ) $stop ;
if ( src1 . P ! = 1 ) $stop ;
if ( src10 . P ! = 10 ) $stop ;
2023-01-31 04:20:56 +01:00
qi . q = ' { 2 , 4 , 6 , 0 , 2 } ;
if ( qi . getSum ( ) ! = 14 ) $stop ;
Sum # ( int ) : : add ( arr [ 0 ] ) ;
2025-05-04 22:34:37 +02:00
if ( Sum # ( int ) : : sum ! = 16 ) $stop ;
if ( Sum # ( real ) : : sum ! = 0 ) $stop ;
Sum # ( real ) : : add ( 1.9 ) ; // rounds
if ( Sum # ( real ) : : sum ! = 2 ) $stop ;
2023-01-31 04:20:56 +01:00
2023-02-02 08:36:11 +01:00
if ( ClsParam # ( ClsStatic ) : : param_t : : x ! = 1 ) $stop ;
if ( ClsParam # ( ClsStatic ) : : param_t : : get_2 ( ) ! = 2 ) $stop ;
2023-02-02 23:59:47 +01:00
cls_param_field . m_queue = ' { 1 , 5 , 7 } ;
if ( cls_param_field . get ( 2 ) ! = 7 ) $stop ;
2023-02-07 15:10:19 +01:00
dict_op . set ( " abcd " , 1 ) ;
2025-05-04 22:34:37 +02:00
if ( dict_op . get ( " abcd " ) ! = 1 ) $stop ;
2023-02-07 15:10:19 +01:00
2023-02-17 17:17:35 +01:00
if ( getter1 . get_1 ( ) ! = 1 ) $stop ;
2023-03-04 03:06:52 +01:00
if ( Getter1 # ( ) : : get_1 ( ) ! = 1 ) $stop ;
2023-02-17 17:17:35 +01:00
if ( getter1_param_1 . get_1 ( ) ! = 1 ) $stop ;
if ( getter2 . get_2 ( ) ! = 2 ) $stop ;
2023-03-04 03:06:52 +01:00
if ( Getter2 # ( ) : : get_2 ( ) ! = 2 ) $stop ;
2023-02-17 17:17:35 +01:00
if ( Getter2 # ( 2 ) : : get_2 ( ) ! = 2 ) $stop ;
2023-06-27 10:40:45 +02:00
cls_param_string_def_t : : m_inst = new ;
cls_param_string_def_t : : m_inst . x = 1 ;
cps_def = cls_param_string_def_t : : m_inst ;
if ( cps_def . x ! = 1 ) $stop ;
if ( cps_def . name ! = " abcde " ) $stop ;
cls_param_string_not_def_t : : m_inst = new ;
cls_param_string_not_def_t : : m_inst . x = 2 ;
cps_not_def = cls_param_string_not_def_t : : m_inst ;
if ( cps_not_def . x ! = 2 ) $stop ;
if ( cps_not_def . name ! = " xyz " ) $stop ;
2020-04-05 15:30:23 +02:00
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
endmodule