有没有办法从命令行传递枚举值?相反,什么是最干净的解决方案?
我试过以下,
typedef enum int unsigned { white, black, red } colour_e;
class house;
rand colour_e colour;
string n_colour = "white";
constraint c_colour {
colour.name() == n_colour;
}
endclass: house
program top;
house paradise;
initial begin
paradise = new();
void'($value$plusargs("colour=%0s", paradise.n_colour));
if (!paradise.randomize())
$display("not randomized");
else
$display("paradise.colour = %s",paradise.colour);
end
endprogram: top
我希望传递类似+colour=black
的内容。所以paradise.colour被指定为黑色。
vcs在约束中使用enum.name()
。
以下是错误。
错误 - [NYI-CSTR-SYS-FTC] NYI约束:sys函数调用 T-enum_1.sv,9 $ unit,“this.colour.name”系统函数调用 尚未在约束中实现。删除函数调用或if 可以用分配的积分状态变量替换它 pre_randomize()。
而里维埃拉在下面喊道
错误VCP7734“a。中不允许使用'this.colour.name()'的类型 约束块。约束中只允许使用整数类型 阻止。“”design.sv“9 1错误VCP7734”'n_colour'的类型不是 允许在约束块中。 a中只允许使用整数类型 约束块。“”design.sv“9 1警告VCP7114”STRING值 期望格式说明符%s作为参数 paradise.colour。“”testbench.sv“13 54
这给我带来了问题,禁区块中的所有内容都必须是整数类型(就像我们不能将string
声明为rand
变量一样)?
ANyone想要玩代码,请查看EDA游乐场的代码here
答案 0 :(得分:1)
使用 uvm_enum_wrapper 类进行从字符串到相应枚举值的转换。它是uvm_globals.svh(UVM 1.2的一部分)中定义的模板类包装器,您可以按如下方式使用它:
typedef enum {white, black, red} colour_e;
typedef uvm_enum_wrapper#(colour_e) colour_wrapper;
string colour_str;
void'($value$plusargs("colour=%0s", colour_str));
colour_wrapper::from_name(colour_str, paradize.n_colour);
包装类 uvm_enum_wrapper 的工作原理是遍历枚举条目并为给定枚举类型(作为模板参数提供)的枚举[string]映射创建一个assoc数组。有关详细信息,请查看the documentation。
答案 1 :(得分:0)
还有另一种解决方案。如果您没有使用UVM 1.2版本,那么您可以将字符串作为输入参数并将该字符串参数转换为int类型。之后,您可以通过$ cast直接将int转换为枚举类型。 因为没有办法将字符串转换为枚举类型(UVM 1.2除外)所以你必须为它添加一个额外的步骤。
module Test;
typedef enum {black,red,blue} color_e; //enum declaration
color_e color; //type of enum
string cmd_str; //Commandline string input
int cmd_int; //Input string is first converted into int
initial
begin
$value$plusargs("enum_c=%0s",cmd_str); //Take input argument as string it may be 0,1 or 2
cmd_int=cmd_str.atoi(); //Now convert that string argument into int type
$cast(color,cmd_int); //Casting int to enum type
$display("Value of color is --> %p",color); //Display value of enum
end
endmodule