You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SystemVerilog中使用foreach合并两个关联数组?

SystemVerilog中使用foreach合并字符串索引关联数组的问题

我尝试使用foreach()合并两个以string类型为索引的关联数组,但结果不符合预期。

我的代码

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

/* 以下方法无效
foreach(arrayC[i]) begin    
arrayC[i] = arrayB[i](arrayC);
$display("arrayC[%0s] = %0h", i, arrayC[i]);
end
*/

/* 以下方法无效
arrayC = {arrayA,arrayB};
*/
end
endmodule

实际运行结果

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

期望结果

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

问题原因与解决方法

你原代码中第二个foreach遍历的是arrayC已有的键(来自arrayA的两个索引),尝试用arrayB的对应键值覆盖,但arrayB中不存在这些键,因此既无法修改原有值,也无法添加新的键值对。另外你原代码中arrayB的键存在拼写错误(orrange应为orange),这也会导致最终结果的键名和期望不符,需要修正。

正确的做法是在复制完arrayA到arrayC后,遍历arrayB的所有元素,将其键值对逐个添加到arrayC中:

修改后的核心代码:

initial begin
arrayA["GOOD_PKT"]=7; 
arrayA["BAD_PKT"]=9;  
         
// 修正拼写错误
arrayB = '{"apple":5 , "orange":6};   
         
// 先复制arrayA到arrayC
foreach(arrayA[i]) begin
    arrayC[i] = arrayA[i];
    $display("arrayC[%0s]=%h", i, arrayC[i]);
end       

// 遍历arrayB,添加所有元素到arrayC
foreach(arrayB[i]) begin
    arrayC[i] = arrayB[i];
    $display("arrayC[%0s] = %0h", i, arrayC[i]);
end
end

SystemVerilog不支持直接用大括号{}合并关联数组,必须通过遍历逐个添加键值对。修改后运行即可得到包含4个元素的arrayC,匹配预期结果。

内容的提问来源于stack exchange,提问作者bu-ral

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:15:02