Dynamic array element size conversion

I have a dynamic array with element size as 128 bits width.
Now I want to convert this to a dynamic array with element size as 64 bits. I followed below approach and it worked. Is there any simple way?

typedef bit [63:0] bit64_t;
bit [63:0]          read_data[];
bit [127:0] bit128_read_data[];

task body();
bit128_read_data = rdata; //128 bit dynamic array 
read_data = new[bit128_read_data.size()]; //initialize the 64 bit array
    for(int i=0; i<bit128_read_data.size();i++) begin
	  read_data[i] = bit64_t'(bit128_read_data[i]);  //cast each element
	end
endtask

The only thing simpler at the moment is using a foreach loop.

task body();
  bit128_read_data = rdata; //128 bit dynamic array 
  read_data = new[bit128_read_data.size()]; //initialize the 64 bit array
  foreach(read_data[i])  read_data[i] = bit128_read_data[i][63:0];
endtask

A new feature being added to SystemVerilog IEEE 1800-2023 is an array map feature. You would be able to write much simpler:

task body();
  bit128_read_data = rdata; //128 bit dynamic array 
  read_data = bit128_read_data.map() with (item[63:0]);
endtask
1 Like