Search code examples
verilogsystem-verilog

How to merge 2 associative arrays with foreach in systemverilog?


I'm trying to merge 2 string type's associative arrays with foreach() https://stackoverflow.com/a/60496838/20066803

module test;
         
bit [31:0] arrayA[string];             
bit [31:0] arrayB[string];             
bit [31:0] arrayC[string];             
         
initial begin
arrayA["GOOD_PKT"]=7; 
arrayA["BAD_PKT"]=9;  
         
arrayB = '{"apple":5 , "orrange":6};   
         
foreach(arrayA[i]) begin
arrayC[i] = arrayA[i];
$display("arrayC[%0s]=%h", i, arrayC[i]);
end      
         
foreach(arrayC[i]) begin
arrayC[i] = arrayB[i]; 
$display("arrayC[%0s] = %0h", i, arrayC[i]);
end

/* This not work.
foreach(arrayC[i]) begin    
arrayC[i] = arrayB[i](arrayC);
$display("arrayC[%0s] = %0h", i, arrayC[i]);
end
*/

/* This not work.
arrayC = {arrayA,arrayB};
*/

I got only 2 elements

arrayC[BAD_PKT]=00000009
arrayC[GOOD_PKT]=00000009

but I expected 4 elements

arrayC[BAD_PKT]=00000009
arrayC[GOOD_PKT]=00000009
arrayC[apple]=00000005
arrayC[orange]=00000006

How to merge 2 associative arrays with foreach() in systemverilog?


Solution

  • There is a bug in your code, the second foreach use arrayC try this:

    foreach(arrayA[i]) begin
        arrayC[i] = arrayA[i];
        $display("arrayC[%0s]=%h", i, arrayC[i]);
    end      
             
    foreach(arrayB[i]) begin
        arrayC[i] = arrayB[i]; 
        $display("arrayC[%0s] = %0h", i, arrayC[i]);
    end