繁体   English   中英

内部运算符以包含 systemverilog 枚举的每个元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM