2013-07-17 2 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이며 모든 enum 식별자의 값과 일치하지 않습니다.

옵션이 원하는 얻을하는 기능 :

  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 표준 1,800에서 2,005 사이,이 버전부터 기존된다 읽을 때 LRM을 구입해야합니다. 2012 버전은 IEEE에서 무료이므로이 버전을 참조하십시오.

관련 문제