2023년 12월 30일 토요일

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [3]/기능 시뮬레이션

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

III. 기능 시뮬레이션(Functional Simulation)
    III-1. SystemC 테스트 벤치
    III-2. 기능 시뮬레이션

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

III. 기능 시뮬레이션(Functional Simulation)

기능 시뮬레이션은 구현 하려는 알고리즘과 HDL 로 기술된 행위의 등가성을 확인 하는 절차다. 알고리즘의 입출력 사양을 높은 추상화 수준의 C/C++로 기술하고 이를 실행시켜 얻는다. 이를 실행형 사양( executable specification)이라 한다. RTL 베릴로그 모델의 시험 기준(golden reference)이 된다.

+----------------+                               +------------------+
|Verilog RTL ----|----------------+           +--| Executable Spec. |
+-----+----------+                |           |  +------------------+
      |              +------------V-----------V--------------+
      |              | Functional Simulation                 |
     (?)<<<<<<<<<<<<<<   VERILATOR: Verilog to C++ Converter |
      |              |              SystemC/C++ Testbench    |
      V              +------------------------+--------------+
  Synthesis

ALU를 DUT(Design Under Test)로 하는 SystemC 테스트벤치를 작성 하고 이를 시뮬레이션을 통해 기능을 검증 한다. 사용할 시뮬레이션 도구는 앞서 설치한 SystemC와 OSS Cas Suite 와 함께 배포된 VERILATOR 다. 시뮬레이션을 위해 설정해 줘야 할 환경변수는 아래와 같다.

SystemC 소스 컴파일과 실행을 위한 환경변수들:

    export SYSTEMC=/usr/local/systemc-2.3.3
    export SYSTEMC_HOME=$SYSTEMC
    export SYSTEMC_INCLUDE=$SYSTEMC_HOME/include
    export SYSTEMC_LIBDIR=$SYSTEMC_HOME/lib-linux64
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SYSTEMC_LIBDIR

VERILATOR의 실행할 환경변수들은 OSS Cad Suite에 포함된 설정을 불러 쓴다.

    source /usr/local/oss-cad-suite/environment

환경 설정을 일괄하여 모아 놓은 cad_env [download] 불러쓰면 편리하다.

    % source ~/cad_env


    III-1. SystemC 테스트 벤치

    ALU를 DUT(Design Under Test)로 하는 SystemC 테스트벤치는 테스트 신호를 생성하는 쓰레드 Gen_Test_Thread()와 DUT로부터 출력을 검사하는 쓰레드 Monitor_Thread()를 포함한다. 베릴로그 RTL의 ALU는 베릴레이터를 사용하여 SystemC로 변환 하였다. SystemC 테스트벤치를 구성하는 파일은 다음과 같다.

    1. def_commands.h: 테스트벤치에서 사용하는 각종 상수들 정의
    2. sc_gen_test.h: 테스트 입력 신호 생성 쓰레드
    3. sc_monitor.h: DUT: 출력 검사 쓰레드
    4. sc_ALU_wrapper_top.h: 테스트 벤치 구성
    5. sc_main.cpp: sc_main()

    RTL의 베릴로그 HDL 에서 SystemC 모델로 변환하는 베릴레이터의 명령은 아래와 같다. 현재 폴더에서 하위폴더 obj_dir에 변환된 C++ 코드가 가 저장된다.

        $ verilator --sc -Wall --top-module ALU_wrapper --exe --build \
            ../source/ALU.v ../source/ALU_wrapper.v sc_main.cpp

    위의 명령줄에서 --build 옵션의 사용으로 테스트벤치와 변환된 DUT의 SystemC 모델은 GNU C++ 컴파일러를 사용하여 실행 파일이 만들어진다. 이때 SystemC의 라이브러리를 링크하는데 환경변수로 그 경로가 미리 지정되어 있어야 한다. 환경변수 LD_LIBRARY_PATH 는 동적 연결 실행 라이브러리 .so (리눅스에서는 shared-object로 윈도우즈의 DLL, Dynamic Linking Library와 같다.)의 경로다. 컴파일 된 모델을 실행 시키면 이 경로상에서 SystemC.so를 찾아 시뮬레이션 엔진을 불러온다.

    +---sc_ALU_wrapper_top.h----------------------------------+
    |                                                         |
    |  +--DUT---------+      +---sc_gen_test.h----------+     |
    |  | ALU_wrapper: |      |                          |     |
    |  |  VERILATED   |      | +---Gen_Test_Thread()<<clk--+  |
    |  |   SystemC   <---------< iSel[1:0]            | |  |  |
    |  |    Model    <---------< iAB[7:0]             | |  |  |
    |  |              |      | |                      | |  |  |
    |  |             <---------< iOutSel              | |  |  |
    |  |              |      | +----------------------+ |  |  |
    |  |              |      +--------------------------+  |  |
    |  |              |                                    |  |
    |  |              |      +---sc_monitor.h-----------+  |  |
    |  |              |      |                          |  |  |
    |  |              |      | +---Monitor_Thread()<<clk---+  |
    |  |             >---------> oACC[7:0]            | |  |  |
    |  |              |      | +----------------------+ |  |  |
    |  |              |      +--------------------------+  |  |
    |  |              <clk-+                               |  |
    |  |              |    |    +--------------+           |  |
    |  +--------------+    +----< sc_clock clk >-----------+  |
    |                           +--------------+              |
    |                                     SystemC Testbench   |
    +---------------------------------------------------------+

    III-2. 기능 시뮬레이션

    기능 시뮬레이션은 구현 하려는 알고리즘과 HDL 로 기술된 행위의 등가성을 확인 하는 절차다. 베릴레이터로 컴파일 한 SystemC 테스트 벤치는 obj_dir에 놓인다. 이를 실행하는 것으로 ALU의 기능을 검증한다.

        $ obj_dir/VALU_wrapper

                SystemC 2.3.3-Accellera --- Dec 15 2023 20:17:01
                Copyright (c) 1996-2018 by all Contributors,
                ALL RIGHTS RESERVED

        Info: (I703) tracing timescale unit set: 1 ps (sc_VALU_wrapper.vcd)
        Reset
        Reg.A=0xAA                  ->  Acc=0x00[0x00] OK
        Reg.B=0x55                  ->  Acc=0x00[0x00] OK
          CMD={NIL NIL NIL NIL NIL} ->  Acc=0x00[0x00] OK
          CMD={NIL NIL NIL NIL NIL} ->  Acc=0x00[0x00] OK
          CMD={NIL NIL NIL NIL NIL} ->  Acc=0x00[0x00] OK
          CMD={NIL NIL NIL NIL NIL} -> Flag={C:0,V:0,Z:1,N:0,HC:0}
          CMD={RDY NIL NIL  CI OR } -> Loading Op............
          CMD={RDY NIL NIL  CI OR } -> Executing Op............
          CMD={RDY NIL NIL  CI OR } ->  Acc=0xFF[0xFF] OK
          CMD={RDY NIL NIL  CI OR } -> Flag={C:0,V:0,Z:0,N:1,HC:0}
          CMD={RDY NIL NIL NIL AND} -> Loading Op............
          CMD={RDY NIL NIL NIL AND} -> Executing Op............
          CMD={RDY NIL NIL NIL AND} ->  Acc=0x00[0x00] OK
          CMD={RDY NIL NIL NIL AND} -> Flag={C:0,V:1,Z:1,N:0,HC:0}
          CMD={RDY NIL NIL  CI XOR} -> Loading Op............
          CMD={RDY NIL NIL  CI XOR} -> Executing Op............
          CMD={RDY NIL NIL  CI XOR} ->  Acc=0xFF[0xFF] OK
          CMD={RDY NIL NIL  CI XOR} -> Flag={C:0,V:0,Z:0,N:1,HC:0}
          CMD={RDY NIL NIL NIL ADD} -> Loading Op............
          CMD={RDY NIL NIL NIL ADD} -> Executing Op............
          CMD={RDY NIL NIL NIL ADD} ->  Acc=0xFF[0xFF] OK
          CMD={RDY NIL NIL NIL ADD} -> Flag={C:0,V:0,Z:0,N:1,HC:0}
          CMD={RDY NIL NIL  CI SUB} -> Loading Op............
          CMD={RDY NIL NIL  CI SUB} -> Executing Op............
          CMD={RDY NIL NIL  CI SUB} ->  Acc=0x55[0x55] OK
          CMD={RDY NIL NIL  CI SUB} -> Flag={C:1,V:1,Z:0,N:0,HC:1}
          CMD={NIL NIL NIL NIL NIL} -> Loading Op............
          CMD={NIL NIL NIL NIL NIL} -> Executing Op............
          CMD={NIL NIL NIL NIL NIL} ->  Acc=0x55[0x55] OK
          CMD={NIL NIL NIL NIL NIL} -> Flag={C:1,V:1,Z:0,N:0,HC:1}

        Info: /OSCI/SystemC: Simulation stopped by user.

    두 레지스터 A 와 B에 각각 0xAA와 0x55를 적재시켜 놓고 OR 연산을 실시하여 그 결과는 0xFF가 나왔다. 이어 논리연산 AND 및 XOR, 그리고 산술 연산으로 덧셈 ADD 과 뺄셈 SUB을 실시한 결과를 볼 수 있다. 연산 결과와 함께 연산기의 상태를 보여주는 플래그 값도 출력시켰다.

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

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



    댓글 없음:

    댓글 쓰기