SystemVerilog值不在typedef enum

时间:2018-03-19 19:29:40

标签: 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,
     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});}

我尝试了其他几种方法但没有取得多大成功。我可以输入特定的值,但这是一个混乱,特别是因为每次创建新命令时都必须跟踪该列表。

关于如何定义不在该列表中的所有项目的想法?

谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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