【system verilog】foreach遍历多维数组

本文通过实验演示了多维数组的遍历顺序,揭示了索引倒置的规律,对于理解数组内存布局和优化遍历策略具有指导意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

关于多维数组的便利顺序,请参考:

https://blog.csdn.net/moon9999/article/details/104190800

正篇

先搬出这个神图,然后做个实验:

实验1:

打印结果:

显然先遍历的[3:0],之后是[1:0],最后是[2:0],就是我们索引时候倒过来。

 

 

### 关于 SystemVerilog 数组函数的使用 #### 动态数组和队列的操作 在 SystemVerilog 中,`shuffle` 是一个系统函数,用于对动态数组或队列进行随机打乱(洗牌)操作[^2]。下面展示如何定义并使用 `shuffle` 函数来处理动态数组: ```systemverilog module shuffle_example; int dynamic_array[]; initial begin // 初始化动态数组 dynamic_array = new[5]; dynamic_array = '{1, 2, 3, 4, 5}; // 打印原始数组 $display("Original array:"); foreach (dynamic_array[i]) $write("%0d ", dynamic_array[i]); $display(); // 随机打乱数组顺序 dynamic_array.shuffle(); // 打印打乱后的数组 $display("Shuffled array:"); foreach (dynamic_array[i]) $write("%0d ", dynamic_array[i]); $display(); end endmodule : shuffle_example ``` 这段代码展示了创建一个整数类型的动态数组,并对其进行初始化;接着调用了 `shuffle()` 方法对该数组进行了原地随机排列。 #### 定长数组的基础操作 对于定长数组,在 SystemVerilog 中可以执行更复杂的操作相比早期版本的 Verilog。例如支持批量赋值以及多种维度的支持等特性被引入到了新标准之中[^1]。这里给出一段简单的例子说明怎样声明与初始化一个多维固定大小数组: ```systemverilog module fixed_array_operations; logic [7:0] matrix [3][4]; // 声明了一个8位宽、3行4列的二维逻辑矩阵 initial begin // 利用大括号语法完成整个数组的同时赋初值 matrix = '{{'hFF,'hAA,'hBB,'hCC}, {'hDD,'hEE,'hFF,'hGG}, {'hHH,'hII,'hJJ,'hKK}}; // 访问单个元素 $display("matrix[1][2] = %h", matrix[1][2]); // 修改特定位置上的数值 matrix[2][3] = 'hLL; // 输出修改后的全部数据 foreach(matrix[row,col]) { $write("(%d,%d):%h ", row, col, matrix[row][col]); } $display(); end endmodule : fixed_array_operations ``` 上述模块中不仅体现了多维静态数组的声明方式及其成员访问模式,还包含了整体性赋值语句的应用实例。 #### 关联数组的功能扩展 除了传统的线性存储外,SystemVerilog 还允许通过哈希表或其他非连续内存布局实现高效的数据检索机制——即所谓的关联数组[^4]。这类特殊形式的集合能够依据键值快速定位到对应的记录项而无需遍历整个序列。下述片段描述了一种基于散列表结构建立起来的大容量映射关系: ```systemverilog module associative_arrays_usage; bit [63:0] rom [bit [63:0]]; // 构建关联数组 bit [63:0] idx; // 对应索引变量 function automatic void print(bit [63:0] pos, ref bit [63:0] rom [bit [63:0]]); $display("rom[%d]=%d", pos, rom[pos]); endfunction : print initial begin idx = 1; repeat(64) begin rom[idx] = idx; idx = idx << 1; end if (rom.first(idx)) begin print(idx, rom); while (rom.next(idx)) print(idx, rom); end end endmodule : associative_arrays_usage ``` 该案例里实现了向关联数组插入一系列条目并将它们逐一打印出来的过程,同时也演示了迭代器样式的便利接口如 `first()`, `next()` 的运用技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼德兰的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值