inside运算符包含systemverilog枚举的每个元素

时间:2016-08-09 18:29:11

标签: system-verilog

有没有办法为inside的每个元素使用enum运算符? 例如我有以下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

3 个答案:

答案 0 :(得分:3)

不需要这种约束。不允许约束求解器为一组在声明的枚举标签之外的随机枚举变量赋值。

IEEE刚刚批准了LRM的澄清,将在下一次更新标准时发布。

https://accellera.mantishub.io/view.php?id=4939

更新

如果要创建指令子集,可以将枚举标签组放入数组中,并将数组与内部运算符一起使用

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})

答案 1 :(得分:0)

您需要首先声明该枚举的变量并将其与内部一起使用。

例如:

opcode_t op; 
if(opcode inside {op}) 
//continue

答案 2 :(得分:0)

如果要检查整个枚举空间的值,可以执行以下操作:

opcode_t op = opcode_t'(42);
if (op.name()=="") begin
  $display("Invalid opcode: %s (%d)", op.name(), op);
end