注意:全是干货
from chat:
SystemVerilog中的队列(Queue)是一种动态数组,具有先进先出(FIFO)或后进先出(LIFO)的特性,能够在运行时动态增加或减少其大小。队列在硬件描述和验证中非常有用,尤其适用于仿真环境中的数据缓冲和传输。
队列的定义和基本操作
队列的定义
队列可以用任意类型定义,例如整数类型、结构体类型等。以下是一个定义整型队列的示例:
int queue_name[$];
初始化队列
可以直接使用初始化列表来初始化队列:
int queue_name[$] = {1, 2, 3, 4};
基本操作
添加元素
使用push_back()
方法在队列末尾添加元素:
queue_name.push_back(5);
使用push_front()
方法在队列开头添加元素:
queue_name.push_front(0);
删除元素
使用pop_back()
方法删除队列末尾的元素:
queue_name.pop_back();
使用pop_front()
方法删除队列开头的元素:
queue_name.pop_front();
访问元素
可以使用索引直接访问队列中的元素:
int first_element = queue_name[0]; int last_element = queue_name[$ - 1];
队列长度
使用$size
函数获取队列的长度:
int queue_size = queue_name.size();
删除指定索引的元素
使用delete()
方法删除指定索引的元素:
queue_name.delete(1); // 删除索引为1的元素
示例
以下是一个包含队列的完整示例,展示了各种基本操作:
输出示例
注意:上面来自gpt的东西仅供参考,主要是来介绍一下
一、delete 操作
1、队列中的delete操作传进去的参数是你想删除的元素对应的索引,从下面的图片中可以看出。如果这里的参数5是队列中的值,那么肯定不会出现这里的Error。vcs提示就是索引值超出了队列的大小。
二、insert 操作
这里介绍一下insert操作,insert(参数1 , 参数2 ),这个操作共有两个参数,这里的参数1 是你插入队列的位置的索引,参数2是你想要插在队列里的值。参数1表示插在哪里,参数2表示插什么。例如
看上面的箭头所指,简直就是一目了然,我想在队列q1 的索引为2的位置插入5,那么要注意的一点就是,原来索引为2的值自动往后面移动,因为位置被占了。还有一点索引值是从0开始的
三、find () with( item) 操作
1、这个操作有很多需要注意的地方,这个操作是为了去寻找你需要找的的队列里面你想要找到的值,其中,item是默认内置的参数,直接用就行,你比如说下面的列子。
注意17行代码,显示的是要去寻找q1里面 item(元素)> 4 的值,那么可以看到输出得到的结果是’{'h5},要注意,我这里结果是 '{'h5} 而不是 'h5。这两个有很大的区别,一个是队列,一个是元素。也就是说,这个操作最终返回的是队列而不是一个简单的元素。下面的也是同样的。
四、find_index ()with ( item)操作
1、这里的这个操作和上面的有点不同,需要注意。直接看一个有问题的例子
在这里,注意看右边的仿真输出,我的q5[$]在定义的时候是bit类型的,仿真输出提示,source is int[$],也就是说,这个操作的返回值不仅是个队列,还是一个int类型的队列,下面看正确的列子
这里我已经将q5[$],定义为了int类型的队列,现在解决了刚才的Error-类型不匹配的问题,现在来讲讲这里的输出为什么是{2,4,5},首先需要注意的是这个操作返回的也是一个队列,这个队列里和上一个操作所存放的东西不一样,一个是被操作队列里面的值,一个是被操作队列里值的索引,这里的被操作队列在例子中是q1,现在来解释一下,代码中的第18行,也就是这里的操作,后面的with(item >2)这部分还是去找队列的值,解释:找元素大于2的值,在例子中就是 上面红色椭圆圈出来的三个值,现在去执行操作,find_index()顾名思义就是去找这几个值对应的索引,所以有了输出'{2,4,5}且这里的几个索引的类型是整型的。这里也是最容易忘记的地方,返回的队列是int类型的队列。
值得注意的是这个操作可以使用>= 或者 <= 有的地方是不允许这样操作的。
总结:
结束,如果记录的有什么不对的,请指正,还有就是记录的就顾自己看懂了,有的就很草率,我也想把遇到的问题分享出来,大家有相似问题可以解决。所以有什么建议都可以留言......
2024/6/24 20:22