有没有办法按名称传递枚举值作为命令行参数?

时间:2016-02-05 09:34:52

标签: system-verilog uvm

有没有办法从命令行传递枚举值?相反,什么是最干净的解决方案?

我试过以下,

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

2 个答案:

答案 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