2025-04-15 03:40:17 +02:00
// DESCRIPTION: Verilator: Casting queues and dynamic arrays
// into queues as function arguments
//
2026-01-27 02:24:34 +01:00
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2025 Wilson Snyder
2025-04-15 03:40:17 +02:00
// SPDX-License-Identifier: CC0-1.0
2025-12-21 03:46:43 +01:00
// verilog_format: off
2025-04-15 03:40:17 +02:00
`define stop $stop()
2026-03-10 02:38:29 +01:00
`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0x exp=%0x (%s !== %s)\n", `__FILE__,`__LINE__, (gotv), (expv), `"gotv`", `"expv`"); `stop; end while(0);
`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-12-21 03:46:43 +01:00
// verilog_format: on
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
class check # (
parameter WIDTH = 8
) ;
static function automatic void check_array ( int n , logic [ WIDTH - 1 : 0 ] array [ ] ) ;
for ( int r = 0 ; r < n ; r + + ) begin
`checkh ( array [ r ] , WIDTH ' ( r ) )
end
endfunction
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
static function automatic void check_string ( int n , string array [ ] ) ;
for ( int r = 0 ; r < n ; r + + ) begin
`checks ( array [ r ] , " test " )
end
endfunction
2025-04-15 03:40:17 +02:00
endclass
2026-03-10 02:38:29 +01:00
module test ( ) ;
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
localparam NUM_ELEMS = 4 ;
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
typedef string array_s_t [ NUM_ELEMS ] ;
typedef logic [ 7 : 0 ] array_8_t [ NUM_ELEMS ] ;
typedef logic [ 15 : 0 ] array_16_t [ NUM_ELEMS ] ;
typedef logic [ 31 : 0 ] array_32_t [ NUM_ELEMS ] ;
typedef logic [ 63 : 0 ] array_64_t [ NUM_ELEMS ] ;
typedef logic [ 95 : 0 ] array_96_t [ NUM_ELEMS ] ;
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
typedef string queue_s_t [ $ ] ;
typedef logic [ 7 : 0 ] queue_8_t [ $ ] ;
typedef logic [ 15 : 0 ] queue_16_t [ $ ] ;
typedef logic [ 31 : 0 ] queue_32_t [ $ ] ;
typedef logic [ 63 : 0 ] queue_64_t [ $ ] ;
typedef logic [ 95 : 0 ] queue_96_t [ $ ] ;
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
array_s_t array_s ;
array_8_t array_8 ;
array_16_t array_16 ;
array_32_t array_32 ;
array_64_t array_64 ;
array_96_t array_96 ;
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
queue_s_t queue_s ;
queue_8_t queue_8 ;
queue_16_t queue_16 ;
queue_32_t queue_32 ;
queue_64_t queue_64 ;
queue_96_t queue_96 ;
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
initial begin
for ( int i = 0 ; i < NUM_ELEMS ; i + + ) begin
array_s [ i ] = " test " ;
array_8 [ i ] = 8 ' ( i ) ;
array_16 [ i ] = 16 ' ( i ) ;
array_32 [ i ] = 32 ' ( i ) ;
array_64 [ i ] = 64 ' ( i ) ;
array_96 [ i ] = 96 ' ( i ) ;
queue_s . push_back ( " test " ) ;
queue_8 . push_back ( 8 ' ( i ) ) ;
queue_16 . push_back ( 16 ' ( i ) ) ;
queue_32 . push_back ( 32 ' ( i ) ) ;
queue_64 . push_back ( 64 ' ( i ) ) ;
queue_96 . push_back ( 96 ' ( i ) ) ;
end
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
check # ( 1 ) : : check_string ( NUM_ELEMS , array_s ) ;
check # ( 8 ) : : check_array ( NUM_ELEMS , array_8 ) ;
check # ( 16 ) : : check_array ( NUM_ELEMS , array_16 ) ;
check # ( 32 ) : : check_array ( NUM_ELEMS , array_32 ) ;
check # ( 64 ) : : check_array ( NUM_ELEMS , array_64 ) ;
check # ( 96 ) : : check_array ( NUM_ELEMS , array_96 ) ;
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
check # ( 1 ) : : check_string ( NUM_ELEMS , queue_s ) ;
check # ( 8 ) : : check_array ( NUM_ELEMS , queue_8 ) ;
check # ( 16 ) : : check_array ( NUM_ELEMS , queue_16 ) ;
check # ( 32 ) : : check_array ( NUM_ELEMS , queue_32 ) ;
check # ( 64 ) : : check_array ( NUM_ELEMS , queue_64 ) ;
check # ( 96 ) : : check_array ( NUM_ELEMS , queue_96 ) ;
2025-04-15 03:40:17 +02:00
2026-03-10 02:38:29 +01:00
$display ( " All checks passed " ) ;
$finish ( ) ;
end
2025-04-15 03:40:17 +02:00
endmodule