如何在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
相关产品推荐
相关产品推荐

