如何将open_range_list传入函数以在inside运算符中使用
SystemVerilog队列元素检查函数扩展实现
问题描述
我现有一个函数,当队列包含某一元素时返回1,否则返回0。我希望增强该函数,通过使用inside运算符来检查队列是否包含集合中的任意元素。
当前函数实现:
function bit queue_exists(int n); foreach(m_queue[x]) begin if (m_queue[x] == n) return 1; end return 0; endfunction
期望修改后的函数形式:
function bit queue_exists(/*open_range_list elements*/); foreach(m_queue[x]) begin if (m_queue[x] inside {elements}) return 1; end return 0; endfunction
请问在SystemVerilog中是否可以实现该需求?我不确定对应的语法是什么。我参考了SV-LRM 1800-2017标准的11.4.13节中关于“open_range_list”的定义:
inside_expression ::= expression inside { open_range_list } // from A.8.3
实现方案
可以实现该需求,SystemVerilog提供两种常用方式传递多元素/范围集合,配合inside运算符完成检查:
1. 动态数组参数
将函数参数声明为动态数组类型,直接接收符合open_range_list结构的集合:
function bit queue_exists(int elements[]); foreach(m_queue[x]) begin if (m_queue[x] inside elements) return 1; end return 0; endfunction
调用示例:
// 检查队列是否包含1、3、5中的任意一个 queue_exists('{1, 3, 5}); // 检查队列是否包含2到4范围内的任意值 queue_exists('{[2:4]});
2. 可变参数(varargs)
使用可变参数语法,调用时无需手动构造数组,直接传入多个元素:
function bit queue_exists(int elements...); foreach(m_queue[x]) begin if (m_queue[x] inside {elements}) return 1; end return 0; endfunction
调用示例:
// 直接传入多个元素 queue_exists(1, 3, 5); // 传递范围时仍需用数组包裹 queue_exists('{[2:4]});
关于open_range_list的说明
LRM中的open_range_list是inside运算符右侧的语法规则,允许单个值、范围或它们的组合,但它不能直接作为函数参数类型。通过动态数组或可变参数,我们可以间接传递符合该规则的集合,让inside运算符正常执行检查逻辑。
内容的提问来源于stack exchange,提问作者Melandru's Square
相关产品推荐
相关产品推荐

