2013-07-17 298 views
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 

回答

2

鑄造是由價值,而不是名稱。假設您使用默認的枚舉數據類型(int)並且不將值分配給任何標識符,那麼ABC1,ABC2ABC3的值分別爲0,12(所有類型爲int)。

施放此效果的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標準1800至2005年,這個版本的現有必須購買LRM才能閱讀。 2012版本免費提供IEEE,因此引用了該版本。