2016-02-04 109 views

回答

1

该解决方案背后的想法是避免硬编码枚举类型成员的case语句。你希望能够在一个游戏中改变类型。

比方说,你有以下枚举:

typedef enum {BISTRO, COFFEE_SHOP, BAR} places_e; 

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

vsim top +MEET_PLACE=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 
+0

您不需要'get_list()'函数。你可以结合使用make_list,或者只使用 '$ display(“你必须从这个列表中选择:%0p”,place_map.find_index()用(1));' –

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提供的代码,包装类作品通过遍历枚举条目并创建一个ASSOC数组,用于给定枚举的枚举[字符串]映射(作为模板参数提供)。所以如果你使用UVM 1.2,don't repeat

+0

非常好!我不得不承认,我还没有深入到1.2。 –