SystemVerilog值不在typedef枚举内
我不知道我哪里出了问题。我有一个命令结构(实际上大约100个命令),定义方式与下面类似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,
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