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

如何在Specman/e中用变量创建固定多维数组并访问元素/行?

好的,我来帮你梳理下在Specman/e里实现类似SystemVerilog中固定维度多维数组的方法,包括声明、赋值以及元素/整行的访问,直接对应你给出的SV示例来拆解:

1. 声明固定维度的多维数组

对应SV里的bit [7:0] arr [4][8];(4行8列的字节数组),Specman/e里用fixed list定义固定大小的列表(匹配你要的固定维度需求):

var arr: fixed list of fixed list of byte is new[4]; // 先创建包含4个元素的外层列表,每个元素是未初始化的内层列表

这里的fixed list表示列表大小不可动态增减,完全对应SV的固定维度数组特性。外层列表大小设为4(对应SV的4行),后续我们再把每个内层列表初始化为8个字节的固定列表。

2. 初始化整行数据并赋值给多维数组

对应SV里的row = '{1, 2, ..., 8};,Specman/e直接用列表字面量初始化固定列表:

var row: fixed list of byte = [1, 2, 3, 4, 5, 6, 7, 8];

循环赋值时要注意:Specman/e的list是引用类型,直接赋值会让所有行指向同一个列表,因此需要用.copy()创建独立副本,避免后续修改某一行影响其他行:

print("Array:");
foreach arr using index i {
    arr[i] = row.copy(); // 给第i行赋值独立的行副本
    printf("row[%d] = %p", i, row);
}

3. 访问单个元素和整行

  • 访问单个元素:语法和SV几乎一致,用双重索引即可。比如你要访问第3行(索引2)的第4个元素(索引3):
printf("\narr[2][3] = %d", arr[2][3]); // 输出结果为4,和SV示例完全一致
  • 访问整行:直接取外层列表的索引就能拿到整行数据,比如arr[2]就代表第3行的整个8元素列表,你可以直接打印或赋值给其他变量:
var target_row: fixed list of byte = arr[2];
printf("Target row content: %p", target_row);

完整的Specman/e示例代码

把上面的逻辑整合到一个可运行的代码块里,对应你的SV function:

extend sys {
    run() is also {
        var arr: fixed list of fixed list of byte is new[4];
        var row: fixed list of byte = [1, 2, 3, 4, 5, 6, 7, 8];
        
        print("Array:");
        foreach arr using index i {
            arr[i] = row.copy();
            printf("row[%d] = %p", i, row);
        }
        
        printf("\narr[2][3] = %d", arr[2][3]);
        
        // 额外演示整行访问
        var third_row: fixed list of byte = arr[2];
        printf("\nThird row content: %p", third_row);
    };
};

关键差异说明

和你的SV示例相比,核心区别点:

  • Specman/e用fixed list对应SV的固定维度数组,普通list是动态可变大小的
  • 列表赋值需要.copy()避免引用共享(SV数组赋值默认是值拷贝,无需额外操作)
  • 循环获取索引用foreach ... using index,逻辑和SV的foreach一致

内容的提问来源于stack exchange,提问作者evilpascal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:38:20