ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SystemVerilog] 연산자
    개발/SystemVerilog 2022. 1. 13. 23:43

     

    https://medium.com/verilog-novice-to-wizard

     

    위에 표는 베릴로그 연산자

    시스템베릴로그는 여기에 더해 C 언어에서 지원되는 assignment 연산을 추가했다.

     

    operator usage equivalent
    += a+=b a = a+b
    -= a-=b a = a-b
    *= a*=b a = a*b
    /= a/=b a = a/b
    %= a%=b a = a%b
    &= a&=b a = a&b
    |= a|=b a = a|b
    ^= a^=b a = a^b
    <<= a<<=b a = a<<b
    >>= a>>=b a = a>>b
    <<<= a<<<=b a = a<<<b
    >>>= a>>>=b a = a>>>b

     

    assignment 연산을 chain으로 구성하는 것도 가능하다.

    // chainning assignment operation
    a += (b += (c += d));
    
    
    // equivalent
    c = c + d;
    b = b + c;
    a = a + b;
    
    
    
    // 삼항연산에서 사용
    a = (sel)? (b+=c) : (b-=c);
    
    // equivalent
    if (sel)
    	a = (b+=c);
    else
    	a = (b-=c);

    제일 안쪽 괄호안에 있는 연산부터 처리된다.

     

     

     

     

    C언어와 똑같이 pre / post increment 연산도 지원된다.

    a++
    --a
    ++a
    a--
    
    for (int i = 0; i < 100; i++) begin
    	$display("%d \n", i);
    end

    이제 루프문 안에서 i = i + 1 을 할 필요가 없다.

     

     

     

    벡터, 배열을 선언하고 패턴을 할당할 수 있다.

    int array[3:0];
    arrary = '{0, 1, 2, 3};

    위와 같이 값을 할당하면, array[3] = 0, array[2] = 1, array[1] = 2, array[0] = 3 값이 할당된다.

    시스템베릴로그에서 벡터, 배열에 값을 할당하려면 '{} 형태로 사용해야한다.

     

     

    파이썬의 딕셔너리 타입처럼 index : value 쌍으로 값을 할당할 수 있다.

    array = '{3:2, 2:1, default:0};
    
    // 할당된 값은 다음과 같다.
    array[3] = 2
    array[2] = 1
    array[1] = 0
    array[0] = 0
    
    
    // 2차원 배열의 초기값 설정
    // 배열의 모든 값은 0 된다.
    logic [15:0] array [0 : 255] = '{default : 0};

    인덱스 : 값 쌍을 지정해주고 지정되지 않은 나머지는 default : 값 쌍으로 할당 된다.

     

     

     

    inside (membership operator) 라는것도 있는데

    파이썬에서 in 키워드와 똑같다.

    배열 안에 있는 원소가 존재한다면 참이 된다.

    if (a inside {2'00, 2'01})
    	...
        
    // equivalent
    if (a == 2'b00 || a == 2'b01)
    	...
        
    
    
    reg [1:0] b;
    reg 	  c;
    if (a inside {b, c, [0 : 2]});
    	...
    
    // equivalent
    if (a == b[0] || a == b[1] || a == c || a == 0 || a == 1 || a == 2)
    	...
        
        
    
    if (a inside {2'b1?})
    
    // equivalent
    if (a inside {2'b10, 2'b11, 2'b1x, 2'b1z})

    배열 안에는 변수, wildcard, 범위지정이 들어올 수 있고, 값이 중복될 수 있다.

     

     

     

Designed by Tistory.