我有命令行plusargs,我想映射到枚举值。
vsim foo +MY_PLUSARG=BAR
如何让字符串"BAR"
成为枚举BAR
?
答案 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