2019-12-01 17:52:48 +01:00
// DESCRIPTION: Verilator: Verilog Test module
//
2020-03-21 16:24:24 +01:00
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2019 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
2019-12-01 17:52:48 +01:00
2024-02-09 00:39:13 +01:00
`define stop $stop
`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);
2024-10-03 01:00:39 +02:00
`define checks(gotv,expv) do if ((gotv) != (expv)) begin $write("%%Error: %s:%0d: got='%s' exp='%s'\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
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);
2019-12-01 17:52:48 +01:00
module t ( /*AUTOARG*/
// Inputs
clk
) ;
input clk ;
2021-11-13 16:46:25 +01:00
integer cyc = 0 ;
2019-12-01 17:52:48 +01:00
integer i ;
always @ ( posedge clk ) begin
cyc < = cyc + 1 ;
begin
// Type
typedef bit [ 3 : 0 ] nibble_t ;
2023-07-04 15:13:22 +02:00
typedef string dict_t [ nibble_t ] ;
dict_t a ;
2019-12-01 17:52:48 +01:00
string b [ nibble_t ] ;
nibble_t k ;
string v ;
a [ 4 'd3 ] = " fooed " ;
a [ 4 'd2 ] = " bared " ;
i = a . num ( ) ; `checkh ( i , 2 ) ;
i = a . size ; `checkh ( i , 2 ) ; // Also checks no parens
v = a [ 4 'd3 ] ; `checks ( v , " fooed " ) ;
v = a [ 4 'd2 ] ; `checks ( v , " bared " ) ;
i = a . exists ( 4 'd0 ) ; `checkh ( i , 0 ) ;
2025-05-18 17:25:25 +02:00
if ( a . exists ( 4 'd0 ) ) $stop ; // Check no width warning
2019-12-01 17:52:48 +01:00
i = a . exists ( 4 'd2 ) ; `checkh ( i , 1 ) ;
2025-05-18 17:25:25 +02:00
if ( ! a . exists ( 4 'd2 ) ) $stop ; // Check no width warning
2019-12-01 17:52:48 +01:00
i = a . first ( k ) ; `checkh ( i , 1 ) ; `checks ( k , 4 'd2 ) ;
i = a . next ( k ) ; `checkh ( i , 1 ) ; `checks ( k , 4 'd3 ) ;
i = a . next ( k ) ; `checkh ( i , 0 ) ;
i = a . last ( k ) ; `checkh ( i , 1 ) ; `checks ( k , 4 'd3 ) ;
i = a . prev ( k ) ; `checkh ( i , 1 ) ; `checks ( k , 4 'd2 ) ;
i = a . prev ( k ) ; `checkh ( i , 0 ) ;
2025-08-22 03:33:05 +02:00
`checkp ( a , " '{'h2: \" bared \" , 'h3: \" fooed \" } " ) ;
2019-12-01 17:52:48 +01:00
2022-01-01 23:10:14 +01:00
a . first ( k ) ; `checks ( k , 4 'd2 ) ;
a . next ( k ) ; `checks ( k , 4 'd3 ) ;
a . next ( k ) ;
a . last ( k ) ; `checks ( k , 4 'd3 ) ;
a . prev ( k ) ; `checks ( k , 4 'd2 ) ;
2019-12-01 17:52:48 +01:00
a . delete ( 4 'd2 ) ;
i = a . size ( ) ; `checkh ( i , 1 ) ;
b = a ; // Copy assignment
i = b . size ( ) ; `checkh ( i , 1 ) ;
end
begin
// Strings
string a [ string ] ;
string k ;
string v ;
a [ " foo " ] = " fooed " ;
a [ " bar " ] = " bared " ;
i = a . num ( ) ; `checkh ( i , 2 ) ;
i = a . size ( ) ; `checkh ( i , 2 ) ;
v = a [ " foo " ] ; `checks ( v , " fooed " ) ;
v = a [ " bar " ] ; `checks ( v , " bared " ) ;
i = a . exists ( " baz " ) ; `checkh ( i , 0 ) ;
i = a . exists ( " bar " ) ; `checkh ( i , 1 ) ;
i = a . first ( k ) ; `checkh ( i , 1 ) ; `checks ( k , " bar " ) ;
i = a . next ( k ) ; `checkh ( i , 1 ) ; `checks ( k , " foo " ) ;
i = a . next ( k ) ; `checkh ( i , 0 ) ;
i = a . last ( k ) ; `checkh ( i , 1 ) ; `checks ( k , " foo " ) ;
i = a . prev ( k ) ; `checkh ( i , 1 ) ; `checks ( k , " bar " ) ;
i = a . prev ( k ) ; `checkh ( i , 0 ) ;
2024-07-20 12:51:50 +02:00
`checkp ( a [ " foo " ] , " \" fooed \" " ) ;
2025-08-22 03:33:05 +02:00
`checkp ( a , " '{ \" bar \" : \" bared \" , \" foo \" : \" fooed \" } " ) ;
2019-12-01 17:52:48 +01:00
a . delete ( " bar " ) ;
i = a . size ( ) ; `checkh ( i , 1 ) ;
a . delete ( ) ;
i = a . size ( ) ; `checkh ( i , 0 ) ;
i = a . first ( k ) ; `checkh ( i , 0 ) ;
i = a . last ( k ) ; `checkh ( i , 0 ) ;
// Patterns & default
a = ' { " f " : " fooed " , " b " : " bared " , default : " defaulted " } ;
i = a . size ( ) ; `checkh ( i , 2 ) ; // Default doesn't count
v = a [ " f " ] ; `checks ( v , " fooed " ) ;
v = a [ " b " ] ; `checks ( v , " bared " ) ;
v = a [ " NEXISTS " ] ; `checks ( v , " defaulted " ) ;
2020-10-26 02:05:22 +01:00
a = ' { } ;
i = a . size ( ) ; `checkh ( i , 0 ) ;
2019-12-01 17:52:48 +01:00
end
begin
// Wide-wides - need special array container classes, ick.
logic [ 91 : 2 ] a [ logic [ 65 : 1 ] ] ;
2023-07-12 18:48:24 +02:00
int b [ bit [ 99 : 0 ] ] ;
2019-12-01 17:52:48 +01:00
a [ ~ 65 'hfe ] = ~ 90 'hfee ;
`checkh ( a [ ~ 65 'hfe ] , ~ 90 'hfee ) ;
2023-07-12 18:48:24 +02:00
b [ 100 'b1 ] = 1 ;
`checkh ( b [ 100 'b1 ] , 1 ) ;
2019-12-01 17:52:48 +01:00
end
2021-12-12 00:38:23 +01:00
begin
int a [ string ] ;
int sum ;
sum = 0 ;
a [ " one " ] = 1 ;
a [ " two " ] = 2 ;
foreach ( a [ i ] ) sum + = a [ i ] ;
`checkh ( sum , 1 + 2 ) ;
end
2024-09-07 21:25:35 +02:00
begin // Issue #5435
int a ;
int ok ;
int dict [ int ] ;
dict [ 3 ] = 'h13 ;
dict [ 4 ] = 'h14 ;
dict [ 5 ] = 'h15 ;
a = 4 ;
ok = dict . first ( a ) ;
if ( a ! = 3 ) $stop ;
if ( ok ! = 1 ) $stop ;
a = 4 ;
ok = dict . next ( a ) ;
if ( a ! = 5 ) $stop ;
if ( ok ! = 1 ) $stop ;
a = 4 ;
ok = dict . last ( a ) ;
if ( a ! = 5 ) $stop ;
if ( ok ! = 1 ) $stop ;
end
2019-12-01 17:52:48 +01:00
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
endmodule