-
[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, 범위지정이 들어올 수 있고, 값이 중복될 수 있다.
'개발 > SystemVerilog' 카테고리의 다른 글
[SystemVerilog] 데이터 타입 4 struct (0) 2022.01.15 [SystemVerilog] 데이터 타입 3 enum (0) 2022.01.15 [SystemVerilog] 절차적 할당 2 (0) 2022.01.11 [SystemVerilog] 절차적 할당 1 (0) 2022.01.11 [SystemVerilog] 데이터 타입 2 (0) 2022.01.10