ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Verilog : parameter가 선언된 module은 합성 할 때 template을 명시하자
    Tech/Verilog 2012. 5. 22. 01:38

    Verilog를 배우기 시작하면, 처음 얼마간은 C/C++나 Java 등 프로그래밍 언어처럼 접근해서 사용하며 친숙해지겠지만, 본격적인 반도체 설계에 들어간다면 Synthesis 과정 등을 위해 고려해야할 점이 더 많아진다. 특히, Synopsys 사의 Design compiler에만 적용되는 몇가지 Verilog keyword 들이 있는데 (// 주석을 이용한 pragma 등) module의 선언에 흔히 사용되는 parameter도 특정 pragma가 필요하다. Tool에 의존적인 키워드이기 때문인지 Verilog 강의 등에 포함하여 설명하는 곳이 거의 드문데, 이 때문에 직접 합성을 하다 삽질하는 경우가 빈번하다.

    아무튼, Parameter를 이용하여 선언된 module이 전체 합성되는 Verilog 코드 상에서 여러 가지 종류의 파라미터로 instantiation 될 때에는 아래 주석이 module 내에 포함되어 있어야 한다.

    
    module test #(parameter WIDTH = 4) (output wire [WIDTH-1:0] result, input wire input );
      // synopsys template
      assign result = {WIDTH{input}};
    endmodule
    

    Design compiler가 해당 module을 compile하는 시점에서는 WIDTH값이 얼마가 될 지 예측할 수가 없으므로 Default 값인 4로 가정하고 합성을 진행해버린다. 즉, Design compiler가 보는 parameter는 text macro 정도로 동작하게 되는 셈이다.

    문제는 이후에 다른 모듈에서 이 test 모듈의 WIDTH를 다른 값으로 (예를 들어, 8이나 16으로) 선언할 때 발생하는데, Design compiler가 4로 합성하고 지나갔기 때문에 해당 WIDTH를 가지는 모듈을 못찾았다고 에러가 발생한다. 따라서, 이 때 // synopsys template이 선언되어 있으면 design compiler에서는 해당 module의 parameter를 연결된 소스 코드 전체를 scan한 뒤, 다양한 파라미터에 대응해서 여러가지 parameter 버전을 합성하도록 동작한다.

    댓글

Copyright 2022 JY