SystemVerilog值不在typedef枚举内

SystemVerilog值不在typedef枚举内,verilog,system-verilog,verification,Verilog,System Verilog,Verification,我不知道我哪里出了问题。我有一个命令结构(实际上大约100个命令),定义方式与下面类似 typedef enum bit [15:0] { CMD_1A = 16'h1000, CMD_1B = 16'h1100, CMD_1C = 16'h1110, CMD_2A = 16'h2000, CMD_2B = 16'h2100,

我不知道我哪里出了问题。我有一个命令结构(实际上大约100个命令),定义方式与下面类似

    typedef enum bit [15:0] { 
     CMD_1A           = 16'h1000,
     CMD_1B           = 16'h1100,
     CMD_1C           = 16'h1110,
     CMD_2A           = 16'h2000,
     CMD_2B           = 16'h2100,
     CMD_2C           = 16'h2200,
     CMD_2D           = 16'h2300,
     CMD_3A           = 16'h3000,
     CMD_4A           = 16'h4000,
     CMD_4B           = 16'h4010
      } command_type_e;

     rand command_type_e cmd_type;
在第一个#(1、2、3或4)左右,我有一节课,它打破了格式。这些命令具有公共部分,而其他命令部分是唯一的。这很容易控制,因为所有有效值都是在此typedef中定义的

在检查列表中定义的有效命令后,我要检查的是所有未定义的值,这样我就可以看到我的命令控制器如何处理它们,以及这些无效消息是否被正确丢弃

我试图创建一个无效的组,并将其约束为不在有效类型内,但这不起作用

    rand bit [15:0] inv_cmd_type;
    constraint not_in_range {!(inv_cmd_type inside {command_type_e});}
我尝试了其他两种方法,但都没有成功。我可以输入特定的值,但这是一个混乱,特别是因为每次创建新命令时都必须跟踪该列表

关于如何定义列表中没有的所有项目的想法


谢谢

您可以使用第6.19.5.7节中描述的模式,使用2012 LRM的枚举类型方法,创建枚举内所有文本的列表。适应您的情况(并固定格式):


基于此列表,创建约束非常简单。

您好,感谢您的回复。我成功了,所以我正在考虑你的建议。我对SystemVerilog有点陌生(背景是Verilog/VHDL,所以C++构造对我来说是新的。我的后续是,永远的循环需要在我的TyPerff完成的类之外吗?你会建议我创建一个函数或类似的,然后在调用函数的类中创建约束吗?”Kalvimac。在一个地方(您约束的类),然后将其放在那里。
command_type_e cmd = cmd.first;
command_type_e all_cmds[$];
forever begin
  all_cmds.push_back(cmd);
  if (cmd == cmd.last())
    break;
  cmd = cmd.next();
end