【IEEE_SV-7.10】队列Queues

队列是大小可变,同类元素的有序集合。队列支持对所有元素常量时间访问,常量时间插入和在对列的开始和末尾删除的操作。队列中的每个元素通过一个序号标识,这个序号代表了元素在对列中的位置,0代表第一个元素,$代表最后一个元素。队列是和可以自动增长和收缩的一维的非合并数组类似。因此,与数组一样,可以使用索引、连接、切片操作符语法和相等操作符对队列进行操作。
队列与非合并数组使用相同的语法进行声明,但是指定$作为数组的大小。可以通过指定队列的可选右边界(最后一个索引)来限制队列的最大大小。
队列的值可以通过赋值形式或非合并数组拼接写入。
对列声明的语法在Synatax7-4说明。
variable_dimension ::= // from A.2.5
unsized_dimension
| unpacked_dimension
| associative_dimension
| queue_dimension
queue_dimension ::= [ $ [ : constant_expression ] ]
Constant_expression的值应该是一个正整数值。
例如:

byte q1[$]; //byte类型的队列
string names[$] = {"Bob"}; //有一个元素的字符串队列
integer Q[$] = {3, 2, 7}; //integer类型的初始化队列
bit q2[$:255]; //最大size是256byte的队列

如果在声明中没有提供初始值,队列变量被初始化为空的队列。空队列可以通过一个空非合并数组拼接符{}表示,在10.10中描述。

7.10.1 队列运算符

队列应该与非合并数组一样支持相同的操作。另外,队列应该支持以下操作:
—队列应该调整大小以适应写入它的任何值,除了它的最大值在7.10中描述的被限制。
—队列片段表示式像Q[a:b],片段可以是任意的整数表达式,特别是,不要求是常数表达式。
—队列应该支持这些方法,在7.10.2中描述。
不像数组,空队列{},是一个有效的队列和一些队列操作的结果。以下规则管理队列操作符:
—Q[a:b]产生一个具有b-a+1个元素的队列
1.如果a>b,然后Q[a:b]产生一个空队列{};
2.Q[n:n]产生一个有一个元素的队列,位置是n。Q[n:n] === {Q[n]};
3.如果n位于Q的范围之外(n<0或n>$),Q[n]产生一个空队列{};
4.如果a或b是包含x或z的四态表达式,它产生一个空队列{}。
—Q[a:b],当a<0时和Q[0:b]相同。
—Q[a:b],当b>$时和Q[a:$]相同。
—一个无效的索引值(例如一个有x或z的四态表示式或者在0…$之外)将导致读取操作返回适合队列元素类型的不存在数组项的值。
—一个无效的索引值(例如一个有x或z的四态表示式或者在0…$+1之外)应该引起忽略的写操作,并且发出运行警告;然而,写到Q[$+1]是合法的。
—使用[$:N]语法声明右边界的队列称为有界队列,应限于索引不大于N(它的大小不应该超过N+1)。控制有界队列的附加规则将在7.10.5中描述。

7.10.2 队列方法Queue methods

除了数组操作符,队列提供几个内置的方法。假设下面的例子有以下声明:

typedef mytype element_t; // mytype 是队列的任何合法类型
typedef element_t queue_t[$];
element_t e;
queue_t Q;
int i;
7.10.2.1 Size()

size()方法的原型如下:
function int size();
size()方法返回队列中元素的数目。如果队列是空的,返回0。
for (int j = 0; j < Q.size; j++) $display(Q[j]);

7.10.2.2 Insert()

insert()方法的原型如下:
function void insert(input integer index, input element_t item);
insert()方法在指定索引位置插入给定的项。
如果索引参数得任何位有未知(x或z)值,或者是负值,或者比当前size大,此方法调用应该对队列没有影响,可能引起一个警告。
注意—index参数是整型而不是int型,这样就可以检测到调用中实际参数值中的x/z值。

7.10.2.3 Delete()

delete()方法的原型如下:
function void delete( [input integer index] );
index是一个可选择的索引。
如果index没有指定,delete()方法删除队列中的所有元素,留下一个空队列。
如果指定了index,delete()方法删除指定索引的元素。如果索引参数的任何位有x或z,或者是负值,或者等于或大于队列的大小,这个方法对队列没有影响,可能引起产生一个警告。

7.10.2.4 Pop_front()

pop_front()方法的原型如下:
function element_t pop_front();
pop_front()方法移除并返回队列的第一个元素。
如果这个方法被一个空队列调用:
—它的返回值应该与试图读取与队列元素相同类型的不存在的数组元素的返回值相同
—它将不会对队列产生影响,并可能导致发出警告

7.10.2.5 Pop_back()

pop_back()方法的原型如下:
function element_t pop_back();
pop_back()方法移除并返回队列的最后一个元素。
如果这个方法被一个空队列调用:
—它的返回值应该与试图读取与队列元素相同类型的不存在的数组元素的返回值相同
—它将不会对队列产生影响,并可能导致发出警告

7.10.2.6 Push_front()

push_front()的原型如下:
function void push_front(input element_t item)
push_front()方法在队列前面插入指定的值。

7.10.2.7 Push_back()

push_back()方法的原型如下:
function void push_back(input element_t item);
push_back()方法插入指定的值到队列结尾。

7.10.3 对队列元素的引用的持久性Persistence of references to elements of a queue

如13.5.2所述,可以将队列中的元素通过引用传递给继续持有该引用的任务,同时对队列执行其他操作。队列上的一些操作将导致任何此类引用过时(如13.5.2中定义的那样)。本小节定义了对队列元素的引用过时的情况。
当7.10.2中描述的任何队列方法更新队列时,对任何未被该方法删除的现有元素的引用都不会过时。通过该方法从队列中删除的所有元素都将成为过时的引用。
当赋值的目标是一个完整的队列时,对原始队列中任何元素的引用都将过时。
作为这个子句的结果,使用unpack数组连接语法在队列中插入元素(如7.10.4中的示例所示)将导致对现有队列中任何元素的所有引用都过时。使用delete、pop_front和pop_back方法会使对弹出或删除元素的引用过时,但对队列中所有其他元素的引用不会受到影响。相比之下,在队列上使用insert、push_back和push_front方法永远不会导致过时的引用(除非在有界队列上使用insert或push_front方法)

7.10.4 使用赋值和非合并数组拼接更新一个队列Updating a queue using assignment and unpacked array concatenation

如7.10所述,队列变量可以通过赋值来更新。在对队列变量执行操作时,它与未打包的数组连接一起,为7.10.2中描述的队列方法提供了一种灵活的替代方法。
下面的例子展示了与队列方法类似的队列赋值操作。在每种情况下,队列变量的结果值都应该与应用了队列方法一样,但任何对队列元素的引用都会在赋值操作后过时(见7.10.3):

int q[$] = { 2, 4, 8 };
int e, pos;
// assignment // method call yielding the
// // same value in variable q
// ----------------------------- // -------------------------
q = { q, 6 }; // q.push_back(6)
q = { e, q }; // q.push_front(e)
q = q[1:$]; // void'(q.pop_front()) or q.delete(0)
q = q[0:$-1]; // void'(q.pop_back()) or
// q.delete(q.size-1)
q = { q[0:pos-1], e, q[pos:$] }; // q.insert(pos, e)
q = { q[0:pos], e, q[pos+1:$] }; // q.insert(pos+1, e)
q = {}; // q.delete()

下面的示例演示了一些不能作为单个队列方法调用实现的有用操作。与前面的例子一样,对队列变量的赋值将使对其元素的任何引用都过时。

7.10.5 有界的队列Bounded queues

一个有界队列不能有一个索引大于队列声明的上限的元素。
在有界队列上的操作应该完全像队列无界一样,除非,在对有界队列变量进行写操作后,该变量有任何超出其边界的元素,那么所有这些超出边界的元素将被丢弃,并发出警告。
注:实现可以以任何方式满足这一需求,从而达到相同的结果。特别是,在丢弃它们之前,它们不要求写超出边界外的元素。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值