SoC 설계/Verilog, SystemVerilog

SystemVerilog: Casting

yztech 2023. 3. 18. 08:21
반응형

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