[英]inside operator to include every element of systemverilog enum
有没有办法对enum
每个元素使用inside
运算符? 例如,我有以下enum
:
typedef enum {ADD, SUB, MUL, DIV, MOD} Instr_t;
在编写约束或检查收到的opcode
是否是有效指令之一时,是否有更简单的方法我尝试过以下操作:
if (opcode inside {Instr_t})
这失败了,我需要使用扩展enum
:
if (opcode inside {ADD, SUB, MUL, DIV, MOD})
当enum
较小时这很容易,但对于较大的enum
会很烦人,我认为的另一种方式是使用define
。
不需要这个约束。 约束求解器不允许将值分配给声明的枚举标签集之外的随机枚举变量。
IEEE 刚刚批准了对 LRM 的澄清,该澄清将在标准的下一次更新中发布。
https://accellera.mantishub.io/view.php?id=4939
如果要创建指令子集,可以将枚举标签组放入一个数组中,并使用该数组与 inside 运算符
typedef enum {ADD, SUB, MUL, DIV, MOD,OR, AND, XOR} opcode_t;
const opcode_t arithmetic_ops[] = {ADD, SUB, MUL, DIV, MOD};
const opcode_t logical_ops[] = {OR, AND, XOR};
if (opcode inside {arithmetic_ops})
您需要首先声明该枚举的变量并在内部使用它。
例如:
opcode_t op;
if(opcode inside {op})
//continue
如果您希望针对整个枚举空间检查值,您可以执行以下操作:
opcode_t op = opcode_t'(42);
if (op.name()=="") begin
$display("Invalid opcode: %s (%d)", op.name(), op);
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.