2023년 12월 30일 토요일

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [4]/합성(Synthesis)

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [4]

IV. 합성(Synthesis)
    IV-1. RTL 합성기의 역활
    IV-2. Yosys 합성기로 예제의 RTL 합성
    IV-3. Yosys 합성 스크립트
    IV-4. Yosys 합성 로그
    IV-5. 합성 후 검증(Post-Simulation)
            a. 테스트벤치 재사용(Testbench Re-Use)
            b. 커버리지 및 프로파일링 (Coverage & Profiling)
            c. 타이밍 시뮬레이션 (Timing Simulation)
            d. 무 지연 시뮬레이션(Zero Delay Simulation)

----------------------------------------------

IV. 합성(Synthesis)

추상적인 알고리즘을 기술할 때 자연언어(natural language), 혹은 계통도(block diagram)나 플로우 차트(flow chart)를 사용한다. 하지만 컴퓨팅 기계에서 읽히기 위해서는 단순하면서 매우 엄격한 형식을 취해야 한다. 알고리즘을 기계에서 작동 시킬 수 있는 최적의 형태로 바꾸려면 엄청난 수고가 든다. 설계자동화 도구(Design Automation Tools)는 이 변환을 수행해 주는 소프트웨어다. 자동화 소프트웨어에게 일을 시키기 위해서 엄격한 문법을 가진 언어를 사용한다. 소프트웨어 개발용 언어로 C/C++, 파이썬 Python 등이 있으며 하드웨어 개발용 언어로는 베릴로그 Verilog와 VHDL 등이 있다.

합성도구는 기능 시뮬레이션을 완료한 베릴로그 RTL을 표준 셀(standard cell)들의 연결도(schematic netlist[link])로 변환 한다. 표준 셀 라이브러리는 공정에서 제공하는 논리 회로들의 부품목록과 사양서다. 논리회로 부품(각종 게이트와 플립플롭)의 논리기능(function)과 부품의 물리적 특성(면적, 입출력 타이밍, 지연)들이 기록되어 있다.

IV-1. RTL 합성기의 역활

합성기는 공정에서 제공 할 수 있는 논리회로 부품의 종류를 모아 놓은 '리버티(Liberty)'라는 형식의 파일을 참조하여 상위 추상화 수준에서 표현된 설계를 하위 수준의 논리회로들의 연결관계로 변환한다. '리버티'는 논리 회로 부품의 기능(function)은 물론 입출력 핀의 방향, 차지하는 면적(부품의 크기), 소모전력 등 물리적 특성들(characterizations)을 기록해 놓은 라이브러리 화일의 형식이다. 리버티 파일 형식은 합성기 도구를 공급하는 시놉시스 사(Synopsys Inc.[link])에서 제안하고 공개하여 널리 쓰이게 된 후 표준이 되었다[link][Liberty Timing Format][Liberty UG & RM]

리버티 형식의 예로 AOI(AND-OR-INV) 논리 셀을 기술 한 예는 아래와 같다. 면적(area), 입출력 핀의 방향, 커페시턴스와 시간 지연(timing), 소모전력(power), 그리고 입력 핀과 출력 핀의 관계를 표현한 기능(function) 등이 기록되어 있다.

    cell (AOI21X1) {
    area : 288;
      cell_leakage_power : 0.0702509;
      pin(A)  {
        direction : input;
        capacitance : 0.0323272;
        rise_capacitance : 0.0320917;
        fall_capacitance : 0.0323272;
      }
      pin(B)  { ...... }
      pin(C)  { ...... }
      pin(Y)  {
        direction : output;
        ......
        function "(!((A B)+C))";
        timing() {
          related_pin : "A";
            ......
          }
          fall_transition(delay_template_5x5) { ...... }
          cell_rise(delay_template_5x5) { ...... }
          rise_transition(delay_template_5x5) { ...... }
            ......
        internal_power() {
          related_pin : "A";
          fall_power(energy_template_5x5) {
            ......
          }
          ......
        }
      }
    }

[주] 리버티 파일에 기록된 각종 물리량들은 반도체 공정의 조건에 맞춰 도출 된다. 예제에서 사용한 경희대학교 개발 ETRI 0.5um CMOS 디자인 킷[링크]은 정확한 공정 물리량을 반영하지 않는다. 반도체 설계 교육용 라이브러리로서 기능만 유효하다.

합성기는 단순한 언어적 번역을 넘어과 묘사된 행위(bahavior)로 부터 논리회로 혹은 조합회로를 판단 해 내고(inference) 최적화(optimization) 한다. 라이브러리에 부품의 다양한 물리적 특성들을 담고 있기에 합성기는 논리회로의 기능적 변환 뿐만 아니라 회로가 구성 되었을 때 동작 속도, 전력 소모량, 칩의 크기를 예측 할 수 있다. 합성기의 첫번째 목표는 논리회로로 변환하는 것이지만 동작 속도의 예측도 이에 못지 않게 중요하다. 동작속도에 따라 반도체 칩의 회로 구성이 달라진다. 합성 시 동작 속도의 조건을 주는 방법(명령)은 사용할 합성도구 마다 다를 수 있다. 합성을 마친 후 이 동작 속도 조건은 이어지는 배치와 배선 도구(동작 속도는 배선 선로의 지연에도 영향을 받는다)에서도 사용 될 수 있기에 도구들 사이의 호환될 필요가 있다. 이에 시놉시스사는 합성 조건을 주는 방식을 제안하였고 이 구문이 널리 쓰이게 되어 표준이 되었다. 이를 SDC(Synopsys Design Constraint) 형식이라 한다[SDC format/AP][SDC AP/Actel][SDC File in VLSI].

IV-2. Yosys 합성기: 예제의 RTL 합성

합성기 도구는 시놉시스 사의 디자인 컴파일러가 독보적이었다. 컴파일러(혹은 합성기)의 제작은 기술 난이도가 매우 높아 소수의 첨단 자동화 그룹(회사)이 전담 했다. 하지만 수많은 연구를 통해 컴파일러 제작 기술이 발전하여 오픈-소스 소프트웨어들도 기존의 상용 제품을 능가 하는 수준에 이르럿다. 소프트웨어 개발용 C/C++ 언어의 오픈-소스 컴파일러인 GCC 는 오히려 산업표준에 이를 정도가 되었다. 하드웨어 언어 컴파일러도 이에 못지 않은 수준에 이르럿고 그 대표적인 합성기가 Yosys다[YosysHQ][Yosys Reference Manual][Yosys Presentation]. Yosys는 반도체 설계 프로젝트에 널리 활용 되고 있다[link][link][link][link].

QFlow 체계에서 Yosys 합성기를 동원하여 예제 ALU 베릴로그 RTL 을 합성하는 명령은 아래와 같다. 먼저, 합성 할 베릴로그 RTL은 source 에 있다.

    % ls source
    total 8
    -rw-r--r-- 1 goodkook goodkook 2514 Dec 16 09:16 ALU.v
    -rw-r--r-- 1 goodkook goodkook 1542 Dec 16 09:05 ALU_wrapper.v

합성기가 만들어내는 수많은 중간 파일들과 결과 파일들을 저장할 폴더 synthesis를 만든다.

    % mkdir synthesis

QFlow 명령줄에서 합성 실행은 다음과 같다.

    % qflow synthesize --tech etri050 ALU_wrapper

위의 명령은 QFlow가 합성(synthesize)의 단계를 수행하면서 대상 공정(--tech)을 etri050으로 지정 하였으며 베릴로그 RTL의 최상위 모듈명은 ALU_wrapper 임을 알려 주고 있다. QFlow의 합성은 source 폴더의 베릴로그를 읽어 합성 스크립트 ALU_wrapper.ys 를 생성하고 Yosys를 실행하여 이를 수행한다. 합성기의 입력은 RTL 베릴로그 이며 출력은 네트리스트다.

[QFlow]Running yosys for verilog parsing and synthesis
    yosys  -s ALU_wrapper.ys
    =========================
    ./source/ALU_wrapper.v
    ./source/ALU.v
      |
+-----V-------------------------+
|Yosys: RTL Synthesis         <---- [ETRI050's Std-Cell Liberty]
|    -> SPICE Netlist for LVS  ---->./synthesis/ALU_wrapper.spc
|    -> Verilog Netlist        ---->./synthesis/ALU_wrapper.rtlbb.v
|         for P&R and Post-Sim  |
+---------------+---------------+
                |
                V
           Auto-Placement
    =========================
[QFlow]Running vlog2Verilog ......
Generating RTL verilog and SPICE netlist file in directory
 ./synthesis
Files:
   Verilog: ./synthesis/ALU_wrapper.rtl.v
   Verilog: ./synthesis/ALU_wrapper.rtlnopwr.v
   Verilog: ./synthesis/ALU_wrapper.rtlbb.v
   Spice:   ./synthesis/ALU_wrapper.spc

출력되는 네트리스트의 형식은 베릴로그와 SPICE다. 베릴로그 네트리스트는 기능 시뮬레이션 검증용 및 배치배선용으로 생성되며 SPICE 네트리스트는 배선 후 레이아웃 검증 LVS 용이다.

QFlow 를 처음 실행하면서 지정한 기본 설정 사항을 담은 파일이 생성된다. 그중 'project_vars.sh' 에는 자동화 도구들의 명령줄 실행 옵션이 기록된다.

IV-3. 합성 스크립트

RTL 합성의 결과로 표준 셀의 네트리스트(netlist)를 출력하게 되는데 형식은 구조적 베릴로그(structural Verilog)다. 회로의 행위 묘사는 없이 표준 셀을 하위 모듈로 두고 입출력 연결만을 기술 한다. 구조적 베릴로그 네트리스트는 다시 DEF(Design Exchange Format[link]) 형식으로 변환 되어 자동 배치와 배선 도구의 입력으로 쓰이게 된다. 아울러 레이아웃 검증 LVS 용 SPICE 네트리스트를 생성하는데 사용된다.

QFlow의 합성 명령을 실행하면 ./source 폴더에 Yosys 합성기용 스크립트를 생성하고 이를 작동 시킨다. QFlow 가 작성한 합성 스크립트는 다음과 같다. 리버티 라이브러리를 읽은 후 합성할 베릴로그를 읽어 문법적 결함과 합성 가능성을 확인한다. 이어 합성을 수행하게 되는데 조합회로(combinational logic)와 순차회로(sequential logic)으로 분리하고 디지털 논리식을 만들어 최적화를 반복한다. 최적화된 논리식은 공정에서 제공한 셀들로 치환(technology mapping)된다. 끝으로 베릴로그 네트리스트를 저장 한다.

    # Synthesis script for yosys created by qflow
    read_liberty -lib -ignore_miss_dir -setattr blackbox \
              <...>/etri050/tech/etri05_stdcells.lib
    read_verilog <...>/source/ALU_wrapper.v
    read_verilog 
<...>/source/ALU.v

    # High-level synthesis
    synth -top ALU_wrapper

    # Map register flops
    dfflibmap -liberty \
                 <...>/etri050/etri05_stdcells.lib
    opt

    # Map combinatorial cells, standard script
    abc -exe /usr/local/share/qflow/bin/yosys-abc \
        -liberty <...>/etri050/etri05_stdcells.lib \
        -script \
            +strash;scorr;ifraig;retime,{D};\
                strash;dch,-f;map,-M,1,{D}

    flatten
    setundef -zero
    clean -purge

    # Output buffering
    iopadmap -outpad BUFX2 A:Y -bits

    # Cleanup
    opt
    clean
    rename -enumerate

    write_verilog  ALU_wrapper_mapped.v
    stat

[주] Yosys의 합성 스크립트가 매우 단순하다. 위 스크립트에서 회로의 동작속도를 높이기 위해 클럭 신호를 지정하고 주기를 선언하는 명령은 보이지 않는다. 논란이 될 수 있긴 하나 상용 합성기들이 주장하는 시간-구동 합성(time-driven synthesis)이 극적인 효과를 보여 준다고 보지 않는다. 합성 단계에서 create_clock 같은 합성 조건(symthesis constraint)으로 효과를 기대하기 보다 합성된 회로를 타이밍 분석한 후 RTL 단계에서 수정 하는 편이 현명할 것이다. 레지스터 사이의 경로가 노출되어 있는 RTL에서 합성기가 조합회로의 자원 분배(resource sharing) 기법을 동원하는 것은 고도의 지능을 요하기에 제한적이다. 클럭 지정 명령으로 긴 조합회로의 경로를 쥐어짜기 보다 시간 분석의 용도로 사용하는 편이 옳을 것이다. RTL 보다 높은 수준의 고위 합성(HLS, High-Level Synthesis) 방법론에서는 클럭 레이턴시(clock latency)를 조건으로 사용한다. 하지만 RTL의 경우 합성기가 레이턴시를 조정하면 않된다. RTL과 합성된 회로 사이에 클럭 순서마다 동작이 달라져서는 않되기 때문이다. 배치와 배선 단계에서 발생 하는 선로지연의 불균형이 큰 문제가 되므로 시간-구동 배치(timing-driven placement[link])에 더 많은 노력을 기울이는 편이 좋다. Yosys 합성기에는 create_clock 같은 시간 조건 명령은 없다. Yosys 합성기는 기능의 측면에서 논리식 추론과 최적화에 집중한다.

IV-4. 합성 로그

컴파일러가 배출해 놓는 로그 파일은 매우 방대해서 그 내용을 모두 파악 하기는 어렵다. 사실 그럴 필요도 없다. 로그 파일을 취급하는 요령이 개발자의 수준이라고 할 수 있다. 가장 먼저 따져봐야 할 사항은 문론 합성 실패이다. 이미 기능 시뮬레이션을 실시 하였으므로 합성하려는 베릴로그 원시 파일에 문법적 오류는 없다. 하지만 베릴로그 언어의 구문 중 합성 가능한 구문은 일부분에 지나지 않는다. 낮은 추상화 수준으로 전이 하면서 행위 수준과 동작이 다를 수 있다. 예를 들어 "의도치 않은 래치(Accidental Latch)"는 흔히 범하는 범하는 실수다. 합성기는 합성이 불가한 구문 뿐만 아니라 논리회로로 전환되었을 때 상이한 동작이 우려되면 경고를 낸다. 그 다음으로 살펴야할 합성 실패는 기술 매핑(technology mapping)이다. 행위수준 베릴로그 구문에서 변환된 논리식은 대상 공정에서 제공할 수 있는 셀로 대체된다. 이때 논리식을 구성한 요소가 공정에서 제공 가능한 셀에 없을 경우가 있다.

의도치 않은 래치로 인해 기술 매핑에 실패하는 예는 아래와 같다.

    always @*
    begin
        if (iOutSel)
            oACC = ACC;
    end

선택 구문의 제어신호 iOutSel가 '0'인 경우 oACC의 할당 값이 없다. 전자회로에 할당 값이 없다는 뜻은 이전 값의 '유지'를 의미하며 이는 메모리 소자다. 선택 구문의 제어신호 iOutSel은 클럭으로 지정 되지도 않았으로 엣지 트리거 플립플롭도 아니다. 결국 oACC는 레벨 감응 래치(level sensitive latch)다. 위의 래치가 생성된 구문은 오류가 없을 뿐만 아니라 합성도 가능하다. 다만 설계자의 의도 이거나 불완전한 멀티플렉서(MUX, multiplexer)를 표현 하려다 실수한 경우로 볼 수 있다. 이에 대해 합성기는 플립 플롭이 아닌 래치가 있었음을 알려준다.

    4.2.8. Executing PROC_DLATCH pass (convert process syncs to latches).
    Latch inferred for signal `\ALU_wrapper.\oACC' from process
        `\ALU_wrapper.$proc$ALU_wrapper.v:50$2': <......>

클럭 신호의 상승 엣지 트리거 플립 플롭이었다면,

    always @(posedge clk or posedge reset) begin
        if (reset)
            rCmd <= 0;
        else
            rCmd <= iAB;
        end
    end

다음과 같이 알려준다.

    4.2.9. Executing PROC_DFF pass (convert process syncs to FFs).

    Creating register for signal `\ALU_wrapper.\rCmd' using process
        `\ALU_wrapper.$proc$ALU_wrapper.v:26$1'.
      created $adff cell `$procdff$89' with positive edge clock and
            positive level reset.

합성기는 설계자의 의도를 살피지 않고 구문으로부터 충실히 래치를 만들어 낸다. 합성기의 내부 논리식 표현은 최적화를 실시한 후 공정에서 제공하는 라이브러리의 셀로 대체 시키는데 이를 '공정기술 매핑'이라 한다. 만일 공정의 라이브러리에 등가 기능을 가진 셀이 없을 경우 빈 공란으로 남겨둔다. 이런 기술 매핑이 실패 하더라도 Yosys 합성기는 까다롭게 굴지 않고 존재하지 않는 셀에 $ 표시를 해 놓는다. 이렇게 생성된 네트리스트는 다음 단계인 자동 배치 과정에서 없는 셀 이라며 오류를 낼 것이다.

    13. Printing statistics.
    === ALU_wrapper ===
       Number of wires:                265
       Number of wire bits:            311
       Number of public wires:         265
       Number of public wire bits:     311
       Number of memories:               0
       Number of memory bits:            0
       Number of processes:              0
       Number of cells:                297
         $_DLATCH_P_                     8
         AND2X2                          5
         AOI21X1                        12
         AOI22X1                        12
         BUFX2                           8
         DFFPOSX1                        8
         DFFSR                          24
            <......>

합성 로그를 살펴보면 Yosys 합성기가 어떻게 작동 하는지 알 수있다. 합성 로그 파일은 ./log/synth.log 다. 작동 중 발생한 오류에 대한 대응은 물론 통합도구인 QFlow의 표준 옵션보다 세밀한 옵션을 주어야 하는 경우도 있다. 자동화 도구의 로그를 읽어보면서 이 도구가 어떻게 작동 하는지 살펴보기로 한다.

합성기의 입력은 당연히 RTL 베릴로그다. 공정에서 제공할 수 있는 셀의 종류를 모아놓은 리버티 형식의 라이브러리를 먼저 읽어들인다.

    -- Executing script file `ALU_wrapper.ys' --
    1. Executing Liberty frontend:
        /usr/local/share/qflow/tech/etri050/etri05_stdcells.lib
        Imported 39 cell types from liberty file.

RTL 베릴로그를 읽어 구문 분석과 합성기 내부 형식구문으로 변환 한다. 최상위 모듈부터 하위 모듈까지 찾아 읽어 들인 후 합성기 내부 형식(AST, RTLIL)으로 재구성한다.

    2. Executing Verilog-2005 frontend: /ALU8/source/ALU_wrapper.v
        Parsing Verilog input from `/ALU8/source/ALU_wrapper.v' to AST representation.
        Generating RTLIL representation for module `\ALU_wrapper'.
        Successfully finished Verilog frontend.
    3. Executing Verilog-2005 frontend: ALU.v
        Parsing Verilog input from `ALU.v' to AST representation.
        Generating RTLIL representation for module `\ALU'.
        Successfully finished Verilog frontend.

합성을 수행한다.

    4. Executing SYNTH pass.
    4.1. Executing HIERARCHY pass (managing design hierarchy).
    4.1.1. Analyzing design hierarchy..
        Top module:  \ALU_wrapper
        Used module:     \ALU

계층 구조를 구성하는데 필요한 하위 모듈이 모두 확보되면 프로세스(processes)를 처리한다. 베릴로그의 경우 always 에 해당하는 순차구문 영역(procedural block)내 행위를 분석하여 조합 논리식과 플립플롭 회로를 추론해 낸다. 이때 불완결한 병렬선택문(case statement)에서 불요조건(don't-care)의 판별등을 포함한다.

    4.2. Executing PROC pass (convert processes to netlists).
    4.2.1. Executing PROC_CLEAN pass (remove empty switches from decision trees).
    Cleaned up 0 empty switches.
    4.2.2. Executing PROC_RMDEAD pass (remove dead branches from decision trees).
    Removed 1 dead cases from process $proc$ALU.v:70$11 in module ALU.
    Marked 1 switch rules as full_case in process $proc$ALU.v:70$11 in module ALU.
    $proc$/ALU8/source/ALU_wrapper.v:50$2 in module ALU_wrapper.
    Marked 2 switch rules as full_case in process
    $proc$ALU8/source/ALU_wrapper.v:26$1 in module ALU_wrapper.
    Removed a total of 2 dead cases.

순차구문 블럭 내의 연속된 할당문의 병합, 초기화 문, 비동기 및 동기 리셋을 찾아내고,

    4.2.3. Executing PROC_PRUNE pass (remove redundant assignments in processes).
        Removed 0 redundant assignments.
        Promoted 5 assignments to connections.
    4.2.4. Executing PROC_INIT pass (extract init attributes).
    4.2.5. Executing PROC_ARST pass (detect async resets in processes).
        Found async reset \reset in
            `\ALU_wrapper.$proc$/ALU8/source/ALU_wrapper.v:26$1'.

병렬 선택문(case~switch statement)에서 ROM 형식으로 바꿀 수 있는지 찾고 조건문(if-statement)를 검사한다.

    4.2.6. Executing PROC_ROM pass (convert switches to ROMs).
        Converted 0 switches.
        <suppressed ~6 debug messages>
    4.2.7. Executing PROC_MUX pass (convert decision trees to multiplexers).
        <......>
        Creating decoders for process
         `\ALU_wrapper.$proc$/ALU8/source/ALU_wrapper.v:26$1'.
             1/3: $0\rCmd[7:0]
             2/3: $0\rB[7:0]
             3/3: $0\rA[7:0]
        <......>

구문의 행위 모사로부터 메모리 소자(래치와 플립 플롭)들을 추론(inference)해 낸다.

    4.2.8. Executing PROC_DLATCH pass (convert process syncs to latches).
        No latch inferred for signal `\ALU_wrapper.\oACC' from process
            `\ALU_wrapper.$proc$/ALU8/source/ALU_wrapper.v:50$2'.
    4.2.9. Executing PROC_DFF pass (convert process syncs to FFs).
        <......>
        Creating register for signal `\ALU.\CO' using process
            `\ALU.$proc$ALU.v:96$23'.
          created $dff cell `$procdff$70' with positive edge clock.
        <......>

RTL 베릴로그에서 디지털 논리식 추론이 완료된 후 논리식의 유효성을 검사하고,

    4.5. Executing CHECK pass (checking for obvious problems).

조합회로와 순차회로로 나눠 최적화를 실시한다.

    4.6. Executing OPT pass (performing simple optimizations).

    4.6.1. Executing OPT_EXPR pass (perform const folding).
        <......>
    4.6.2. Executing OPT_MERGE pass (detect identical cells).
        <......>
    4.6.3. Executing OPT_MUXTREE pass (detect dead branches in mux trees).
        <......>
    4.6.4. Executing OPT_REDUCE pass (consolidate $*mux and $reduce_* inputs).
        <......>
    4.6.5. Executing OPT_MERGE pass (detect identical cells).
        <......>
    4.6.6. Executing OPT_DFF pass (perform DFF optimizations).
        <......>

논리식 최적화에 이어 유한 상태 머신(FSM, Finite State Machine)을 검출하고 최적화 한다. 이번 예제 ALU8에는 FSM 모델이 없지만 마이크로 프로세서의 실행 유닛같은 복잡한 제어회로에 반드시 포함되는 중요한 요소다. RTL 합성기의 핵심 기능 중 하나인 FSM 검출 및 최적화 기능을 갖추고 있다는 점은 Yosys 합성기의 성숙도를 보여준다고 하겠다.

    4.7. Executing FSM pass (extract and optimize FSM).
    4.7.1. Executing FSM_DETECT pass (finding FSMs in design).
    4.7.2. Executing FSM_EXTRACT pass (extracting FSM from design).
    4.7.3. Executing FSM_OPT pass (simple optimizations of FSMs).
    4.7.4. Executing OPT_CLEAN pass (remove unused cells and wires).
    4.7.5. Executing FSM_OPT pass (simple optimizations of FSMs).
    4.7.6. Executing FSM_RECODE pass (re-assigning FSM state encoding).
    4.7.7. Executing FSM_INFO pass (dumping all available information on FSM cells).
    4.7.8. Executing FSM_MAP pass (mapping FSMs to basic logic).

Yosys가 회로 밀집도가 높은 산술논리연산 부분(데이터 패스, Data-Path)을 따로 처리할 수 있다 는 점도 눈에 띈다. 만일 공정에서 산술 연산용 매크로셀을 제공한다면 이에 대응할 수 있다. 예제 ALU는 산술 연산으로 덧셈기를 사용한다. 디자인 킷에 전가산기(Full-Adder) 셀을 가지고 있다.

    4.12. Executing ALUMACC pass (create $alu and $macc cells).
        Extracting $alu and $macc cells in module ALU:
          creating $macc model for $add$ALU.v:91$19 ($add).
          merging $macc model for $add$ALU.v:92$21 into 
                    $add$ALU.v:92$22.
        <......>
        $auto$alumacc.cc:485:replace_alu$113
            created 4 $alu and 0 $macc cells.
        Extracting $alu and $macc cells in module ALU_wrapper:
          created 0 $alu and 0 $macc cells.
        <......>

자원 공유(resource-sharing) 기능도 수행한다. Yosys의 실제 성능을 평가하기는 이르지만 합성기로서 수행해야 할 일을 모두 수행하고 있다.

    4.13. Executing SHARE pass (SAT-based resource sharing).

자원 공유(resource sharing) 처리 후 한번 더 최적화를 수행 하고

    4.14. Executing OPT pass (performing simple optimizations).

고집적 메모리를 추출 한다. FPGA 처럼 내부 블럭 메모리를 제공하는 경우 매우 유용하다.

    4.15. Executing MEMORY pass.

메모리 블럭을 제공하지 않는 경우 논리회로로 메모리 영역을 묶는다. 이는 배치배선에 효과적일 수 있다.

    4.18. Executing MEMORY_MAP pass (converting memories to logic and flip-flops).

RTL 로부터 논리회로 변환과 최적화를 마치면 대상 공정에서 제공한 표준 셀로 대체하는 기술 매핑(tech-mapping)을 수행한다.

    4.20. Executing TECHMAP pass (map to technology primitives).

공정에서 제공하는 셀에 맞추기 위한 논리식 합성은 버클리 검증 및 합성 연구 센터(Berkeley Verification and Synthesis Research Center)의 ABC 합성기를 사용한다[link].

    4.25. Printing statistics.
        <......>
    === design hierarchy ===
       ALU_wrapper                       1
         ALU                             1
       Number of wires:                251
       Number of wire bits:            365
       Number of public wires:          44
       Number of public wire bits:     151
       Number of memories:               0
       Number of memory bits:            0
       Number of processes:              0
       Number of cells:                270
         $_ANDNOT_                      81
         $_AND_                          7
         $_DFFE_PP0N_                   16
         $_DFFE_PP0P_                    8
         $_DFFE_PP_                     12
         $_MUX_                         29
         $_NAND_                        10
         $_NOR_                         20
         $_NOT_                         21
         $_ORNOT_                        5
         $_OR_                          33
         $_XNOR_                        16
         $_XOR_                         12

합성기 내부에 다양한 종류의 플립-플롭이 있지만 공정의 라이브러리에는 이를 모두 제공하지 않기 때문에 논리식을 추가하여 대응 시켜준다.

    5. Executing DFFLIBMAP pass (mapping DFF cells to sequential cells from liberty file).
      cell DFFNEGX1 (noninv, pins=3, area=864.00) is a direct match for cell type $_DFF_N_.
      cell DFFPOSX1 (noninv, pins=3, area=864.00) is a direct match for cell type $_DFF_P_.
      cell DFFSR (noninv, pins=5, area=1584.00) is a direct match for cell type $_DFFSR_PNN_.
      final dff cell mappings:
        \DFFNEGX1 _DFF_N_ (.CLK( C), .D( D), .Q( Q));
        \DFFPOSX1 _DFF_P_ (.CLK( C), .D( D), .Q( Q));
        unmapped dff cell: $_DFF_NN0_
        unmapped dff cell: $_DFF_NN1_
        unmapped dff cell: $_DFF_NP0_
        unmapped dff cell: $_DFF_NP1_
        unmapped dff cell: $_DFF_PN0_
        unmapped dff cell: $_DFF_PN1_
        unmapped dff cell: $_DFF_PP0_
        unmapped dff cell: $_DFF_PP1_
        unmapped dff cell: $_DFFSR_NNN_
        unmapped dff cell: $_DFFSR_NNP_
        unmapped dff cell: $_DFFSR_NPN_
        unmapped dff cell: $_DFFSR_NPP_
        \DFFSR _DFFSR_PNN_ (.CLK( C), .D( D), .Q( Q), .R( R), .S( S));
        unmapped dff cell: $_DFFSR_PNP_
        unmapped dff cell: $_DFFSR_PPN_
        unmapped dff cell: $_DFFSR_PPP_

대체한 플립-플롭의 등가성을 확인해본다.

    5.1. Executing DFFLEGALIZE pass (convert FFs to types supported by the target).
    Mapping DFF cells in module `\ALU':
      mapped 12 $_DFF_P_ cells to \DFFPOSX1 cells.
    Mapping DFF cells in module `\ALU_wrapper':
      mapped 24 $_DFFSR_PNN_ cells to \DFFSR cells.

조합회로에 대하여 다시 ABC를 실행 하여 공정에서 제공하는 셀들로 매핑하고 최적화된 결과를 얻는다.

    7. Executing ABC pass (technology mapping using ABC).
        <......>
    7.1. Extracting gate netlist of module `\ALU' to `<abc-temp-dir>/input.blif'..
    Extracted 225 gates and 261 wires to a netlist network with 36 inputs and 14 outputs.
    7.1.2. Re-integrating ABC results.
    ABC RESULTS:           OAI22X1 cells:        1
    ABC RESULTS:            MUX2X1 cells:        1
    ABC RESULTS:           XNOR2X1 cells:        3
    ABC RESULTS:            XOR2X1 cells:        3
    ABC RESULTS:            AND2X2 cells:        5
    ABC RESULTS:           NAND3X1 cells:        9
    ABC RESULTS:             INVX1 cells:       25
    ABC RESULTS:             OR2X2 cells:        5
    ABC RESULTS:           AOI22X1 cells:       13
    ABC RESULTS:           AOI21X1 cells:       15
    ABC RESULTS:           NAND2X1 cells:       45
    ABC RESULTS:            NOR2X1 cells:       11
    ABC RESULTS:           OAI21X1 cells:       65
    ABC RESULTS:        internal signals:      211
    ABC RESULTS:           input signals:       36
    ABC RESULTS:          output signals:       14

    7.2. Extracting gate netlist of module `\ALU_wrapper' to `<abc-temp-dir>/input.blif'..
    Extracted 46 gates and 95 wires to a netlist network with 49 inputs and 33 outputs.
        <......>
    7.2.2. Re-integrating ABC results.
    ABC RESULTS:            AND2X2 cells:        3
    ABC RESULTS:            NOR2X1 cells:        1
    ABC RESULTS:             INVX1 cells:       24
    ABC RESULTS:           NAND3X1 cells:       16
    ABC RESULTS:           OAI21X1 cells:       29
    ABC RESULTS:           NAND2X1 cells:       22
    ABC RESULTS:        internal signals:       13
    ABC RESULTS:           input signals:       49
    ABC RESULTS:          output signals:       33

계층적 구조를 평활화 하고,

    8. Executing FLATTEN pass (flatten design).
    Deleting now unused module ALU.

초기화 되지 않은 값은 0으로 잡는다. HDL은 다중치 논리를 적용한다. 베릴로그는 4치 (0, 1, X, Z)체계다. 실제 회로는 0과 1값 만을 가질뿐이다. 실제 전자회로에 X (error, don't-care)나 Z(float)는 있을 수 없다. 적어도 풀-업(pull-up) 또는 풀-다운(pull-down) 되어야 한다. CMOS 는 0(GND) 또는 1(VDD) 에 붙어야 한다.

    9. Executing SETUNDEF pass (replace undef values with defined constants).
    Removed 0 unused cells and 362 unused wires.

합성 결과를 베릴로그 네트리스트로 저장한다.

    12. Executing Verilog backend.
    12.1. Executing BMUXMAP pass.
    12.2. Executing DEMUXMAP pass.
    Dumping module `\ALU_wrapper'.

최종적으로 설계에 동원된 회로의 목록을 나열하면 다음과 같다. 모두 공정에서 제공하는 셀들로 구성되어 있다.

    13. Printing statistics.
    === ALU_wrapper ===
       Number of wires:                308
       Number of wire bits:            354
       Number of public wires:         308
       Number of public wire bits:     354
       Number of memories:               0
       Number of memory bits:            0
       Number of processes:              0
       Number of cells:                340
         AND2X2                          8
         AOI21X1                        15
         AOI22X1                        13
         BUFX2                           8
         DFFPOSX1                       12
         DFFSR                          24
         INVX1                          49
         MUX2X1                          1
         NAND2X1                        67
         NAND3X1                        25
         NOR2X1                         12
         OAI21X1                        94
         OAI22X1                         1
         OR2X2                           5
         XNOR2X1                         3
         XOR2X1                          3

Yosys에 의한 합성은 여기까지다. QFlow는 추가 작업으로 전원 vdd와 gnd를 전역 신호로 바꾸고 합성기에서 저장했던 네트리스트 ALU_wrapper_mapped.v 에서 구동이 모자란 네트를 찾아 버퍼를 삽입하고 새로운 네트리스트 ALU_wrapper_sized.v를 만든다.

    vlogFanout -l 300 -c 75 -I ALU_wrapper_nofanout -s nullstring \
        -p <...>/etri050/etri05_stdcells.lib \
        -b BUFX2,CLKBUF1 -i A,A \
        -o Y,Y ALU_wrapper_mapped.v ALU_wrapper_sized.v

클럭 트리 합성 CTS(Clock Tree Synthesis)까지는 아니더라도 클럭 네트에 대한 고려와 과도하게 부하가 걸린 네트를 찾아 버퍼를 추가했다.

    Top internal fanout is 24 (load 1052.43) from node _26_,
    driven by INVX1 with strength 166.776 (fF driven at latency 300)
    Top fanout load-to-strength ratio is 6.31047 (latency = 1893.14 ps)
    Top input node fanout is 36 (load 986.695) from node clk.
    0 gates exceed specified minimum load.
    26 buffers were added.

다음 단계에서 사용될 자동 배치용 ALU_wrapper.rtlbb.v 및 기능검증 시뮬레이션 네트리스트 베릴로그와 배선후 LVS 검증용 SPICE 네트리스트 ALU_wrapper.spc를 생성한다.

    Running vlog2Verilog for antenna cell mapping.
    vlog2Verilog -c -p -v vdd -g gnd  -l <...>/etri050_stdcells.lef \
       -o ALU_wrapper.v ALU_wrapper_sized.v
    Generating RTL verilog and SPICE netlist file in directory
        .../ALU8/synthesis
    Files:
       Verilog: .../ALU8/synthesis/ALU_wrapper.rtl.v
       Verilog: .../ALU8/synthesis/ALU_wrapper.rtlnopwr.v
       Verilog: .../ALU8/synthesis/ALU_wrapper.rtlbb.v
       Spice:   .../ALU8/synthesis/ALU_wrapper.spc

합성 로그를 간략히 살펴 봤다. 합성기 Yosys가 비록 오픈-소스이긴 하나 메모리 검출, 데이터 패스, 유한 상태 머신 최적화 등 상용 도구에 못지 않는 기능을 갖추고 있다는 것을 알 수 있다. 교육용으로 손색이 없으며 본격 합성기에 적용하기 전에 분할된 설계단위에서 사전 검토용으로 충분히 활용할 수 있다.

IV-5. 네트리스트 시뮬레이션: 합성 후 검증

반도체 설계 자동화 도구는 결국 소프트웨어다. 합성기에도 잠재적 버그(오류 또는 실수)가 있을 수 있다. 따라서 합성의 결과로 출력된 네트리스트는 검증 되어야 한다. 더구나 행위 묘사에서 논리식으로 추상화 수준이 전이되었으므로 반드시 검증을 통해 기능적 등가성이 확인되어야 한다.

테스트벤치 재사용(Testbench Re-Use)

네트리스트 형식의 구조적 베릴로그를 DUT로 삼아 기능 검증에 사용했던 테스트 벤치를 그대로 사용하여 시뮬레이션을 실시한다. DUT로부터 동일한 출력을 얻게 되면  서로 다른 추상화 수준의 두 모델은 등가인 것으로 본다.

커버리지 및 프로파일링 (Coverage & Profiling)

기능 검증 단계에서 적용되었던 입력을 그대로 사용한다는 점을 기억하자. 시뮬레이터의 테스트 커버리지(test coverage)는 불완전한 입력으로 인한 시험 미결성을 측정해 준다. 베릴레이터는 테스트 커버리지 옵션을 사용할 수 있다[link]. 이에 덧붙여 C++의 코드 및 실행 프로파일러(profiler)를 사용하여 테스트 벤치의 완결성 뿐만 아니라 코드 효율, 회로의 사용 집중도 등을 간접적으로 측정 할 수 있다.

타이밍 시뮬레이션 (Timing Simulation)

합성기에서 출력된 구조적 베릴로그는 표준 셀의 외형만 있다. 시뮬레이션을 위해 내부 기능은 디자인 킷에 포함되어 제공된다. 디자인 킷에 제공되는 표준 셀의 베릴로그 모델은 기능에 더하여 셀 마다 지연특성을 포함한다. 이를 이용해 배선전 동작 속도를 분석해 볼 수 있다. 이를 합성 후 타이밍 시뮬레이션(Post-timing simulation)이라고 한다.

[주] 본 예제에서는 타이밍 시뮬레이션을 실시하지 않는다. 베릴레이터의 베릴로그 변환 기능 중 셀 프리미티브 지원이 미흡하기 때문이다. DK에 포함된 표준 셀들의 물리적 특성 중 시간 지연량이 유효하지 않지만 학습의 목적으로 상용 HDL 시뮬레이터 QuestaSim을 써서 타이밍 시뮬레이션을 실습해 볼 수 있다. 아래 링크의 관련 예제를 참조한다.

    "Project_6502 예제의 합성 후 Co-Simulation 실시 방법[링크]"

무 지연 시뮬레이션(Zero Delay Simulation)

기능 검증에서 사용했던 테스트벤치를 컴파일 할 때 행위를 묘사한 베릴로그 대신 합성으로 얻은 네트리스트 베릴로그 ../synthesis/ALU_wrapper.v 로 대체한다. 네트리스트에 존재하는 표준 셀은 외형만 있다. 따라서 표준 셀의 행위를 묘사한 베릴로그 khu_etri05_stdcells_func.v 를 포함 시킨다.

    $ verilator --sc -Wall --top-module ALU_wrapper --exe --build \
        ../../../digital_ETRI/khu_etri05_stdcells_func.v  \
        ../synthesis/ALU_wrapper.v sc_main.cpp


+----------------+                               +------------------+
|Verilog RTL ----|----------------+           +--| Executable Spec. |
+-----+----------+                |           |  +------------------+
      |              +------------V-----------V--------------+
      |              | Functional Simulation                 |
     (?)<<<<<<<<<<<<<<   VERILATOR: Verilog to C++ Converter |
      |              |              SystemC/C++ Testbench    |
      |              +------------------------+--------------+
+-----V-------------------------+             |
|Yosys: RTL Synthesis           |             |
|    -> SPICE Netlist for LVS   |             |
|    -> Verilog Netlist         |             |
|         for P&R and Post-Sim -|----+    [Testbench Re-Use]
+---------------+---------------+    |        |  sc_main.cpp
                |                    |        |
      +---------+     +--------------V--------V---------------------+
      |               |Post-Simulation <- SystemC Testbench         |
     (?)<<<<<<<<<<<<<<<  Syn. Netlist   :./synthesis/ALU_wrapper.v  |
      |               |  Std-Cell's Func:khu_etri05_stdcells_func.v |
      |               +---------------------------------------------+
      V
  Placement

컴파일로 얻은 실행 파일을 실행시켜 행위 모형과 구조적 모형의 시뮬레이션 결과가 동일하다는 것을 확인한다.

----------------------------------------------

[목차][이전][다음]


댓글 없음:

댓글 쓰기