반응형
SystemVerilog는 Verilog에 cast 연산자를 추가했다: ’()
cast 연산자는 3가지 type이 있고, 모두 synthesizable하다.
- Type casing: sum = int’(r * 3.141592);
- Size casting: sum = 16’( a+ 5);
- Sign casting: sum = signed’(a) + signed’(b);
casting의 한가지 좋은 사용예로 lint checker에서 size mismatch warning message를 제거할 수 있다.
다음은 a를 b만큼 right rotate하는 합성 가능한 코드이다.
logic [31:0] a, y;
logic [5:0] b;
always_comb
y = {a,a} >> b; // rotate a by b
이 코드는 LHS인 y가 RHS인 {a,a}보다 적은 비트수를 가지고 있을 때, 그 상위 비트들은 자동으로 truncated off 된다는 Verilog/SystemVerilog 규칙을 따른다. 이것은 우리가 원하는 기능이고, 이 코드에는 문제가 없다.
히지만, size mismatch 라는 warning 메시지가 나온다. 왜냐하면 {a,a} >> b는 64 비트이고, y는 32 비트이기 때문이다.
이때, SystemVerilog size cast를 사용하면, 이 warning message를 제거할 수 있다.
아래와 같이 연산후에, logic [31:0] ‘()을 사용해서 size casting함으로써 경고 메시지를 제거할 수 있다.
logic [31:0] a, y;
logic [5:0] b;
always_comb
y = logic [31:0] '({a,a} >> b); // rotate a by b, cast result to 32 bits
주의할 점은, $cast()라는 system function도 있지만, 이는 not synthesizable하다.
반응형
'SoC 설계 > Verilog, SystemVerilog' 카테고리의 다른 글
Converting logic to real or real to logic (0) | 2024.04.12 |
---|---|
SystemVerilog: Procedural blocks (0) | 2023.03.19 |
SystemVerilog: Parameterized task/functions (0) | 2023.03.18 |
SystemVerilog: Arrays (0) | 2023.03.10 |
SystemVerilog: modport (0) | 2023.03.10 |