In this SystemVerilog Tutorial so far we have seen basic array type i.e. SystemVerilog Fixed arrays, as its size is set at compile time.
Now what if you don't know the size of array until run-time?
You may wish to set the size of array run-time and wish to change the size dynamically during run time.
For example an IP packet varies length from one packet to other packet. In verilog, for creating such packet, array with maximum packet size is declared and only the number of elements which are require for small packets are used and unused elements are waste of memory.
SystemVerilog overcomes this problem and provides us dynamic arrays.
Following are the features of SystemVerilog Dynamic arrays :
1. Size of dynamic array can be set at runtime.
2. Previously set size of the dynamic array can be changed runtime without loosing the previous contents.
Hence, dynamic array is unpacked array whose size can be allocated run time along with the option to resize.
Declaration of SystemVerilog Dynamic Arrays :
Dynamic arrays are declared with empty word subscript [ ].
Dynamic arrays are declared with empty word subscript [ ].
1 2 3 | integer dyn_array_1[]; integer dyn_array_1[]; integer multi_dime_dyn_array[][]; |
Allocating size of Dynamic Array :
As seen above the dynamic array is declared with empty word subscript [ ], which means you do not wish to allocate size at compile time, instead, you specify the size at runtime.
The dynamic arrays used builtin function new[ ] to allocate the storage and initialize the newly allocated array.
Simulation result :
j = 0 dyn = 0
j = 1 dyn = 1
j = 2 dyn = 2
j = 3 dyn = 3
j = 4 dyn = 4
Copy the dynamic array
dyn[0] = 0 d2[0] = 0
Modify contents of copy
dyn[0] = 0 d2[0] = 5
Extend the array length and check previous content
dyn[4] = 4
Extend the array length and check previous content
dyn[4] = 0
Run Simulation
Methods associated with Dynamic arrays :
.size() : Returns the size of dynamic array. We can also use system task $size() method instead of .size() method.
.delete() : SystemVerilog also provides .delete() method clears all the elements yielding an empty array (zero size).
Previous : Fixed Size Arrays
Next : Associative Arrays
As seen above the dynamic array is declared with empty word subscript [ ], which means you do not wish to allocate size at compile time, instead, you specify the size at runtime.
The dynamic arrays used builtin function new[ ] to allocate the storage and initialize the newly allocated array.
// SystemVerilog Dynamic arrays module dyn_arr; int dyn[], d2[]; // Empty dynamic arrays initial begin dyn = new[5]; // Allocate 5 elements foreach (dyn[j]) begin dyn[j] = j; // Initialize the elements $display("j = %0d dyn = %0d",j,dyn[j]); end $display("Copy the dynamic array"); // Copy a dynamic array d2 = dyn; $display("dyn[0] = %0d d2[0] = %0d",dyn[0],d2[0]); $display("Modify contents of copy"); // Modify the copy d2[0] = 5; $display("dyn[0] = %0d d2[0] = %0d",dyn[0],d2[0]); $display ("Extend the array length and check previous content"); // Expand and copy dyn = new[20](dyn); $display("dyn[4] = %0d", dyn[4]); $display ("Extend the array length and check previous content"); // Allocate 100 new integers. Old values will lost dyn = new[100]; $display ("dyn[4] = %0d", dyn[4]); // Delete all elements dyn.delete; end endmodule
Simulation result :
j = 0 dyn = 0
j = 1 dyn = 1
j = 2 dyn = 2
j = 3 dyn = 3
j = 4 dyn = 4
Copy the dynamic array
dyn[0] = 0 d2[0] = 0
Modify contents of copy
dyn[0] = 0 d2[0] = 5
Extend the array length and check previous content
dyn[4] = 4
Extend the array length and check previous content
dyn[4] = 0
Run Simulation
Methods associated with Dynamic arrays :
.size() : Returns the size of dynamic array. We can also use system task $size() method instead of .size() method.
.delete() : SystemVerilog also provides .delete() method clears all the elements yielding an empty array (zero size).
Previous : Fixed Size Arrays
Next : Associative Arrays
can we delete a particular array index in dynamic array?
ReplyDeleteHi,
DeletePlease note that the dynamic arrays are created as dyn = new[5];
This specifies that 5 locations has been allocated to array "dyn". Also all these 5 locations are initialized by value '0'. So deleting a element is not possible in case of dynamic array.