SystemVerilog在通过不同类型的阵列构建复杂的数据结构方面提供了极大的灵活性。
Static Arrays
静态数组是在编译之前就知道大小的数组。在下面显示的示例中,声明了一个8位宽的静态数组,并为其分配了一些值,然后进行迭代以打印其值。
module tb;
bit [7:0] m_data; // A vector or 1D packed array(向量或一维压缩数组)
initial begin
// 1. 给数组赋值
m_data = 8'hA2;
// 2. 遍历数组的每一位并打印值
for (int i = 0; i < $size(m_data); i++) begin
$display ("m_data[%0d] = %b", i, m_data[i]);
end
end
endmodule
静态数组可进一步分为打包数组(packed)和未打包数组(unpacked)。
bit [2:0][7:0] m_data; // Packed(合并数组)
bit [15:0] m_mem [10:0]; // Unpacked(非合并数组)
Dynamic Arrays动态数组
动态数组的大小在编译期间未知,而是在运行时根据需要定义和扩展的。动态数组可以通过其空方括号[]轻松识别。
int m_mem []; // 动态数组,大小未知,但包含整数值
关联数组Associative Arrays
关联数组是一种使用特定键存储内容的数组。可以通过方括号[]中存在数据类型来轻松识别这一点。键显示在方括号内。
int m_data [int]; //键是int类型的,数据也是int类型的
int m_name [string]; // 键是字符串类型,数据是int类型
m_name ["Rachel"] = 30;
m_name ["Orange"] = 2;
m_data [32'h123] = 3333;
Queue列
队列是一种数据类型,其中数据可以被推入队列或从阵列中弹出。方括号[]中的$符号很容易识别它。
int m_queue [$]; // Unbound queue, no size
m_queue.push_back(23); // Push into the queue
int data = m_queue.pop_front(); // Pop from the queue
参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-arrays#queues