SystemVerilog中队列的越界访问
1 开始索引等于结束索引
2 开始索引大于结束索引
【示例】
3 开始索引小于0
【示例】
4 结束索引大于$
【示例】
5 开始索引小于0,结束索引大于$
【示例】
6 索引为不定态或者高阻态
【示例】
示例中,访问队列中元素时,索引为不定态和高阻态,此时返回的值为队列类型logic的默认值x,并没有访问到任何有效元素。这说明,如果访问队列的索引无不定态或者高阻态,那么实际访问的效果相当于访问队列中不存在的元素,返回的数据值为队列类型的默认值。
当然除了上述示例的读访问操作外,也可能存在对队列越界或者无效索引的写访问操作。如下例所示。
【示例】索引为不定态或者高阻态时进行写访问操作
示例中,对队列名为q_data,索引为’hx和’hz的元素进行写访问操作,写操作时候通过foreach将队列q_data中的所有元素输出,并输出队列的大小,发现队列的元素个数和值都没有发生变化,再对索引为’hx和’hz的元素进行读访问操作,读出的数值为队列q_data数据类型的默认值,说明前边的写操作根本就没有影响到队列本身,也并没有写入到索引为’hx和’hz的队列元素中,可见对于索引为不定态或者高阻态时进行的写访问操作会被忽略掉。
【示例】索引小于0时进行写访问操作
【仿真结果】
示例中,对队列名为q_data,索引为-1的元素进行写访问操作,写操作时候通过foreach将队列q_data中的所有元素输出,并输出队列的大小,发现队列的元素个数和值都没有发生变化,再对索引为-1的元素进行读访问操作,读出的数值为队列q_data数据类型的默认值,说明前边的写操作根本就没有影响到队列本身,也并没有写入到索引为-1的队列元素中,可见对于索引为小于0的数时进行的写访问操作会被忽略掉。
【示例】索引大于$时进行写访问操作
通过上述示例中对于队列的各种读写越界访问操作,汇总结论如下:
Ø 在队列或者数组中,如果通过索引读访问其中某个元素,当开始索引与结束索引一致时,此时引用该数组元素时可仅使用开始索引或者结束索引之一即可,即arr[n:n] =arr[n]。
Ø 读访问队列片段时,如果开始索引值大于结束索引值,那么获得的队列片段为空。
Ø 如果读访问队列的结束索引位于队列的大小范围内,开始索引小于0,那么实际访问的效果相当于开始索引从0开始。
Ø 如果读访问队列的开始索引位于队列大小范围内,结束索引超过队列最后一个元素,那么实际访问的效果相当于结束索引为$。
Ø 如果读访问队列的开始索引和结束索引都位于队列大小范围外(开始索引值小于0,结束索引大于$),那么实际访问的效果相当于访问的是整个队列。
Ø 如果读访问队列的索引无不定态或者高阻态,那么实际访问的效果相当于访问队列中不存在的元素,返回的数据值为队列类型的默认值。
Ø 对于索引为不定态或者高阻态时进行的写访问操作会被忽略掉。
Ø 对于索引为小于0的数时进行的写访问操作会被忽略掉。
Ø 对于队列索引为$+1的写操作是可以进行的,写入的元素将压入队列尾部,新的队列的最后一个元素就是这个新压入的元素,此时其对应的索引可通过$表示。