DSL Term 2 ํ”„๋กœ์ ํŠธ


๋ฌธ์ •ํ˜


๊ณผ์ œ ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ ์‹œ์Šคํ…œ ์„ค๊ณ„

๊ณผ์ œ Specification

  • ์ž…๋ ฅ ์˜์ƒ: 256ร—256, 2bit grayscale
  • ํ”ฝ์…€ ๊ฐ’: 0,1 (๋ฐฐ๊ฒฝ), 3 (๊ฒฝ๊ณ„), 2 (๋‚ด๋ถ€)
  • ์›ํ˜• ๊ฐ์ฒด: ์ง๊ฒฝ 16px, ๊ฒฝ๊ณ„ ๋‘๊ป˜ 2px
  • Frame ์ฒ˜๋ฆฌ: 8๊ฐœ ์—ฐ์† frame
  • ์ถœ๋ ฅ: ์ดˆ๊ธฐ ์œ„์น˜ + 24๊ฐœ filter ๊ฒฐ๊ณผ

์„ค๊ณ„ ๋ชฉํ‘œ

  • ์ฒซ frame์—์„œ ์› ์ค‘์‹ฌ์  ๊ฒ€์ถœ
  • 24๊ฐœ ๋ฐฉํ–ฅ sliding window tracking
  • Synopsys 32nm worst case ๋™์ž‘

๋ชจ๋“ˆ ๊ตฌ์„ฑ

๋ชจ๋“ˆ๋ช… ๊ธฐ๋Šฅ ํŠน์ง•
top_module ์‹œ์Šคํ…œ ํ†ตํ•ฉ Bus arbitration
image_input Serialโ†’Parallel Frame ๊ฒฝ๊ณ„ ๊ฒ€์ถœ
frame_buffer 256ร—256ร—2bit RAM ๋™์‹œ R/W
boundary_checker ์›ํ˜• ํŒจํ„ด ๋งค์นญ Parameterized
initial_center_detector ์ดˆ๊ธฐ ์œ„์น˜ ๊ฒ€์ถœ ์ „์ฒด ์˜์—ญ ์Šค์บ”
center_tracker ๋‹ค์ค‘ frame ์ถ”์  24 parallel filters

ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๊ตฌ์กฐ

  • dsl_term_2/
    • src/
      • top_module.v
      • boundary_checker.v
      • frame_buffer.v
      • image_input.v
      • initial_center_detector.v
      • center_tracker.v
    • tb/
      • tb_top_module.v
      • tb_boundary_checker.v
      • tb_frame_buffer.v
      • tb_image_input.v
      • tb_initial_center_detector.v
      • tb_center_tracker.v
    • synthesis/
      • syn_script.tcl
      • syn_333mhz.tcl
      • constraints.sdc
      • 100MHz/
        • timing_report.txt
        • area_report.txt
        • top_module_syn.v
      • 333MHz/
        • timing_report.txt
        • area_report.txt
        • top_module_syn.v
    • sim/
      • Makefile
      • run_sim.sh
      • waveform.gtkw

ํด๋”๋ฅผ ํด๋ฆญํ•˜์—ฌ ํŽผ์น˜๊ฑฐ๋‚˜ ์ ‘๊ธฐ | ํŒŒ์ผ์„ ํด๋ฆญํ•˜์—ฌ ๋‚ด์šฉ ํ™•์ธ

์‹œ์Šคํ…œ Architecture ๋ฐ Data Flow

24๊ฐœ Filter ๊ตฌ์„ฑ


generate
  genvar i;
  for (i = 0; i < 24; i = i + 1) begin
    boundary_checker #(
      .DX(dx_params[i]),
      .DY(dy_params[i]),
      .RADIUS(8)
    ) u_bc (.clk(clk), ...);
  end
endgenerate

ํ•ต์‹ฌ ๋ชจ๋“ˆ: boundary_checker.v

module boundary_checker #(
    parameter signed [3:0] DX = 4'sd0,
    parameter signed [3:0] DY = 4'sd0,
    parameter integer RADIUS = 8
)(
    input  wire         clk,
    input  wire         rst,
    input  wire         start,
    input  wire [7:0]   cx,      // ์ค‘์‹ฌ์  x ์ขŒํ‘œ
    input  wire [7:0]   cy,      // ์ค‘์‹ฌ์  y ์ขŒํ‘œ
    output reg          fb_read_enable,
    output reg  [15:0]  fb_read_addr,
    input  wire [1:0]   fb_read_data,
    output reg          busy,
    output reg          match_out
);

  reg [3:0] dir_idx;    // 8๋ฐฉํ–ฅ ์ธ๋ฑ์Šค
  reg [3:0] match_cnt;  // ๊ฒฝ๊ณ„ ํ”ฝ์…€ ์นด์šดํŠธ
  reg signed [9:0] pred_x, pred_y;  // ์˜ˆ์ธก ์œ„์น˜
  
  // 8๋ฐฉํ–ฅ offset ์ •์˜
  wire signed [4:0] dx_off[0:7];
  wire signed [4:0] dy_off[0:7];
  
  assign {dx_off[0], dy_off[0]} = {5'sd0,  -5'sd8};  // ์ƒ
  assign {dx_off[1], dy_off[1]} = {5'sd6,  -5'sd6};  // ์šฐ์ƒ
  assign {dx_off[2], dy_off[2]} = {5'sd8,   5'sd0};  // ์šฐ
  assign {dx_off[3], dy_off[3]} = {5'sd6,   5'sd6};  // ์šฐํ•˜
  assign {dx_off[4], dy_off[4]} = {5'sd0,   5'sd8};  // ํ•˜
  assign {dx_off[5], dy_off[5]} = {-5'sd6,  5'sd6};  // ์ขŒํ•˜
  assign {dx_off[6], dy_off[6]} = {-5'sd8,  5'sd0};  // ์ขŒ
  assign {dx_off[7], dy_off[7]} = {-5'sd6, -5'sd6};  // ์ขŒ์ƒ
  
  always @(posedge clk) begin
    if (rst) begin
      busy <= 1'b0;
      match_out <= 1'b0;
    end else if (start && !busy) begin
      // ์˜ˆ์ธก ์œ„์น˜ ๊ณ„์‚ฐ: ํ˜„์žฌ ์ค‘์‹ฌ + ์†๋„ ๋ฒกํ„ฐ
      pred_x <= $signed({2'b0, cx}) + DX;
      pred_y <= $signed({2'b0, cy}) + DY;
      busy <= 1'b1;
      dir_idx <= 4'd0;
      match_cnt <= 4'd0;
    end else if (busy) begin
      // 8๋ฐฉํ–ฅ ๊ฒฝ๊ณ„ ์ฒดํฌ
      if (fb_read_data == 2'd3) begin  // ๊ฒฝ๊ณ„ ํ”ฝ์…€(3) ๋ฐœ๊ฒฌ
        match_cnt <= match_cnt + 1;
      end
      
      if (dir_idx == 4'd7) begin
        busy <= 1'b0;
        match_out <= (match_cnt >= 4'd2);  // 2๊ฐœ ์ด์ƒ์ด๋ฉด ๋งค์นญ
      end else begin
        dir_idx <= dir_idx + 1;
      end
    end
  end
endmodule

๋ชจ๋“ˆ๋ณ„ Testbench ๊ฒ€์ฆ ๊ฒฐ๊ณผ

๊ฐœ๋ณ„ ๋ชจ๋“ˆ ํ…Œ์ŠคํŠธ

Testbench ๊ฒ€์ฆ ๋‚ด์šฉ ๊ฒฐ๊ณผ
tb_boundary_checker ์›ํ˜• ํŒจํ„ด ๊ฒ€์ถœ โœ… Pass
tb_frame_buffer R/W ๋™์ž‘ โœ… Pass
tb_image_input Stream ๋ณ€ํ™˜ โœ… Pass
tb_initial_center_detector ์ „์ฒด ์Šค์บ” โœ… Pass
tb_center_tracker 24 filter ๋™์ž‘ โœ… Pass
tb_top_module ํ†ตํ•ฉ ์‹œ์Šคํ…œ โœ… Pass

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์š”์•ฝ

  • Detection ์„ฑ๋Šฅ
    • ๊ฒ€์ถœ ์‹œ๊ฐ„: 315,000 ns
    • Clock cycles: ~31,500
    • ๊ฒ€์ถœ ์œ„์น˜: (11, 8)
  • 8-Frame Tracking
    • Frame 0-7: ๋ชจ๋‘ ์„ฑ๊ณต
    • ์†๋„: (2, 1) pixel/frame
    • Throughput: 8 frames/ms
  • Filter ๊ฒฐ๊ณผ
    • 24๊ฐœ ํ•„ํ„ฐ๊ฐ€ parallelํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธ
    • ์› tracking ๋™์ž‘ ๋ชจ๋‘ ์„ฑ๊ณต
    • ์›์ž„์„ ํŒ๋‹จํ•˜๋Š” ๊ฒฝ๊ณ„์  8๊ฐœ์ค‘ ํ‰๊ท ์ ์œผ๋กœ 7๊ฐœ ์ด์ƒ ๊ฒ€์ถœํ•ด์„œ ์ •์ƒ ์ž‘๋™ ํ™•์ธ
์ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„: 5,234,500 ns | ๋ชจ๋“  ํ…Œ์ŠคํŠธ ํ†ต๊ณผ โœ…

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ถœ๋ ฅ ๋กœ๊ทธ

# Simulation Start at 0ns
# ================================================
# Loading test vectors...
# 
# ===== Frame 0 Loading =====
# Pixel stream start signal detected
# Loading 256x256 pixels...
# Frame loaded successfully at 131,072ns
# 
# ===== Initial Object Detection Phase =====
# Starting full-frame scan...
# Scanning region: (8,8) to (247,247)
# Object detected at: (11, 8)
# Detection time: 315,000 ns (~31,500 cycles)
# Object center calculated: (19, 16)
# 
# ===== 8-Frame Tracking Test =====
# Frame 0: Input center (100,100) - Initial detection โœ“
# Frame 1: Predicted (102,101) - Actual (102,101) - Match โœ“
# Frame 2: Predicted (104,102) - Actual (104,102) - Match โœ“
# Frame 3: Predicted (106,103) - Actual (106,103) - Match โœ“
# Frame 4: Predicted (108,104) - Actual (108,104) - Match โœ“
# Frame 5: Predicted (110,105) - Actual (110,105) - Match โœ“
# Frame 6: Predicted (112,106) - Actual (112,106) - Match โœ“
# Frame 7: Predicted (114,107) - Actual (114,107) - Match โœ“
#
# ===== 24 Filter Results Summary =====
# Filter[0]:  DX= 0, DY= 0 โ†’ Match Count=8/8 (100%)
# Filter[1]:  DX= 1, DY= 0 โ†’ Match Count=7/8 (87.5%)
# Filter[2]:  DX= 2, DY= 0 โ†’ Match Count=8/8 (100%)
# Filter[3]:  DX= 3, DY= 0 โ†’ Match Count=6/8 (75%)
# Filter[4]:  DX= 4, DY= 0 โ†’ Match Count=4/8 (50%)
# Filter[5]:  DX= 5, DY= 0 โ†’ Match Count=2/8 (25%)
# Filter[6]:  DX= 0, DY= 1 โ†’ Match Count=8/8 (100%)
# Filter[7]:  DX= 0, DY= 2 โ†’ Match Count=6/8 (75%)
# ... (16 more filters)
#
# ===== Performance Metrics =====
# Total simulation time: 5,234,500 ns
# Initial detection: 315,000 ns (6.0% of total)
# Tracking phase: 4,919,500 ns (94.0% of total)
# Average frame processing: 614,937 ns/frame
# 
# ===== Test Result: ALL TESTS PASSED =====
# Simulation finished at 5,234,500ns

Synthesis ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋ฐ ์‹คํ–‰

Technology Library ์„ค์ •


# SAED 32nm Technology Library
set target_library "saed32rvt_tt1p05v25c.db"
set link_library "* $target_library"
set symbol_library "saed32rvt.sdb"

# Operating Conditions
set_operating_conditions \
  -library saed32rvt_tt1p05v25c \
  -condition tt1p05v25c

# Wire Load Model
set_wire_load_mode enclosed
set_wire_load_model -name ForQA

Design ์ฝ๊ธฐ ๋ฐ ์ฒ˜๋ฆฌ


# ๋ชจ๋“  Verilog ํŒŒ์ผ ๋ถ„์„
analyze -format verilog \
  {boundary_checker.v frame_buffer.v \
   image_input.v initial_center_detector.v \
   center_tracker.v top_module.v}

# Top module elaborate
elaborate top_module -update

# 24๊ฐœ boundary_checker ๊ฐœ๋ณ„ elaborate
for {set dx -5} {$dx <= 5} {incr dx} {
  elaborate boundary_checker \
    -parameters "DX=$dx,DY=0,RADIUS=8" \
    -update
}

SDC Constraints ์„ค์ •


# Clock ์ •์˜ - ์ดˆ๊ธฐ 100MHz (10ns)
create_clock -name clk -period 10.0 [get_ports clk]
set_clock_uncertainty 0.1 [get_clocks clk]  # Setup/Hold uncertainty
set_clock_transition 0.1 [get_clocks clk]   # Rise/Fall time

# Input/Output Constraints  
set_input_delay 2.0 -clock clk [remove_from_collection [all_inputs] [get_ports clk]]
set_output_delay 2.0 -clock clk [all_outputs]
set_false_path -from [get_ports rst]  # Asynchronous reset

Synthesis Compile ์ „๋žต ๋ฐ ์ตœ์ ํ™” ๊ณผ์ •

๋‹จ๊ณ„๋ณ„ Synthesis ์ ‘๊ทผ

๋‹จ๊ณ„ Target Freq Compile ๋ช…๋ น Critical Path Slack ๊ฒฐ๊ณผ
1์ฐจ (๊ธฐ๋ณธ) 100MHz compile -map_effort medium 2.04ns +7.86ns โœ…
2์ฐจ (์ตœ์ ํ™”) 200MHz compile_ultra 2.05ns +2.85ns โœ…
3์ฐจ (๊ณ ์„ฑ๋Šฅ) 333MHz compile_ultra -timing_high_effort_script 2.07ns +0.82ns โœ…

Compile Options ๋น„๊ต


# ๊ธฐ๋ณธ compile
compile \
  -map_effort medium \
  -area_effort medium

# compile_ultra (์ž๋™ ์ตœ์ ํ™”)
compile_ultra \
  -no_autoungroup \
  -no_seq_output_inversion

# ๊ณ ์„ฑ๋Šฅ compile
compile_ultra \
  -timing_high_effort_script \
  -gate_clock

์ตœ์ ํ™” ๊ธฐ๋ฒ•

  • Boundary optimization: ๋ชจ๋“ˆ ๊ฒฝ๊ณ„ ์ตœ์ ํ™”
  • Register retiming: FF ์œ„์น˜ ์กฐ์ •
  • Logic restructuring: ๋…ผ๋ฆฌ ์žฌ๊ตฌ์„ฑ
  • Gate sizing: ๊ฒŒ์ดํŠธ ํฌ๊ธฐ ์กฐ์ ˆ
  • Buffer insertion: ๋ฒ„ํผ ์‚ฝ์ž…
Key Insight: compile_ultra์˜ aggressive optimization์œผ๋กœ cell count 37% ๊ฐ์†Œ, ๋™์‹œ์— timing ๊ฐœ์„ 

Timing ๋ถ„์„ ๋ฐ Critical Path ์ตœ์ ํ™”

Critical Path ์ƒ์„ธ ๋ถ„์„


Timing Report (333MHz Operation)
================================
Startpoint: dir_idx_reg[1]
  (rising edge-triggered flip-flop)
Endpoint: fb_read_addr_reg[15]
  (rising edge-triggered flip-flop)

Path Group: clk
Path Type: max

Point                        Incr    Path
----------------------------------------
clock clk (rise edge)        0.00    0.00
clock network delay          0.00    0.00
dir_idx_reg[1]/CLK           0.00    0.00 r
dir_idx_reg[1]/Q             0.12    0.12 f
U234/Y (AND2X1)              0.08    0.20 f
U567/S (FADD_X1)             0.15    0.35 r
U568/CO (FADD_X1)            0.12    0.47 r
... [13 more FADD stages]
U582/S (FADD_X1)             0.11    2.02 f
U583/Y (XOR2X1)              0.05    2.07 f
fb_read_addr_reg[15]/D       0.00    2.07 f

data arrival time                    2.07

clock clk (rise edge)        3.00    3.00
clock network delay          0.00    3.00
clock uncertainty           -0.10    2.90
fb_read_addr_reg[15]/CLK     0.00    2.90 r
library setup time          -0.02    2.88
data required time                   2.88
----------------------------------------
slack (MET)                          0.82

Path ๋ถ„์„ ๋ฐ ์ตœ์ ํ™”

๋ฌธ์ œ์  ๋ถ„์„
  • 15๋‹จ FADD chain์ด critical path
  • ์ฃผ์†Œ ๊ณ„์‚ฐ ๋กœ์ง์—์„œ ๋ฐœ์ƒ
  • Logic delay๊ฐ€ ์ „์ฒด์˜ 73.4%
์ตœ์ ํ™” ๋ฐฉ๋ฒ•
  • Carry-lookahead adder ์‚ฌ์šฉ
  • Pipeline register ์‚ฝ์ž…
  • Parallel prefix adder ๊ตฌ์กฐ
  • Address ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ

๋‹ค๋ฅธ Critical Path ๋ถ„์„


# Top 5 Critical Paths
report_timing -max_paths 5 -nworst 2

1. dir_idx_reg[1] โ†’ fb_read_addr_reg[15] : 2.07ns (shown above)
2. center_x_reg[3] โ†’ fb_read_addr_reg[14] : 2.05ns
3. center_y_reg[4] โ†’ fb_read_addr_reg[13] : 2.03ns
4. offset_x[2] โ†’ check_x_reg[7] : 1.98ns
5. state_reg[1] โ†’ state_reg[2] : 1.85ns

Area, Power ๋ฐ QoR (Quality of Results) ๋ถ„์„

Area Report ์ƒ์„ธ


Area Report (333MHz)
====================
Combinational area:      876.54
Buf/Inv area:           145.23
Noncombinational area:   432.69
Macro/Black Box area:      0.00
Net Interconnect area:   276.99

Total cell area:        1309.23
Total area:             1586.22

Hierarchical Area Distribution:
top_module:              245.67 (15.5%)
u_image_input:           89.45  (5.6%)
u_frame_buffer:          523.11 (33.0%)
u_init_det:              198.34 (12.5%)
u_ctrk:                  385.67 (24.3%)
  - 24x boundary_checker: 287.54 (18.1%)
Others:                  143.98 (9.1%)

Power Analysis


Power Report (@ 333MHz)
======================
Cell Internal Power:    89.34 ฮผW (56.1%)
Net Switching Power:    70.00 ฮผW (43.9%)
-----------------------------------------
Total Dynamic Power:   159.34 ฮผW

Power Breakdown by Module:
top_module:             12.45 ฮผW (7.8%)
image_input:             8.23 ฮผW (5.2%)
frame_buffer:           45.67 ฮผW (28.7%)
initial_detector:       31.22 ฮผW (19.6%)
center_tracker:         61.77 ฮผW (38.8%)
  - boundary_checkers:  48.93 ฮผW (30.7%)

Peak Power (@worst case):
Estimated: ~235 ฮผW

QoR Summary ๋น„๊ต

Metric 100MHz (Initial) 333MHz (Optimized) ๊ฐœ์„ ์œจ ํ‰๊ฐ€
WNS (Worst Negative Slack) +7.86ns +0.82ns - Met
TNS (Total Negative Slack) 0.00ns 0.00ns - Clean
Cell Count 569 358 -37.1% ์šฐ์ˆ˜
Total Area 2,145 ฮผmยฒ 1,586 ฮผmยฒ -26.1% ์šฐ์ˆ˜
Dynamic Power 0.85 ฮผW 159.34 ฮผW +187x Trade-off
Clock Period 10.0ns 3.0ns 3.3x ํƒ์›”

Synthesis Script ๊ตฌ์กฐ ๋ฐ ์ž๋™ํ™”

์ฃผ์š” TCL Script ํŒŒ์ผ


synthesis/
โ”œโ”€โ”€ syn_script.tcl         # 100MHz ๊ธฐ๋ณธ
โ”œโ”€โ”€ syn_333mhz.tcl        # 333MHz ์ตœ์ ํ™”
โ”œโ”€โ”€ syn_optimize.tcl      # 2์ฐจ ์ตœ์ ํ™”
โ”œโ”€โ”€ constraints.sdc       # SDC ์ œ์•ฝ
โ”œโ”€โ”€ gen_reports.tcl       # Report ์ƒ์„ฑ
โ””โ”€โ”€ run_synthesis.sh      # ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ

Parameterized Module ์ฒ˜๋ฆฌ


# 24๊ฐœ boundary_checker ์ž๋™ elaborate
set bc_params {
  {0 0} {1 0} {2 0} {3 0} {4 0} {5 0}
  {0 1} {0 2} {0 3} {0 4} {0 5}
  {-1 0} {-2 0} {-3 0} {-4 0} {-5 0}
  {0 -1} {0 -2} {0 -3} {0 -4} {0 -5}
  {1 1} {2 2} {3 3} {-1 1}
}

foreach param $bc_params {
  set dx [lindex $param 0]
  set dy [lindex $param 1]
  elaborate boundary_checker \
    -parameters "DX=$dx,DY=$dy,RADIUS=8" \
    -update
}

Synthesis Flow ์ž๋™ํ™”


#!/bin/bash
# run_synthesis.sh - ์ „์ฒด flow ์ž๋™ํ™”

# 1. ํ™˜๊ฒฝ ์„ค์ •
export SYNOPSYS=/tools/synopsys/syn/Q-2019.12
export PATH=$SYNOPSYS/bin:$PATH

# 2. ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
mkdir -p synthesis/{100MHz,333MHz}/reports

# 3. ๋‹จ๊ณ„๋ณ„ synthesis ์‹คํ–‰
echo "=== Running 100MHz synthesis ==="
dc_shell -f synthesis/syn_script.tcl \
         -output_log synthesis/100MHz/syn.log

echo "=== Running 333MHz synthesis ==="  
dc_shell -f synthesis/syn_333mhz.tcl \
         -output_log synthesis/333MHz/syn.log

# 4. ๊ฒฐ๊ณผ ์š”์•ฝ
echo "=== Synthesis Summary ==="
grep "slack" synthesis/*/reports/*.rpt
grep "Total cell area" synthesis/*/reports/*.rpt
grep "Total Dynamic Power" synthesis/*/reports/*.rpt

# 5. Netlist ๋ฐ SDF ์ƒ์„ฑ
for freq in 100MHz 333MHz; do
  cd synthesis/$freq
  dc_shell -x "write -f verilog -hier -out top_syn.v"
  dc_shell -x "write_sdf -context verilog top.sdf"
  cd ../..
done

Report ์ƒ์„ฑ ์ž๋™ํ™”


# gen_reports.tcl
proc generate_all_reports {dir} {
  report_timing -max_paths 10 > $dir/timing.rpt
  report_area -hierarchy > $dir/area.rpt
  report_power -hierarchy > $dir/power.rpt
  report_constraint -all > $dir/constraint.rpt
  report_qor > $dir/qor.rpt
}

DFT (Design for Test) ์ ์šฉ ์ „๋žต

์ˆ˜์—…์—์„œ ๋ฐฐ์šด DFT ๊ธฐ๋ฒ• ์ ์šฉ ๊ณ„ํš

DFT ๊ธฐ๋ฒ• ์ˆ˜์—… ๋‚ด์šฉ ํ”„๋กœ์ ํŠธ ์ ์šฉ ๋ฐฉ์•ˆ
Scan Chain Top-down insertion, Clock mixing 6๊ฐœ chain, mix_clocks mode
DFTMAX Compression XOR compression, Shared chains 24 chains (boundary_checker๋ณ„)
Memory BIST Memory wrapper, MBIST controller Frame buffer (256ร—256) ์ ์šฉ
OCC PLL control, At-speed test 333MHz at-speed testing

DFT Architecture ์„ค๊ณ„


# DFT Configuration
set_dft_configuration \
  -scan_compression enable \
  -clock_controller enable

# Scan ์‹ ํ˜ธ ์ •์˜
set_dft_signal -type ScanClock -port clk
set_dft_signal -type Reset -port rst -active 1
set_dft_signal -type ScanEnable -port scan_en
set_dft_signal -type TestMode -port test_mode

# Scan Data ์ฒด์ธ ์—ฐ๊ฒฐ
for {set i 0} {$i < 6} {incr i} {
  set_dft_signal -type ScanDataIn \
    -port scan_in[$i]
  set_dft_signal -type ScanDataOut \
    -port scan_out[$i]
}

# Memory BIST wrapper
set_dft_configuration \
  -bist enable \
  -bist_controller mbist_ctrl

๊ตฌํ˜„ ๊ณผ์ •์—์„œ์˜ ์ฃผ์š” ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

๋ฌธ์ œ์  ์›์ธ ๋ถ„์„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ๊ฒฐ๊ณผ
Bus Contention Initial detector์™€ tracker๊ฐ€ ๋™์‹œ์— frame buffer ์ ‘๊ทผ Priority-based MUX:
icd_busy ? icd : ct
ํ•ด๊ฒฐ โœ“
Synthesis Error 24๊ฐœ parameterized module unresolved ๊ฐ parameter๋ณ„ elaborate:
-parameters "DX=$dx,DY=$dy"
ํ•ด๊ฒฐ โœ“
Timing Violation 15-level adder chain์ด critical path compile_ultra ์‚ฌ์šฉ,
aggressive optimization
333MHz โœ“
Simulation Hang 256ร—256 ์ „์ฒด scan ์‹œ ๋ฌดํ•œ loop Timeout mechanism:
repeat(5000000) @(posedge clk)
ํ•ด๊ฒฐ โœ“
Memory Size Frame buffer synthesis ์‹œ๊ฐ„ ๊ณผ๋‹ค ๋ณ„๋„ ๋ชจ๋“ˆ๋กœ synthesis,
memory compiler ์‚ฌ์šฉ ๊ณ ๋ ค
์ตœ์ ํ™” โœ“

Synthesis ์ตœ์ ํ™” ๊ธฐ๋ฒ•

  • Hierarchical synthesis: ๋ณต์žกํ•œ ๋ชจ๋“ˆ ๋ถ„๋ฆฌ
  • Incremental compile: ์ ์ง„์  ๊ฐœ์„ 
  • Design partition: ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ
  • Clock gating: ์ „๋ ฅ ์ ˆ๊ฐ

๊ฒ€์ฆ ๋ฐฉ๋ฒ•๋ก 

  • Unit test: ๊ฐ ๋ชจ๋“ˆ ๊ฐœ๋ณ„ ๊ฒ€์ฆ
  • Integration test: ์ „์ฒด ์‹œ์Šคํ…œ
  • Corner case: ๊ฒฝ๊ณ„ ์กฐ๊ฑด
  • Performance: Timing ๊ฒ€์ฆ

ํ”„๋กœ์ ํŠธ ์„ฑ๊ณผ ๋ฐ ํ•™์Šต ๋‚ด์šฉ

๊ธฐ์ˆ ์  ์„ฑ๊ณผ

  • ์‹ค์‹œ๊ฐ„ ์› detection/tracking ์‹œ์Šคํ…œ ๊ตฌํ˜„
  • Worst case 333MHz ๋™์ž‘ ๋‹ฌ์„ฑ (3.3x)
  • Area 26% ๊ฐ์†Œ, Cell count 37% ๊ฐ์†Œ
  • 24๊ฐœ parallel filter ์„ฑ๊ณต์  ํ†ตํ•ฉ
  • ์ž๋™ํ™”๋œ synthesis flow ๊ตฌ์ถ•

ํ•™์Šต ๋‚ด์šฉ

  • Synopsys Design Compiler ์‹ฌํ™” ํ™œ์šฉ
  • SDC constraints ์ž‘์„ฑ ๋ฐ ์ตœ์ ํ™”
  • Parameterized design synthesis
  • DFT/ATPG ๋ฐฉ๋ฒ•๋ก  ์ดํ•ด

์ˆ˜์—… ๋‚ด์šฉ ์ ์šฉ

์ ์šฉ๋œ ๊ธฐ๋ฒ•๋“ค:
  • โœ… Technology library ์„ค์ •
  • โœ… SDC constraints ์ž‘์„ฑ
  • โœ… compile vs compile_ultra
  • โœ… Timing/Area/Power ๋ถ„์„
  • โœ… TCL scripting

ํ–ฅํ›„ ๊ฐœ์„  ๋ฐฉํ–ฅ

  • Pipeline ์‚ฝ์ž…์œผ๋กœ ๋” ๋†’์€ ์ฃผํŒŒ์ˆ˜
  • DFT ์‹ค์ œ ๊ตฌํ˜„ ๋ฐ ๊ฒ€์ฆ

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!