// DESCRIPTION: Verilator: Verilog Test module // // This file ONLY is placed under the Creative Commons Public Domain, for // any use, without warranty, 2024 by PlanV GmbH. // SPDX-License-Identifier: CC0-1.0 class constrained_associative_array_basic; rand int int_index_arr [int]; rand int string_index_arr [string]; /* verilator lint_off SIDEEFFECT */ // Constraints for both arrays constraint int_index_constraints { foreach (int_index_arr[i]) int_index_arr[i] inside {10, 20, 30, 40, 50}; } constraint string_index_constraints { string_index_arr["Alice"] == 35; string_index_arr["Bob"] inside {50, 60}; string_index_arr["Charlie"] > 25; } // Constructor to initialize arrays function new(); int_index_arr = '{1: 0, 8: 0, 7: 0}; string_index_arr = '{"Alice": 25, "Bob": 50, "Charlie": 45}; endfunction // Function to check and display the arrays function void self_check(); foreach (int_index_arr[i]) begin if (!(int_index_arr[i] inside {10, 20, 30, 40, 50})) $stop; end foreach (string_index_arr[name]) begin if ((name == "Alice" && string_index_arr[name] != 35) || (name == "Bob" && !(string_index_arr[name] inside {50, 60})) || (name == "Charlie" && string_index_arr[name] <= 25)) $stop; end endfunction endclass class constrained_1d_associative_array; rand int string_index_arr [string]; rand int int_index_arr [int]; rand int shortint_index_arr [shortint]; rand int longint_index_arr[longint]; rand int byte_index_arr [byte]; rand int bit_index_arr [bit[5:0]]; rand int logic_index_arr [logic[3:0]]; rand int bit_index_arr_1 [bit[55:0]]; // Constraints constraint associative_array_constraints { string_index_arr["key1"] == 100; string_index_arr["key2"] inside {200, 300, 400}; int_index_arr[40000] + int_index_arr[2000000000] == 2; shortint_index_arr[2000] == 200; longint_index_arr[64'd4000000000] == 300; byte_index_arr[8'd255] == 50; bit_index_arr[6'd30] - bit_index_arr_1[56'd66] == 3; logic_index_arr[4'b0011] == 70; } function new(); string_index_arr = '{"key1":0, "key2":0}; int_index_arr = '{40000:0, 2000000000:0}; shortint_index_arr = '{2000:0}; longint_index_arr = '{64'd4000000000:0}; byte_index_arr = '{8'd255:0}; bit_index_arr = '{6'd30:0}; bit_index_arr_1 = '{56'd66:0}; logic_index_arr = '{4'd3:0}; endfunction function void self_check(); if (string_index_arr["key1"] != 100) $stop; if (!(string_index_arr["key2"] inside {200, 300, 400})) $stop; if ((int_index_arr[40000] + int_index_arr[2000000000]) != 2) $stop; if (shortint_index_arr[2000] != 200) $stop; if (longint_index_arr[64'd4000000000] != 300) $stop; if (byte_index_arr[8'd255] != 50) $stop; if (bit_index_arr[6'd30] - bit_index_arr_1[56'd66] != 3) $stop; if (logic_index_arr[4'd3] != 70) $stop; endfunction function void debug_display(); $display("string_index_arr[\"key1\"] = %0d", string_index_arr["key1"]); $display("string_index_arr[\"key2\"] = %0d", string_index_arr["key2"]); $display("int_index_arr[40000] = %0d", int_index_arr[40000]); $display("int_index_arr[2000000000] = %0d", int_index_arr[2000000000]); $display("shortint_index_arr[2000] = %0d", shortint_index_arr[2000]); $display("longint_index_arr[4000000000] = %0d", longint_index_arr[64'd4000000000]); $display("byte_index_arr[255] = %0d", byte_index_arr[8'd255]); $display("bit_index_arr[30] = %0d", bit_index_arr[6'd30]); $display("bit_index_arr_1[66] = %0d", bit_index_arr_1[56'd66]); $display("logic_index_arr[3] = %0d", logic_index_arr[4'd3]); endfunction endclass class constrained_2d_associative_array; rand int string_int_index_arr [string][int]; rand int int_bit_index_arr [int][bit[5:0]]; rand int string_bit_index_arr [string][bit[7:0]]; rand int unpacked_assoc_array_2d [string][2]; // Constraints constraint associative_array_constraints { string_int_index_arr["key1"][2000] == 100; string_int_index_arr["key2"][3000] inside {200, 300, 400}; int_bit_index_arr[40000][6'd30] == 60; int_bit_index_arr[50000][6'd40] inside {100, 200}; string_bit_index_arr["key3"][8'd100] == 150; string_bit_index_arr["key4"][8'd200] inside {250, 350}; unpacked_assoc_array_2d["key5"][0] == 7; } function new(); string_int_index_arr = '{"key1":'{2000:0}, "key2":'{3000:0}}; int_bit_index_arr = '{40000:'{6'd30:0}, 50000:'{6'd40:0}}; string_bit_index_arr = '{"key3":'{8'd100:0}, "key4":'{8'd200:0}}; unpacked_assoc_array_2d["key5"][0] = 0; unpacked_assoc_array_2d["key5"][1] = 0; endfunction function void self_check(); if (string_int_index_arr["key1"][2000] != 100) $stop; if (!(string_int_index_arr["key2"][3000] inside {200, 300, 400})) $stop; if (int_bit_index_arr[40000][6'd30] != 60) $stop; if (!(int_bit_index_arr[50000][6'd40] inside {100, 200})) $stop; if (string_bit_index_arr["key3"][8'd100] != 150) $stop; if (!(string_bit_index_arr["key4"][8'd200] inside {250, 350})) $stop; if (unpacked_assoc_array_2d["key5"][0] != 7) $stop; endfunction function void debug_display(); $display("string_int_index_arr[\"key1\"][2000] = %0d", string_int_index_arr["key1"][2000]); $display("string_int_index_arr[\"key2\"][3000] = %0d", string_int_index_arr["key2"][3000]); $display("int_bit_index_arr[40000][30] = %0d", int_bit_index_arr[40000][6'd30]); $display("int_bit_index_arr[50000][40] = %0d", int_bit_index_arr[50000][6'd40]); $display("string_bit_index_arr[\"key3\"][100] = %0d", string_bit_index_arr["key3"][8'd100]); $display("string_bit_index_arr[\"key4\"][200] = %0d", string_bit_index_arr["key4"][8'd200]); $display("unpacked_assoc_array_2d[\"key5\"][0] = %0d", unpacked_assoc_array_2d["key5"][0]); endfunction /* verilator lint_off SIDEEFFECT */ endclass module t_constraint_assoc_arr_basic; constrained_associative_array_basic my_array; constrained_1d_associative_array my_1d_array; constrained_2d_associative_array my_2d_array; int success; initial begin my_array = new(); success = my_array.randomize(); if (success == 0) $stop; my_array.self_check(); my_1d_array = new(); success = my_1d_array.randomize(); if (success == 0) $stop; my_1d_array.self_check(); my_1d_array = new(); success = my_1d_array.randomize(); if (success == 0) $stop; my_1d_array.self_check(); // my_1d_array.debug_display(); // my_2d_array.debug_display(); $write("*-* All Finished *-*\n"); $finish; end endmodule