RTL log #4 : Oasys RTL synthesis 워크플로우 정리

YOUNGWOONG HAN·2026년 6월 11일

RTL log

목록 보기
4/4
post-thumbnail

이번 글에서는 Verilog RTL을 Oasys로 합성하는 과정을 정리해보겠습니다.

Oasys는 Verilog RTL을 standard-cell 기반의 gate-level netlist로 바꾸는 합성 도구입니다.
즉, 우리가 작성한 RTL 코드를 특정 공정 라이브러리에 존재하는 NAND, NOR, DFF 같은 standard cell 조합으로 변환합니다.

이번 작업의 전체 흐름은 다음과 같습니다.

1. 합성을 위한 Verilog 파일과 top module을 선택한다.
2. *.f 파일로 Verilog 파일을 관리한다.
3. 합성을 위한 step*_mode*_config.tcl 파일을 작성한다.
4. Oasys 실행 후 config를 open한다.
5. synthesis를 실행한다.
6. synthesized Verilog netlist를 export한다.
7. timing, area, power report를 export한다.

1. .f 파일 작성

먼저 합성에 필요한 Verilog 파일 목록을 .f 파일로 작성합니다.

rtl_v2/gemm_accelerator/gemm_mmio_reg.v
rtl_v2/gemm_accelerator/gemm_controller_fsm.v
rtl_v2/gemm_accelerator/gemm_local_buffer.v
rtl_v2/gemm_accelerator/gemm_lsu.v
rtl_v2/gemm_accelerator/gemm_mac_datapath.v
rtl_v2/gemm_accelerator/gemm_mac_datapath4.v
rtl_v2/gemm_accelerator/gemm_mac_datapath_at.v
rtl_v2/gemm_accelerator/gemm_accelerator_top.v
asic/oasys/step1_gemm_accelerator_top_mode0.v
asic/oasys/step1_gemm_accelerator_top_mode1.v
asic/oasys/step1_gemm_accelerator_top_mode4.v

위 파일에는 합성에 필요한 RTL source file을 한 줄씩 적습니다.

여기서 중요한 점은 repository root 기준의 상대 경로로 적었다는 점입니다.

이렇게 작성하면 나중에 Tcl config에서 REPO_ROOT를 앞에 붙여 절대 경로로 바꿀 수 있습니다.

즉, .f 파일의 역할은 다음과 같습니다.

합성 대상 Verilog 파일 목록 관리
config.tcl 내부를 깔끔하게 유지
source file 추가/삭제 시 수정 위치를 단순화

2. Oasys config Tcl 작성

다음은 Oasys 합성을 위한 config Tcl 파일입니다.

예시는 step1 mode0을 합성하는 설정입니다.
이때 주석은 코드 뒤에 작성하면 안됩니다.

namespace eval config {
    global input
    set REPO_ROOT {/mnt/NewHDD/home/ddl2026/ddl2026_2023104135/ddl2026_folder/simple-cpu-gemm-accelerator}

    # =========================================================
    # step1 mode0
    set STEP       {step1}
    set TOP_MODULE {step1_gemm_accelerator_top_mode0}
    # =========================================================

    set FILELIST "$REPO_ROOT/asic/oasys/$STEP.f"
    set fp [open $FILELIST r]
    set input(verilog_files) {}

    foreach line [split [string trim [read $fp]] "\n"] {
        lappend input(verilog_files) "$REPO_ROOT/$line"
    }

    close $fp

    set input(system_verilog)                 {true}
    set input(verilog_dirs)                   [list "$REPO_ROOT/rtl_v2/gemm_accelerator"]
    set input(verilog_defs)                   {}
    set input(top_module)                     $TOP_MODULE

    set input(lib_files)                      {{default {/mnt/NewHDD/home/vlsiadmin/TannerEDA/TannerTools_v2021.2/Process/Generic_250nm/Generic_250nm_LogicGates/Liberty/TANNER_TT_2P50V_25C.lib}}}
    set input(target_library)                 {default}
    set input(lef_files)                      {/mnt/NewHDD/home/vlsiadmin/TannerEDA/TannerTools_v2021.2/Process/Generic_250nm/Generic_250nm_LogicGates/Generic250nm_StdCells.lef}
    set input(tech_file)                      {/mnt/NewHDD/home/vlsiadmin/TannerEDA/TannerTools_v2021.2/Process/Generic_250nm/Generic_250nm_LogicGates/Generic250nm_tech.lef}

    set input(sdc_files)                      [list "$REPO_ROOT/asic/oasys/clk.sdc"]
    set input(def_files)                      {}
    set input(power_files)                    {}
    set input(vcd_file)                       {}
    set input(vcd_scope)                      {}
    set input(sa_probability)                 {}
    set input(sa_togg_perc)                   {}
    set input(sa_togg_rate)                   {}

    set input(clock_gating_minimum_bitwidth)  {4}
    set input(clock_gating_sequential_cell)   {none}
    set input(clock_gating_control_point)     {}
    set input(clock_gating_control_port)      {}
    set input(clock_gating_observation_point) {false}

    set input(comb_vt_target_library)         {default}
    set input(high_vt_target_library)         {default}
    set input(flow_synthesize)                {true}
    set input(synthesize_map_to_scan)         {false}
    set input(synthesize_gate_clock)          {false}
    set input(flow_optimize)                  {true}
    set input(optimize_leakage)               {false}
    set input(optimize_area)                  {false}
    set input(flow_refine)                    {false}
    set input(pre_synthesize)                 {}
    set input(pre_optimize)                   {}
}

3. Tcl 기본 문법

config 파일을 이해하려면 먼저 Tcl 문법 몇 가지를 알아야 합니다.

{}

set STEP {step1}

{}는 문자열을 그대로 저장할 때 사용합니다.

Tcl에서 {} 안에서는 변수 치환이 일어나지 않습니다.
따라서 경로나 module 이름을 그대로 넣고 싶을 때 사용합니다.


""

set FILELIST "$REPO_ROOT/asic/oasys/$STEP.f"

"" 안에서는 변수 치환이 일어납니다.

즉, $REPO_ROOT$STEP이 실제 값으로 바뀝니다.

예를 들어,

set REPO_ROOT {/home/user/project}
set STEP {step1}

이라면,

"$REPO_ROOT/asic/oasys/$STEP.f"

는 다음 문자열이 됩니다.

/home/user/project/asic/oasys/step1.f

$변수명

$REPO_ROOT
$STEP
$TOP_MODULE

$는 Tcl에서 변수 값을 가져올 때 사용합니다.


[]

set fp [open $FILELIST r]

[] 안의 명령어를 먼저 실행하고, 그 결과를 바깥 명령어에 전달합니다.

위 코드는 $FILELIST 경로의 파일을 read mode로 열고, 그 결과인 file pointer를 fp에 저장합니다.


[list ...]

set input(verilog_dirs) [list "$REPO_ROOT/rtl_v2/gemm_accelerator"]

list는 Tcl list를 만드는 명령어입니다.

경로에 공백이나 특수 문자가 있어도 하나의 list element로 안전하게 전달할 수 있습니다.


4. config Tcl의 기본 구성 요소

  1. 시스템 베릴로그 사용여부
  2. RTL 경로 설정
  3. 라이브러리 경로 설정
  4. sdc 경로 설정
namespace eval config {
    global input
    # 레포지토리 경로 지정
    set REPO_ROOT {/mnt/NewHDD/home/ddl2026/ddl2026_2023104135/ddl2026_folder/simple-cpu-gemm-accelerator}

    # =========================================================
    # step1 mode0
    set STEP       {step1}
    set TOP_MODULE {step1_gemm_accelerator_top_mode0}
    # =========================================================

    # .f 파일 경로 생성 및 읽기
    set FILELIST "$REPO_ROOT/asic/oasys/$STEP.f"
    set fp [open $FILELIST r]
    set input(verilog_files) {}

    foreach line [split [string trim [read $fp]] "\n"] {
        lappend input(verilog_files) "$REPO_ROOT/$line"
    }

    close $fp
    # 시스템베릴로그 사용 여부
    set input(system_verilog)                 {true}
    # RTL 경로 설정
    set input(verilog_dirs)                   [list "$REPO_ROOT/rtl_v2/gemm_accelerator"]
    set input(verilog_defs)                   {}
    # Top module 지정
    set input(top_module)                     $TOP_MODULE

    # 라이브러리 경로 설정
    set input(lib_files)                      {{default {/mnt/NewHDD/home/vlsiadmin/TannerEDA/TannerTools_v2021.2/Process/Generic_250nm/Generic_250nm_LogicGates/Liberty/TANNER_TT_2P50V_25C.lib}}}
    set input(target_library)                 {default}
    set input(lef_files)                      {/mnt/NewHDD/home/vlsiadmin/TannerEDA/TannerTools_v2021.2/Process/Generic_250nm/Generic_250nm_LogicGates/Generic250nm_StdCells.lef}
    set input(tech_file)                      {/mnt/NewHDD/home/vlsiadmin/TannerEDA/TannerTools_v2021.2/Process/Generic_250nm/Generic_250nm_LogicGates/Generic250nm_tech.lef}
    # Constraint와 power 관련 설정
    set input(sdc_files)                      [list "$REPO_ROOT/asic/oasys/clk.sdc"]
    set input(def_files)                      {}
    set input(power_files)                    {}
    set input(vcd_file)                       {}
    set input(vcd_scope)                      {}
    set input(sa_probability)                 {}
    set input(sa_togg_perc)                   {}
    set input(sa_togg_rate)                   {}
    # Clock gating 관련 설정
    set input(clock_gating_minimum_bitwidth)  {4}
    set input(clock_gating_sequential_cell)   {none}
    set input(clock_gating_control_point)     {}
    set input(clock_gating_control_port)      {}
    set input(clock_gating_observation_point) {false}

    set input(comb_vt_target_library)         {default}
    set input(high_vt_target_library)         {default}
    set input(flow_synthesize)                {true}
    set input(synthesize_map_to_scan)         {false}
    set input(synthesize_gate_clock)          {false}
    set input(flow_optimize)                  {true}
    set input(optimize_leakage)               {false}
    set input(optimize_area)                  {false}
    set input(flow_refine)                    {false}
    set input(pre_synthesize)                 {}
    set input(pre_optimize)                   {}
}

5. Constraint와 power 관련 설정

SDC file 지정

.sdc 파일은 timing constraint를 정의하는 파일입니다.

대표적으로 clock period를 설정합니다.

예를 들어 clk.sdc에는 다음과 같은 내용이 들어갈 수 있습니다.

create_clock -name clk -period 10 [get_ports clk]

이 constraint가 있어야 Oasys가 어느 정도 속도를 목표로 합성해야 하는지 판단할 수 있습니다.


DEF file

set input(def_files) {}

.def 파일은 placement, routing, pin location 같은 physical design 정보를 담습니다.

현재 단계는 RTL synthesis이므로 별도 DEF를 사용하지 않습니다.


Power file

set input(power_files) {}

전력 분석용 추가 파일을 지정하는 항목입니다.

현재는 사용하지 않으므로 빈 값으로 둡니다.


VCD file

set input(vcd_file) {}
set input(vcd_scope) {}

.vcd 파일은 simulation waveform에서 나온 switching activity 정보를 담습니다.

VCD를 넣으면 실제 시뮬레이션에서 어떤 신호가 얼마나 toggle되었는지를 기반으로 power estimation을 할 수 있습니다.

현재는 비워두었기 때문에 power report는 실제 workload 기반이라기보다는 tool의 기본 activity assumption에 가까운 결과입니다.

정확한 전력 비교를 하려면 simulation에서 VCD를 생성하고, 그 VCD를 Oasys power analysis에 넣는 것이 좋습니다.


Static activity 설정

set input(sa_probability) {}
set input(sa_togg_perc) {}
set input(sa_togg_rate) {}

VCD 없이 switching activity를 수동으로 지정할 때 사용하는 항목입니다.

각 항목의 의미는 다음과 같습니다.

sa_probability : signal이 1일 확률
sa_togg_perc   : toggle percentage
sa_togg_rate   : toggle rate

현재는 별도 activity 정보를 주지 않았습니다.


6. Clock gating 관련 설정

set input(clock_gating_minimum_bitwidth)  {4}
set input(clock_gating_sequential_cell)   {none}
set input(clock_gating_control_point)     {}
set input(clock_gating_control_port)      {}
set input(clock_gating_observation_point) {false}

clock gating은 불필요한 clock switching을 줄여 dynamic power를 감소시키는 기법입니다.

하지만 현재 설정에서는 clock gating을 적극적으로 사용하지 않습니다.

특히 다음 줄이 중요합니다.

set input(clock_gating_sequential_cell) {none}

clock gating용 sequential cell을 지정하지 않았다는 의미입니다.

또한 아래 설정에서도 gated clock 합성을 꺼두었습니다.

set input(synthesize_gate_clock) {false}

따라서 현재 config는 clock gating 최적화보다는 기본 합성과 기본 optimization에 초점을 둔 설정입니다.

7. Oasys 실행

config 작성이 끝나면 Oasys를 실행합니다.

터미널에서 다음 명령어를 입력합니다.

oasys -gui

이후 Oasys GUI에서 미리 작성한 config file을 엽니다.

Design → Open Config → 작성한 .tcl 파일 선택

config가 정상적으로 열리면 synthesis를 실행합니다.


8. Synthesized Verilog netlist export

합성이 끝나면 synthesized Verilog netlist를 export합니다.

Oasys command 창에 다음 명령어를 입력합니다.

write_verilog "step1_mode0_synth.v"

여기서 step1_mode0_synth.v는 예시 파일명입니다.

다른 mode를 합성했다면 다음처럼 이름을 바꿔 저장합니다.

write_verilog "step1_mode1_synth.v"
write_verilog "step1_mode4_synth.v"

저장 경로를 따로 지정하지 않으면 Oasys를 실행한 현재 작업 디렉토리에 파일이 저장됩니다.
(pwd 입력했을 때 출력되는 경로가 현재 작업 디렉토리입니다.)

원하는 폴더에 저장하고 싶다면 경로까지 명시합니다.

write_verilog "/mnt/NewHDD/home/ddl2026/ddl2026_2023104135/ddl2026_folder/simple-cpu-gemm-accelerator/asic/oasys/results/step1_mode0_synth.v"

합성 후에는 library에 존재하는 cell instance 형태로 바뀝니다.

AND2X1 U123 (
    .A(a),
    .B(b),
    .Y(y)
);

9. Timing, area, power report export

합성 결과를 확인하기 위해 timing, area, power report를 export합니다.

Oasys command 창에서 다음 명령어를 입력합니다.

report_timing > "step1_mode0_timing.rpt"
report_area   > "step1_mode0_area.rpt"
report_power  > "step1_mode0_power.rpt"

다른 mode에 대해서는 파일 이름만 바꿔 저장합니다.

report_timing > "step1_mode1_timing.rpt"
report_area   > "step1_mode1_area.rpt"
report_power  > "step1_mode1_power.rpt"
report_timing > "step1_mode4_timing.rpt"
report_area   > "step1_mode4_area.rpt"
report_power  > "step1_mode4_power.rpt"

이 report 파일들도 저장 경로를 따로 지정하지 않으면 현재 Oasys 실행 디렉토리에 저장됩니다.

원하는 폴더에 저장하고 싶다면 다음처럼 경로를 명시합니다.

report_timing > "$REPO_ROOT/asic/oasys/results/step1_mode0_timing.rpt"
report_area   > "$REPO_ROOT/asic/oasys/results/step1_mode0_area.rpt"
report_power  > "$REPO_ROOT/asic/oasys/results/step1_mode0_power.rpt"

10. 각 report의 의미

Timing report

Timing report는 설계가 주어진 clock constraint를 만족하는지 확인하는 report입니다.

가장 중요하게 봐야 할 값은 slack입니다.

slack > 0  : timing 만족
slack < 0  : timing violation

즉, slack이 음수라면 현재 clock period 안에 신호가 도착하지 못한다는 의미입니다.

이 경우 datapath를 줄이거나, pipeline을 추가하거나, clock constraint를 완화해야 합니다.


Area report

Area report는 합성된 standard cell의 총 면적을 보여줍니다.

GEMM accelerator처럼 datapath 구조가 중요한 설계에서는 area report를 통해 구조별 cost를 비교할 수 있습니다.

예를 들어 다음과 같은 비교가 가능합니다.

mode0 vs mode1 vs mode4
single MAC vs 4-lane MAC
buffer 추가 전후
control logic 면적
datapath 면적

단순히 기능이 맞는지만 보는 것이 아니라, 같은 기능을 구현하는 데 얼마나 많은 cell area가 필요한지도 확인해야 합니다.


Power report

Power report는 설계의 전력 소모를 보여줍니다.

일반적으로 다음 항목을 확인합니다.

dynamic power
leakage power
total power

다만 현재 config에서는 VCD 파일을 넣지 않았습니다.

따라서 power report는 실제 GEMM workload 기반의 정확한 전력이라기보다는, tool의 기본 switching activity 추정에 기반한 결과입니다.

더 정확한 전력 비교를 하려면 simulation에서 VCD를 생성하고, 그 VCD를 Oasys에 넣어 power analysis를 수행해야 합니다.


11. 정리

이번 Oasys workflow의 핵심은 다음과 같습니다.

.f 파일
→ 합성할 RTL source 목록 관리

config.tcl
→ source file, top module, library, constraint, optimization option 지정

.lib
→ standard cell의 timing / power / logic 정보

.lef
→ standard cell의 physical information

tech.lef
→ 공정 routing layer 및 technology rule

.sdc
→ clock period 등 timing constraint

.vcd
→ 실제 simulation switching activity 기반 power estimation

Oasys 합성은 단순히 Verilog를 gate-level netlist로 바꾸는 작업이 아닙니다.

RTL이 특정 공정 library와 timing constraint 아래에서 어떤 hardware structure로 구현되는지 확인하는 과정입니다.

따라서 synthesized Verilog netlist만 저장하는 것이 아니라, timing, area, power report까지 함께 저장해야 설계 비교가 가능합니다.

특히 GEMM accelerator처럼 datapath 구조가 성능과 면적에 직접 영향을 주는 설계에서는 mode별 합성 결과를 비교하는 것이 중요합니다.

mode0 : baseline 구조
mode1 : 개선 구조
mode4 : 4-lane datapath 구조

같은 constraint와 같은 library 조건에서 각 mode를 합성하면, RTL 구조 변경이 실제 hardware cost로 어떻게 나타나는지 확인할 수 있습니다.

profile
electronic engineering student

0개의 댓글