如何在SystemVerilog中将字符串转换为枚举?

时间:2016-02-04 22:33:47

标签: system-verilog uvm

我有命令行plusargs,我想映射到枚举值。

 vsim foo +MY_PLUSARG=BAR

如何让字符串"BAR"成为枚举BAR

2 个答案:

答案 0 :(得分:3)

如果您使用的是UVM 1.2或有权访问该库,则可能需要使用 uvm_enum_wrapper 类进行转换。它是 uvm_globals.svh 中定义的模板类包装器,您可以按如下方式使用它:

typedef enum {BISTRO, COFFEE_SHOP, BAR} places_e;

typedef uvm_enum_wrapper#(places_e) places_wrapper;
places_e place;

places_wrapper::from_name("BAR", place);

this solution中提供的代码非常相似,封装类通过遍历枚举条目并为给定枚举(作为模板参数提供)的枚举[string]映射创建assoc数组来工作。因此,如果您使用的是UVM 1.2,don't repeat

答案 1 :(得分:1)

这个解决方案背后的想法是避免硬编码枚举类型成员的案例陈述。您希望能够在一个游戏中更改类型。

假设你有以下枚举:

typedef enum {BISTRO, COFFEE_SHOP, BAR} places_e;

您希望您的用户能够输入:

 vsim top +MEET_PLACE=BAR

现在您要将字符串"BAR"翻译为枚举'Bar'。

你可以这样做:

   typedef enum {BISTRO, COFFEE_SHOP, BAR} places_e;

module top;

   places_e place_map[string];

   function void make_map;
      places_e pl;
      pl = pl.first();
      do begin
         place_map[pl.name()]=pl;
         pl = pl.next();
      end while (pl != pl.first());
   endfunction // make_map

   function string get_list;
      string ss;
      places_e pl;
      pl = pl.first();
      ss = "";
      do begin
         ss = {ss, " ",pl.name()};
         pl = pl.next();
      end while (pl != pl.first());
      return ss;
   endfunction // get_list

   initial begin
      string place_str;
      places_e place;
      make_map;

      if (!$value$plusargs("MEET_PLACE=%s", place_str)) begin
         $display("You must choose a MEET_PLACE");
         $finish;
         end

      if (! place_map.exists(place_str)) begin
         $display("You must choose from this list: %s", get_list());
         $finish;
      end

      place = place_map[place_str];

      $display("Let's meet at a %s!", place.name());
   end // initial begin
endmodule // top