2

有没有办法在系统 verilog 中将字符串转换为枚举?

typedef enum {ABC1,ABC2,ABC3} abc;

program Test ;
    abc x1;
    string teststring;   
    initial
    begin
        teststring="ABC2";
        x1=abc'(teststring); // Static cast doesn't work
        $display("[%s][%0d]",teststring,x1);
    end
endprogram
4

1 回答 1

2

铸造是按价值,而不是名称。假设您使用的是默认枚举数据类型 (int) 并且未将值分配给任何标识符,则ABC1,ABC2和分别具有,和和ABC3的值(所有类型均为 int)。012

对此进行 sting 与enum将其转换为int. int'("ABC2") == 32'h41424332并且不匹配任何枚举标识符的值。

获得所需功能的选项:

  1. 创建一个遍历列表并比较名称的函数:

    function abc a2e(input string s);
        a2e = a2e.first;
        repeat(a2e.num) begin
            if(a2e.name == s) return a2e;
            else a2e = a2e.next;
        end
        assert(0) else $error("Identifier '%s' not in enum abc",s);
    endfunction
    

    有关枚举方法的更多信息:IEEE Std 1800-2012第 6.19.5 节

  2. 关联数组查找:(参见IEEE Std 1800-2012第 7.8 和 7.9 节)

    abc lookup[string];
    ...
    x1 = abc.first;
    repeat(x1.num) begin
        lookup[x1.name] = x1;
        x1 = x1.next;
    end
    ...
    teststring="ABC2";
    /* Without protection: Non-match creates new entry for with the value
       of abc.first (or '{default:???} if specified) and returns the value */
    x1 = lookup[teststring];
    
    // With protection
    if ( lookup.exists( teststring ))
        x1= lookup[teststring];
    else
        assert(0) else $error("Identifier '%s' not in enum abc",teststring );
    
  3. 如果枚举标识符的长度为 1 到 4 个字符,则值无关紧要,请将名称设为值。typedef enum {ABC1="ABC1",ABC2="ABC2",ABC3="ABC3"} abc;

    • 写这么久?尝试等效:

      typedef enum {ABC[1:3]="ABC1"} abc;
      
    • 需要更多的 4 个字符?分配数据类型。

      typedef enum bit[5*8-1:0] {ABC[10:19]="ABC10", ABC[20:29]="ABC20"} abc;
      
    • 有关枚举类型范围的更多信息:IEEE Std 1800-2012第 6.19.2 节


注意:以上是自 IEEE Std 1800-2005 以来存在的所有功能,必须购买此版本的 LRM 才能阅读。2012 版是免费的 IEEE,因此引用了这个版本。

于 2013-07-17T17:50:08.177 回答