SystemVerilog队列是先进先出,队列可变大小来存储相同数据类型的元素。
它类似于自动增长和收缩的一维未压缩(unpacked)数组。 也可以通过索引,连接和切片运算符来操作它们。 队列可以作为ref或non-ref参数传递给任务/功能。
语法和用法
队列的区别在于使用$运算符指定了大小。
[data_type] [name_of_queue] [$];
string name_list [$]; // 字符串元素队列
bit [3:0] data [$]; //4位元素队列
logic [7:0] elements [$:127]; // 8位有界队列,最大大小为128个插槽
int q1 [$] = { 1, 2, 3, 4, 5 }; // 整数队列,初始化元素
int q2 [$]; // 整数队列,空
int tmp; // 临时变量来存储值
tmp = q1 [0]; //获取q1的第一项(索引0)并存储在tmp中
tmp = q1 [$]; // 获取q1的最后一项(索引4)并存储在tmp中
q2 = q1; // 将q1中的所有元素复制到q2中
q1 = {}; // 清空队列(删除所有项目)
q2[2] = 15; //将索引2处的元素替换为15
q2.insert (2, 15); //将值15插入索引#2
SystemVerilog队列的例子
module tb;
// 创建一个可以存储“字符串”值的队列
string fruits[$] = { "orange", "apple", "kiwi" };
initial begin
//迭代并访问每个队列元素
foreach (fruits[i])
$display ("fruits[%0d] = %s", i, fruits[i]);
//显示队列中的元素
$display ("fruits = %p", fruits);
//删除队列中的所有元素
fruits = {};
$display ("After deletion, fruits = %p", fruits);
end
endmodule
Simulation Log
ncsim> run
fruits[0] = orange
fruits[1] = apple
fruits[2] = kiwi
fruits = '{"orange", "apple", "kiwi"}
After deletion, fruits = '{}
ncsim: *W,RNQUIE: Simulation is complete.
参考文献:
【1】https://www.chipverify.com/systemverilog/systemverilog-queues