2024-11-08 20:04:58 +01:00
// DESCRIPTION: Verilator: Verilog Test module
//
2026-01-27 02:24:34 +01:00
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2024 PlanV GmbH
2024-11-08 20:04:58 +01:00
// SPDX-License-Identifier: CC0-1.0
`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);
class ConstrainedDynamicQueueArray ;
rand int queue_1d [ $ ] ;
rand int queue [ $ ] [ $ ] ;
rand int dyn [ ] [ ] ;
rand int queue_dyn [ $ ] [ ] ;
rand int dyn_queue [ ] [ $ ] ;
rand int queue_unp [ $ ] [ 3 ] ;
rand int unp_queue [ 3 ] [ $ ] ;
rand int \ array_w [ ith_es ] cape [ 3 ] [ 2 ] ;
// Constraints for the queues and dynamic arrays
constraint queue_constraints {
foreach ( queue_1d [ i ] ) queue_1d [ i ] = = i + 2 ;
foreach ( queue [ i , j ] ) queue [ i ] [ j ] = = ( 2 * i ) + j ;
}
constraint dyn_constraints {
dyn [ 0 ] [ 0 ] = = 10 ;
dyn [ 1 ] [ 0 ] inside { 20 , 30 , 40 } ;
dyn [ 1 ] [ 1 ] > 50 ;
dyn [ 0 ] [ 1 ] < 100 ;
dyn [ 0 ] [ 2 ] inside { 5 , 15 , 25 } ;
}
constraint queue_dyn_constraints {
foreach ( queue_dyn [ i , j ] ) queue_dyn [ i ] [ j ] = = i + j + 3 ;
}
constraint dyn_queue_constraints {
foreach ( dyn_queue [ i , j ] ) dyn_queue [ i ] [ j ] = = ( 3 * i ) + j + 2 ;
}
constraint unp_queue_constraints {
foreach ( unp_queue [ i , j ] ) unp_queue [ i ] [ j ] = = ( i * 5 ) + j + 1 ;
}
constraint array_with_escape_constraints {
\ array_w [ ith_es ] cape [ 0 ] [ 0 ] = = 6 ;
}
// Constructor
function new ( ) ;
queue_1d = { 1 , 2 , 3 , 4 } ;
queue = ' { ' { 1 , 2 } , ' { 3 , 4 , 5 } , ' { 6 } } ;
dyn = new [ 2 ] ;
dyn [ 0 ] = new [ 3 ] ;
dyn [ 1 ] = new [ 4 ] ;
queue_dyn = { } ;
queue_dyn [ 0 ] = new [ 3 ] ;
queue_dyn [ 1 ] = new [ 4 ] ;
dyn_queue = new [ 2 ] ;
dyn_queue [ 0 ] = { 7 , 8 , 9 } ;
dyn_queue [ 1 ] = { 10 } ;
queue_unp = { } ;
unp_queue [ 0 ] = { 17 , 18 } ;
unp_queue [ 1 ] = { 19 } ;
unp_queue [ 2 ] = { 20 } ;
endfunction
// Self-check function
function void check ( ) ;
foreach ( queue_1d [ i ] ) `checkh ( queue_1d [ i ] , i + 2 )
foreach ( queue [ i , j ] ) `checkh ( queue [ i ] [ j ] , ( 2 * i ) + j )
`checkh ( dyn [ 0 ] [ 0 ] , 10 )
`checkh ( dyn [ 1 ] [ 0 ] inside { 20 , 30 , 40 } , 1 'b1 )
`checkh ( dyn [ 1 ] [ 1 ] > 50 , 1 'b1 )
`checkh ( dyn [ 0 ] [ 1 ] < 100 , 1 'b1 )
`checkh ( dyn [ 0 ] [ 2 ] inside { 5 , 15 , 25 } , 1 'b1 )
foreach ( queue_dyn [ i , j ] ) `checkh ( queue_dyn [ i ] [ j ] , i + j + 3 )
foreach ( dyn_queue [ i , j ] ) `checkh ( dyn_queue [ i ] [ j ] , ( 3 * i ) + j + 2 )
`checkh ( unp_queue [ 0 ] [ 0 ] , ( 0 * 5 ) + 0 + 1 )
`checkh ( unp_queue [ 0 ] [ 1 ] , ( 0 * 5 ) + 1 + 1 )
`checkh ( unp_queue [ 1 ] [ 0 ] , ( 1 * 5 ) + 0 + 1 )
`checkh ( unp_queue [ 2 ] [ 0 ] , ( 2 * 5 ) + 0 + 1 )
`checkh ( \ array_w [ ith_es ] cape [ 0 ] [ 0 ] , 6 )
endfunction
endclass
module t_constraint_dyn_queue_basic ;
ConstrainedDynamicQueueArray array_test ;
int success ;
initial begin
$display ( " Test: Randomization for dynamic and mixed queues and arrays: " ) ;
array_test = new ( ) ;
repeat ( 2 ) begin
success = array_test . randomize ( ) ;
`checkh ( success , 1 )
array_test . check ( ) ;
end
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
endmodule