<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>young-0320.log</title>
        <link>https://velog.io/</link>
        <description>electronic engineering student</description>
        <lastBuildDate>Wed, 06 May 2026 04:43:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>young-0320.log</title>
            <url>https://velog.velcdn.com/images/young-0320/profile/e41a2585-780d-4c88-b2cc-05fa832d7407/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. young-0320.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/young-0320" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Zynq FIR IP 개발 #6]]]></title>
            <link>https://velog.io/@young-0320/Zynq-FIR-IP-%EA%B0%9C%EB%B0%9C-6</link>
            <guid>https://velog.io/@young-0320/Zynq-FIR-IP-%EA%B0%9C%EB%B0%9C-6</guid>
            <pubDate>Wed, 06 May 2026 04:43:33 GMT</pubDate>
            <description><![CDATA[<h1 id="zynq-구조-이해">Zynq 구조 이해</h1>
<pre><code>① PS(C코드): 멀티톤 신호 합성
       ↓
② PS: DDR에 입력 배열 저장
       ↓
③ DMA MM2S: DDR → AXI-Stream → FIR S_AXIS (입력)
       ↓
④ FIR IP: 필터링 + 데시메이션 (M=2)
       ↓
⑤ DMA S2MM: FIR M_AXIS → AXI-Stream → DDR (출력 배열 저장)
       ↓
⑥ PS(C코드): DDR에서 결과 읽기 → UART 출력</code></pre><p>DMA는 채널이 2개</p>
<ul>
<li><strong>MM2S</strong> (Memory-Mapped to Stream): DDR → FIR 방향</li>
<li><strong>S2MM</strong> (Stream to Memory-Mapped): FIR → DDR 방향</li>
</ul>
<h2 id="생성하려는-block-design">생성하려는 block design</h2>
<p><strong>bd_fir_dma</strong>: custom fir ip와 PS ip, DMA ip를 붙인 block design</p>
<pre><code>Block Design: bd_fir_dma
├── ZYNQ7 Processing System   ← IP 1
├── AXI DMA                   ← IP 2
└── fir_decimator_n43_axis    ← IP 3 (우리 것)</code></pre><table>
<thead>
<tr>
<th>#</th>
<th>IP 이름</th>
<th>출처</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td><strong>ZYNQ7 Processing System</strong></td>
<td>Xilinx 기본 제공</td>
<td>ARM 코어 + DDR + HP0 포트</td>
</tr>
<tr>
<td>2</td>
<td><strong>AXI Direct Memory Access</strong></td>
<td>Xilinx 기본 제공</td>
<td>DDR ↔ AXI-Stream 브리지</td>
</tr>
<tr>
<td>3</td>
<td><strong>fir_decimator_n43_axis</strong></td>
<td>우리가 만든 RTL</td>
<td>FIR 필터 + 데시메이터</td>
</tr>
</tbody></table>
<p>Vivado가 &quot;Run Connection Automation&quot; 시 <strong>자동으로 추가</strong>하는 IP 2개:</p>
<table>
<thead>
<tr>
<th>#</th>
<th>IP 이름</th>
<th>역할</th>
</tr>
</thead>
<tbody><tr>
<td>4</td>
<td><strong>Processor System Reset</strong></td>
<td>PS 리셋 신호 동기화</td>
</tr>
<tr>
<td>5</td>
<td><strong>AXI SmartConnect</strong></td>
<td>PS GP0 → DMA AXI-Lite 연결 중계</td>
</tr>
</tbody></table>
<h3 id="1-vivado-block-design-생성">1. Vivado Block Design 생성</h3>
<p>GUI에서 IP들을 배치하고 연결하는 것:</p>
<ul>
<li><strong>Zynq PS7 IP</strong> — ARM 코어, HP0 포트 활성화</li>
<li><strong>AXI DMA IP</strong>  — DDR ↔ AXI-Stream 브리지</li>
<li><strong>Custom FIR IP</strong> (<code>fir_decimator_n43_axis</code>) — 커스텀 IP로 패키징해서 삽입</li>
</ul>
<p>연결:</p>
<pre><code>AXI DMA MM2S → (AXI-Stream) → FIR S_AXIS (입력)
AXI DMA S2MM ← (AXI-Stream) ← FIR M_AXIS (출력)
AXI DMA ↔ PS7 HP0 (DDR 직접 접근)</code></pre><h3 id="2-비트스트림-생성--xsa-내보내기">2. 비트스트림 생성 + XSA 내보내기</h3>
<p>Block Design → Synthesize → Implement → Generate Bitstream → Export Hardware (.xsa)</p>
<h1 id="vivado-gui로-block-design-완성하기">Vivado GUI로 Block Design 완성하기</h1>
<p><strong>진행 순서</strong></p>
<ol>
<li>새 프로젝트 생성 (Board: Zybo Z7-20)</li>
<li>Create Block Design</li>
<li>IP 추가: ZYNQ7 Processing System</li>
<li>IP 추가: AXI DMA</li>
<li>IP 추가: 우리 FIR (커스텀 IP 패키징 먼저 필요)</li>
<li>Create HDL Wrapper</li>
<li>Generate Bitstream</li>
<li>Export Hardware</li>
</ol>
<h2 id="1-새-프로젝트-생성">1. 새 프로젝트 생성</h2>
<ol>
<li><code>Create Project</code> 클릭</li>
<li>Project name: <code>fir_decimator_trans_n43</code></li>
<li>Project location: <code>원하는 경로 설정</code>
<img src="https://velog.velcdn.com/images/young-0320/post/f3060ef3-f9ea-49e9-8a95-7b64c9d97bbc/image.png" alt=""></li>
<li>Project type: <strong>RTL Project</strong>
Sources 추가할 때 RTL 파일들 넣기:<ul>
<li><code>rtl/transposed_form/n43/fir_decimator_n43_axis.v</code> ← 최상위 top</li>
<li><code>rtl/transposed_form/decimator_m2_phase0.v</code></li>
<li><code>rtl/transposed_form/n43/fir_decimator_n43.v</code></li>
<li><code>rtl/transposed_form/n43/fir_n43.v</code>
<img src="https://velog.velcdn.com/images/young-0320/post/93723260-6fd7-4af4-a460-1679a96df54f/image.png" alt=""></li>
</ul>
</li>
<li>constraint file은 <strong>포함하지 말기!</strong> 나는 실수로 포함시킴
<img src="https://velog.velcdn.com/images/young-0320/post/0770b621-7540-4aef-96be-cc92bfe06ce1/image.png" alt=""></li>
<li>Default Part에서 Board 탭 → <code>Zybo Z7-20</code> 선택
<img src="https://velog.velcdn.com/images/young-0320/post/68c4bf8f-c22c-4304-a718-2503ebedfa75/image.png" alt=""></li>
<li>finish
<img src="https://velog.velcdn.com/images/young-0320/post/55e97e89-cc35-4713-81cf-bc3b90ee64be/image.png" alt=""></li>
</ol>
<h2 id="2-create-block-design">2. Create Block Design</h2>
<p>Module Reference 방식</p>
<p>Vivado 좌측 Flow Navigator에서:</p>
<ol>
<li><code>IP INTEGRATOR</code> → <code>Create Block Design</code> 클릭</li>
<li>Design name: <code>bd_fir_dma</code>
<img src="https://velog.velcdn.com/images/young-0320/post/7042f95e-34bf-4b07-b58c-2d5c70508d0a/image.png" alt=""></li>
</ol>
<h2 id="3-ip-추가-zynq7-processing-system">3. IP 추가: ZYNQ7 Processing System</h2>
<ol>
<li>캔버스 우클릭 → <code>Add IP</code> → 검색창에 <code>zynq</code> 입력 → <strong>ZYNQ7 Processing System</strong> 더블클릭
<img src="https://velog.velcdn.com/images/young-0320/post/d7636f1e-520b-4021-86d9-569fc338120e/image.png" alt="">
<img src="https://velog.velcdn.com/images/young-0320/post/e9bb2126-57c7-46c7-9d24-c6f1a74e378f/image.png" alt=""></li>
<li>PS 설정하기
블록 더블클릭 이후 수정할 두 가지 항목 확인</li>
</ol>
<p><strong>1. 포트 활성화</strong>
<code>PS-PL Configuration</code> → <code>HP Slave AXI Interface</code> → <code>S AXI HP0 Interface</code> 체크</p>
<ul>
<li><strong>HP0</strong>: PL(DMA)이 PS(CPU)의 DDR에 접근하는 유일한 경로, 기본 비활성화이므로 활성화 해주기</li>
</ul>
<p><img src="https://velog.velcdn.com/images/young-0320/post/50559e9a-9201-4721-8c42-c91ab31cce7d/image.png" alt=""></p>
<p><strong>2. 클럭 확인</strong>
<code>Clock Configuration</code> → <code>PL Fabric Clocks</code> → <code>FCLK_CLK0</code> 가 100MHz인지 확인
<img src="https://velog.velcdn.com/images/young-0320/post/b491bff6-1bca-4c31-b111-b14b24adca42/image.png" alt=""></p>
<h2 id="4-ip-추가-axi-dma">4. IP 추가: AXI DMA</h2>
<ol>
<li>캔버스 우클릭 → <code>Add IP</code> → 검색창에 <code>axi dma</code> 입력 → <strong>AXI Direct Memory Access</strong> 더블클릭
<img src="https://velog.velcdn.com/images/young-0320/post/0d9599ae-4214-4d0c-9b90-e26a139232c2/image.png" alt=""></li>
<li>DMA 설정하기</li>
</ol>
<p>블록 더블클릭 이후 확인/수정할 항목 확인
<img src="https://velog.velcdn.com/images/young-0320/post/b93257b9-3ff6-4301-8062-187f408b531e/image.png" alt=""></p>
<p><strong>상단</strong></p>
<table>
<thead>
<tr>
<th>항목</th>
<th>값</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Enable Scatter Gather Engine</td>
<td>해제 ✓</td>
<td>Simple DMA 모드. 디스크립터 체인 불필요</td>
</tr>
<tr>
<td>Enable Micro DMA</td>
<td>해제</td>
<td>기능 제한된 경량 DMA. 해당 없음</td>
</tr>
<tr>
<td>Enable Multi Channel Support</td>
<td>비활성</td>
<td>해당 없음</td>
</tr>
<tr>
<td>Enable Control/Status Stream</td>
<td>비활성</td>
<td>해당 없음</td>
</tr>
<tr>
<td>Width of Buffer Length Register</td>
<td>14 bits</td>
<td>최대 전송 크기 2¹⁴ = 16KB. 4117샘플 × 2bytes ≈ 8KB이므로 충분</td>
</tr>
<tr>
<td>Address Width</td>
<td>32 bits</td>
<td>Zynq-7000은 32비트 주소 체계. 맞음</td>
</tr>
</tbody></table>
<hr>
<p><strong>Read Channel (MM2S) — DDR → FIR 방향</strong></p>
<table>
<thead>
<tr>
<th>항목</th>
<th>값</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Number of Channels</td>
<td>1</td>
<td>채널 하나면 충분</td>
</tr>
<tr>
<td>Memory Map Data Width</td>
<td>32</td>
<td>DDR(HP0) 쪽 버스 폭. 32비트 표준</td>
</tr>
<tr>
<td>Stream Data Width</td>
<td><strong>16</strong> ✓</td>
<td>FIR s_axis_tdata 폭과 일치</td>
</tr>
<tr>
<td>Max Burst Size</td>
<td>16</td>
<td>DDR 읽기 시 한 번에 16 beat. 기본값으로 충분</td>
</tr>
<tr>
<td>Allow Unaligned Transfers</td>
<td>해제</td>
<td>16비트 샘플은 정렬 보장됨</td>
</tr>
</tbody></table>
<hr>
<p><strong>Write Channel (S2MM) — FIR → DDR 방향</strong></p>
<table>
<thead>
<tr>
<th>항목</th>
<th>값</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Number of Channels</td>
<td>1</td>
<td>채널 하나면 충분</td>
</tr>
<tr>
<td>Memory Map Data Width</td>
<td>32 (AUTO)</td>
<td>DDR 쪽 버스 폭. 동일</td>
</tr>
<tr>
<td>Stream Data Width</td>
<td><strong>16 (MANUAL)</strong> ✓</td>
<td>FIR m_axis_tdata 폭과 일치</td>
</tr>
<tr>
<td>Max Burst Size</td>
<td>16</td>
<td>DDR 쓰기 시 한 번에 16 beat</td>
</tr>
<tr>
<td>Allow Unaligned Transfers</td>
<td>해제</td>
<td>정렬 보장됨</td>
</tr>
</tbody></table>
<hr>
<p><strong>하단</strong></p>
<table>
<thead>
<tr>
<th>항목</th>
<th>값</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>Enable Single AXI4 Data Interface</td>
<td>AUTO/해제</td>
<td>MM2S와 S2MM이 DDR 포트를 각각 따로 씀. 동시 읽기+쓰기 가능</td>
</tr>
</tbody></table>
<hr>
<h2 id="5-ip-추가-custom-fir">5. IP 추가: Custom FIR</h2>
<ol>
<li><p>캔버스 우클릭 → <code>Add Module</code> → <code>fir_decimator_n43_axis</code> 선택 
<img src="https://velog.velcdn.com/images/young-0320/post/5452623f-56f1-4505-937b-57581035e509/image.png" alt=""></p>
</li>
<li><p>캔버스 상단 초록색 배너 <strong>&quot;Run Connection Automation&quot;</strong> 클릭 
<img src="https://velog.velcdn.com/images/young-0320/post/007a9bc4-1981-41f2-abb3-d4285e8754d4/image.png" alt=""></p>
</li>
<li><p>모든 항목 체크 : Vivado가 SmartConnect, Processor System Reset을 자동 생성하고 연결합니다
<img src="https://velog.velcdn.com/images/young-0320/post/0655d2a5-e315-4d6d-8421-d1fa89281707/image.png" alt=""></p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/young-0320/post/c81b3156-2a1e-40ae-b097-4ebac6bace7a/image.png" alt=""></p>
<h2 id="6-자동-생성된-ipaxi-interconnect">6. 자동 생성된 IP:AXI Interconnect</h2>
<p><strong>&quot;Run Connection Automation&quot;</strong>으로 자동 생성된 <strong>AXI Direct Memory Access</strong> 더블클릭</p>
<ul>
<li>Number of Slave Interfaces → 2
<img src="https://velog.velcdn.com/images/young-0320/post/ef36386d-6147-4cd9-9d8f-0be05838e72b/image.png" alt=""></li>
</ul>
<h2 id="7-fir-모듈-수동-연결">7. FIR 모듈 수동 연결</h2>
<p><strong>포트 연결 요약:</strong></p>
<pre><code>PS GP0 → SmartConnect → DMA S_AXI_LITE     (PS가 DMA 제어)
DMA M_AXI_MM2S → PS HP0                    (DMA가 DDR 읽기)
DMA M_AXI_S2MM → PS HP0                    (DMA가 DDR 쓰기)
DMA M_AXIS_MM2S → FIR S_AXIS               (DDR → FIR)
FIR M_AXIS → DMA S_AXIS_S2MM               (FIR → DDR)</code></pre><p><strong>첫 번째: aclk 연결</strong></p>
<p>FIR 블록의 <code>aclk</code> 포트 → PS 블록의 <code>FCLK_CLK0</code> 포트로 드래그
<img src="https://velog.velcdn.com/images/young-0320/post/cc2a9e22-bcba-4a71-9209-c04d69a00318/image.png" alt=""></p>
<p><strong>두 번째: aresetn 연결</strong></p>
<p>FIR 블록의 <code>aresetn</code> 포트 → <code>rst_ps7_0_100M</code> 블록의 <code>peripheral_aresetn</code> 포트로 드래그
<img src="https://velog.velcdn.com/images/young-0320/post/b6880fa9-7092-44b9-9655-1e48bbeb9c2f/image.png" alt=""></p>
<p><code>aresetn</code> : FIR IP의 active-low 리셋 포트</p>
<p><strong>세 번째: DMA → FIR 입력 연결</strong></p>
<p><code>axi_dma_0</code> 블록의 <code>M_AXIS_MM2S</code> 포트 → FIR 블록의 <code>s_axis</code> 포트로 드래그
<img src="https://velog.velcdn.com/images/young-0320/post/a4fb6562-783a-4222-8fa1-afd5fc1df810/image.png" alt=""></p>
<p><strong>네 번째: FIR → DMA 출력 연결</strong></p>
<p>FIR 블록의 <code>m_axis</code> 포트 → <code>axi_dma_0</code> 블록의 <code>S_AXIS_S2MM</code> 포트로 드래그</p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/799c8738-81a4-4abf-9239-4137d52bffc6/image.png" alt=""></p>
<p><strong>다섯 번째: Run Block Automation 클릭</strong>
상단 녹색 배너의 <code>Run Block Automation</code> 클릭
<img src="https://velog.velcdn.com/images/young-0320/post/97e9121d-cfd5-4fab-95da-347c8f8d975d/image.png" alt="">
<img src="https://velog.velcdn.com/images/young-0320/post/cd448049-0671-4716-9415-05374322e46d/image.png" alt=""></p>
<p>** 여섯 번째: 검증하기**
단축키 F6를 눌러 Validate Design 진행
<img src="https://velog.velcdn.com/images/young-0320/post/45f11d66-6cf1-4ec8-b68f-dc32d8bde602/image.png" alt="">
Digilent 보드 파일을 쓰는 Zybo 설계에서는 항상 뜨는 경고라고 합니다. 실제 DDR 동작에 문제 없다고 합니다.</p>
<h2 id="8-create-hdl-wrapper">8. Create HDL Wrapper</h2>
<p>Sources 탭에서 Block Design 파일(<code>bd_fir_dma</code>) 우클릭 → <code>Create HDL Wrapper</code> → <code>Let Vivado manage wrapper and auto-update</code> 선택
<img src="https://velog.velcdn.com/images/young-0320/post/ee1e0863-facb-4854-bb29-03275eddcde7/image.png" alt=""></p>
<h2 id="9-generate-bitstream">9. Generate Bitstream</h2>
<p><code>Synthesis</code> → <code>Implementation</code> → <code>Generate Bitstream</code></p>
<h3 id="error-1">error 1</h3>
<p>비트스트림 생성 실패</p>
<h3 id="error-1-해결">error 1 해결</h3>
<p>로그 첫 줄:<code>synth_design -top fir_decimator_n43_axis</code></p>
<p>두 가지 문제가 동시에 존재했다.</p>
<p><strong>문제 1: 합성 Top 모듈 오설정</strong></p>
<p>합성 Top 모듈이 <code>bd_fir_dma_wrapper</code>가 아닌 <code>fir_decimator_n43_axis</code>로 설정되어 있었다. 
이는 Block Design 생성 이전에 FIR IP 단독 검증을 위해 <code>fir_decimator_n43_axis</code>를 Top으로 설정해 두었던 상태가 그대로 남아 있었기 때문이다. Block Design Wrapper가 아닌 FIR 모듈 단독으로 합성을 시도하니 DMA, PS 등 나머지 연결이 전혀 없는 불완전한 설계가 합성 대상이 되었다.</p>
<p>→ Sources 패널에서 <code>bd_fir_dma_wrapper</code>를 우클릭 → Set as Top으로 변경</p>
<p><strong>문제 2: 불필요한 XDC 파일 활성화</strong></p>
<p>  로그에서 zybo_n43.xdc가 포함되어 있었다. 이 XDC 파일은 FIR IP를 단독으로 합성할 때 사용하던 핀 제약 파일로, fir_decimator_n43_axis의 포트를 물리 핀에 직접 매핑하는 내용이 담겨
  있었다. Block Design 기반 설계에서는 FIR 포트가 내부적으로 DMA에 연결되므로 물리 핀 매핑이 필요 없는데, 이 XDC가 여전히 활성화되어 있어 잘못된 핀 제약이 적용되고 있었다.</p>
<p>  → Sources 패널 → Constraints 폴더 → zybo_n43.xdc 우클릭 → Disable File</p>
<p>  두 문제를 모두 수정한 뒤 다시 시도했다.</p>
<h2 id="9-1-generate-bitstream-다시-시도">9-1. Generate Bitstream 다시 시도</h2>
<p><strong>드디어 성공</strong> 
<img src="https://velog.velcdn.com/images/young-0320/post/9665c300-6295-4ebe-80f3-c44312d5422d/image.png" alt=""></p>
<p><code>IMPLEMENTATION</code> → <code>Open Implemented Design</code> → <code>Report Timing Summary</code>
<img src="https://velog.velcdn.com/images/young-0320/post/b4e602d7-7fa9-44ef-b7fb-0c55e0c0e740/image.png" alt=""></p>
<ul>
<li>WNS = +1.332ns — Step 4의 +0.278ns보다 오히려 더 여유가 생겼음</li>
<li>TNS = 0.000ns (타이밍 위반 없음)</li>
<li>Failing Endpoints = 0</li>
</ul>
<h2 id="10-export-hardware">10. Export Hardware</h2>
<p><code>File</code> → <code>Export</code> → <code>Export Hardware</code> → <code>Include bitstream</code> 체크
지정한 디렉토리에 xsa 파일을 export하는 과정입니다.
<strong>XSA</strong> (Xilinx Support Archive):
Vivado가 만드는 하드웨어 설명 패키지 파일
<img src="https://velog.velcdn.com/images/young-0320/post/b51a79c1-2e56-4b31-8f9d-38e5e6eb5424/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/3c459df6-64f7-45b7-82aa-3c2d522fa0ba/image.png" alt=""></p>
<h2 id="11-tcl-스크립트-추출">11. TCL 스크립트 추출</h2>
<p>Block Design은 Vivado 프로젝트 파일(.xpr) 안에만 존재합니다. 프로젝트가 유실되거나 다른 환경에서 재현해야 할 때를 대비해 <code>write_bd_tcl</code>로 Block Design 전체를 TCL 파일로 추출해 레포에 보관합니다.</p>
<h3 id="추출-명령어">추출 명령어</h3>
<p>Block Design이 열린 상태에서 Vivado TCL Console에서 실행:</p>
<pre><code>write_bd_tcl -force /home/young/dev/10_zynq-fir-decimation-ip/vivado/bd_fir_dma.tcl</code></pre><p>추출 결과: <code>/home/young/dev/10_zynq-fir-decimation-ip/vivado</code> 디렉토리안에 <code>bd_fir_dma.tcl</code> 스크립트 저장</p>
<h3 id="포함-내용">포함 내용</h3>
<p><code>write_bd_tcl</code>이 추출하는 정보:</p>
<ul>
<li>모든 IP 정보 (버전 포함: <code>processing_system7:5.5</code>, <code>axi_dma:7.1</code> 등)</li>
<li>IP 파라미터 설정 전체 (stream width=16 등)</li>
<li>모든 배선 연결 (AXI, AXI-Stream, 클럭, 리셋)</li>
<li>주소 할당 (<code>assign_bd_address</code>)</li>
<li>마지막에 <code>validate_bd_design</code> 자동 호출</li>
</ul>
<h3 id="재현-방법">재현 방법</h3>
<p>다른 머신에서 Block Design을 재현하려면:</p>
<ol>
<li>Vivado 2024.2 + Zybo Z7-20 보드 파일 설치</li>
<li>RTL 소스 4개가 포함된 Vivado 프로젝트 생성 (1 참고)</li>
<li>Vivado TCL Console에서:</li>
</ol>
<pre><code class="language-tcl">source vivado/bd_fir_dma.tcl</code></pre>
<p>RTL 소스 없이 sourcing하면 <code>fir_decimator_n43_axis</code> 모듈을 찾지 못해 실패한다.</p>
<h2 id="error-정리">error 정리</h2>
<p>** 합성 Top 오설정 + XDC 충돌** — 합성 Top이 <code>bd_fir_dma_wrapper</code>가 아닌 <code>fir_decimator_n43_axis</code>로 남아 있었고, 단독 합성용 <code>zybo_n43.xdc</code>가 활성화되어 잘못된 핀 제약이 적용됨 → Top 모듈 변경 및 XDC 비활성화</p>
<h2 id="마무리하며">마무리하며</h2>
<p>Validate Design 성공과 비트스트림 생성 성공은 다르다는 걸 이번 작업에서 체감했습니다. Vivado가 &quot;연결에 문제없다&quot;고 판정해도, 합성 Top이 잘못 설정되어 있거나 프로젝트 초기에 넣어둔 XDC 파일이 남아있으면 비트스트림 단계에서 막힙니다. 에러 메세지를 읽고 원인을 역추적하는 과정이 번거롭긴 했지만, 덕분에 Block Design의 외부 포트 개념과 Vivado 프로젝트 상태 관리 방식을 제대로 이해하게 됐습니다. 다음 단계는 생성된 .xsa를 Vitis에서 열어 DMA를 제어하는 C 코드를 작성하는 것입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RTL log #3 : Vivado IP 사용하기 - Clocking Wizard, Block Memory Generator, ILA]]></title>
            <link>https://velog.io/@young-0320/RTL-log-3-Vivado-IP-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-Clocking-Wizard-Block-Memory-Generator</link>
            <guid>https://velog.io/@young-0320/RTL-log-3-Vivado-IP-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-Clocking-Wizard-Block-Memory-Generator</guid>
            <pubDate>Sat, 04 Apr 2026 14:18:44 GMT</pubDate>
            <description><![CDATA[<p>이번 글에서는 Zybo Z7-20 보드에서 자주 사용하게 되는 <code>Clocking Wizard</code>, <code>Block Memory Generator</code>, <code>ILA</code> IP를 정리해보겠습니다. 각 IP가 어떤 역할을 하는지, 설정 창에서 어떤 옵션을 주로 보면 되는지, 그리고 실습에서는 어떤 값을 바꾸면 되는지를 중심으로 설명하겠습니다.</p>
<h2 id="clocking-wizard-ip">Clocking Wizard IP</h2>
<p>먼저 <code>clk_wiz</code>는 Vivado의 <code>Clocking Wizard</code> IP로, Zybo Z7-20 보드에서 들어오는 125 MHz 기준 클럭을 원하는 주파수의 클럭으로 변환할 때 사용하는 블록입니다.</p>
<h3 id="1-clocking-wizard-선택">1. Clocking Wizard 선택</h3>
<ol>
<li><p>IP Catalog 열기<br><img src="https://velog.velcdn.com/images/young-0320/post/22003e58-b835-442e-9366-f1e2b379b979/image.png" alt=""></p>
</li>
<li><p><code>Clocking Wizard</code> 검색</p>
</li>
<li><p>더블클릭해서 추가<br><img src="https://velog.velcdn.com/images/young-0320/post/242eb8f5-707e-4910-b362-8ff94f41202f/image.png" alt=""></p>
</li>
</ol>
<h3 id="2-clocking-options-탭">2. Clocking Options 탭</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/3bdfbbf3-51eb-4416-9101-f26ad453ad29/image.png" alt=""></p>
<ul>
<li><p><code>Clock Monitor</code></p>
<ul>
<li>입력 클럭 이상을 감시하는 기능입니다.</li>
</ul>
</li>
<li><p><code>Primitive</code></p>
<ul>
<li><code>MMCM (Mixed-Mode Clock Manager)</code><ul>
<li>PLL 기능에 더해 위상 이동, Duty 조절, 다중 출력 제어 등 더 다양한 클럭 제어 기능을 제공합니다.</li>
</ul>
</li>
<li><code>PLL (Phase-Locked Loop)</code><ul>
<li>입력 클럭에 위상과 주파수를 맞춰 다른 주파수의 안정적인 클럭을 만들어내는 회로입니다.</li>
<li>단순한 클럭 배수/분주 용도에 적합하며 설정도 비교적 단순합니다.</li>
</ul>
</li>
</ul>
</li>
<li><p><code>Clocking Features</code></p>
<ul>
<li><code>Frequency Synthesis</code><ul>
<li>주파수 변환 기능입니다.</li>
<li>원하는 출력 클럭을 만들 때 사용합니다.</li>
</ul>
</li>
<li><code>Minimize Power</code><ul>
<li>전력 절약 위주 설정입니다.</li>
<li>보통은 체크하지 않아도 됩니다.</li>
</ul>
</li>
<li><code>Phase Alignment</code><ul>
<li>위상 정렬 관련 기능입니다.</li>
<li>일반적인 실습에서는 기본값으로 두어도 무방합니다.</li>
</ul>
</li>
<li><code>Dynamic Reconfig</code><ul>
<li>동작 중 클럭 설정을 바꾸는 기능입니다.</li>
</ul>
</li>
<li><code>Safe Clock Startup</code><ul>
<li>클럭이 안정적으로 시작되도록 돕는 옵션입니다.</li>
</ul>
</li>
</ul>
</li>
<li><p><code>Jitter Optimization</code></p>
<ul>
<li><code>Balanced</code><ul>
<li>기본 권장 옵션입니다.</li>
</ul>
</li>
<li><code>Minimize Output Jitter</code><ul>
<li>출력 지터를 최소화하는 쪽으로 최적화합니다.</li>
</ul>
</li>
<li><code>Maximize Input Jitter Filtering</code><ul>
<li>입력 지터를 더 강하게 필터링합니다.</li>
</ul>
</li>
</ul>
</li>
<li><p><code>Dynamic Reconfig Interface Options</code></p>
<ul>
<li>AXI나 DRP를 통한 런타임 재설정 기능입니다.</li>
</ul>
</li>
<li><p><code>Input Clock Information</code></p>
<ul>
<li><code>Primary</code>의 <code>Input Frequency (MHz)</code>는 <code>clk_in1</code>에 들어오는 입력 클럭 주파수입니다.</li>
<li>Zybo Z7-20 기준으로 125MHz에 맞춰 설정하면 됩니다.</li>
<li><code>Secondary</code>는 보조 입력 클럭을 쓰지 않으면 체크하지 않아도 됩니다.</li>
<li><code>Port Name</code>은 기본값인 <code>clk_in1</code>을 그대로 사용해도 됩니다.</li>
<li><code>Input Jitter</code>는 특별한 이유가 없다면 기본값을 사용합니다.</li>
</ul>
</li>
</ul>
<h3 id="3-output-clocks-탭">3. Output Clocks 탭</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/879e1627-83b7-4ed8-85c2-44a04323d23a/image.png" alt=""><br><img src="https://velog.velcdn.com/images/young-0320/post/203edc9f-a4af-4a0c-ba7e-06470a28d586/image.png" alt=""></p>
<ul>
<li><code>Output Freq (MHz)</code>의 <code>Requested</code> 값을 원하는 출력 주파수로 변경합니다.</li>
<li><code>Phase (degrees)</code>, <code>Duty Cycle (%)</code>, <code>power_down</code> 등은 위상 조정, 펄스 폭 조정, 고급 피드백, 저전력 제어와 관련된 고급 기능입니다.</li>
<li>일반적인 실습에서는 기본값으로 두고 주파수만 바꿔도 충분합니다.</li>
</ul>
<h3 id="4-plle2-settings-탭">4. PLLE2 Settings 탭</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/1856ab2e-2acc-4085-9da9-08c4d83c5445/image.png" alt=""></p>
<p>이 탭은 Vivado가 계산한 PLL 내부 파라미터를 요약해서 보여주는 화면입니다.</p>
<ul>
<li><p><code>CLKIN1_PERIOD = 8.000</code></p>
<ul>
<li>입력 클럭 주기가 8ns라는 뜻이며, 주파수로는 125MHz입니다.</li>
</ul>
</li>
<li><p><code>CLKFBOUT_MULT = 7</code></p>
<ul>
<li>입력 클럭을 내부 VCO 기준으로 7배 올리는 설정입니다.</li>
<li>내부 VCO 주파수 계산에 사용됩니다.</li>
</ul>
</li>
<li><p><code>DIVCLK_DIVIDE = 1</code></p>
<ul>
<li>입력 쪽 추가 분주가 없다는 뜻입니다.</li>
</ul>
</li>
<li><p><code>clk_out1</code></p>
<ul>
<li><code>Divide = 125</code></li>
<li><code>Duty Cycle = 0.500</code></li>
<li><code>Phase = 0.000</code></li>
</ul>
</li>
</ul>
<p>즉, 입력 125MHz를 내부에서 7배한 뒤 125로 나누므로 최종 출력은 7MHz가 됩니다.</p>
<h3 id="5-generate">5. Generate</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/a6909b02-b303-414c-b654-d822a019b725/image.png" alt=""><br><img src="https://velog.velcdn.com/images/young-0320/post/d6530f27-7415-4f45-92bc-26efe902fcc3/image.png" alt=""></p>
<p>설정을 마쳤다면 <code>Generate</code>를 눌러 IP를 생성하면 됩니다.</p>
<hr>
<h2 id="block-memory-generator-ip">Block Memory Generator IP</h2>
<p><code>Block Memory Generator</code>는 FPGA 내부의 BRAM(Block RAM)을 손쉽게 RAM이나 ROM 형태로 구성할 수 있게 해주는 IP입니다. 간단한 데이터 저장, 계수 테이블 저장, LUT 대체 용도 등에서 자주 사용합니다.</p>
<h3 id="1-block-memory-generator-선택">1. Block Memory Generator 선택</h3>
<ol>
<li><p>IP Catalog 열기</p>
</li>
<li><p><code>Block Memory Generator</code> 검색</p>
</li>
<li><p>더블클릭해서 추가<br><img src="https://velog.velcdn.com/images/young-0320/post/122778c0-c4c3-43c7-8410-02f951b26d0b/image.png" alt=""></p>
</li>
</ol>
<h3 id="2-basic-탭">2. Basic 탭</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/2e6258d3-dd0d-4f16-97d4-44f198185f5e/image.png" alt=""></p>
<p>특별히 바꿔야 하는 옵션이 없다면 기본값을 사용해도 됩니다.</p>
<h3 id="3-port-a-options-탭">3. Port A Options 탭</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/88d0d73c-8863-49fa-9be5-b679dc35c5c8/image.png" alt=""></p>
<p><strong>현재 화면의 의미</strong></p>
<ol>
<li>한 주소에 저장되는 데이터 폭이 8비트입니다.</li>
<li>8비트 데이터를 8개 주소까지 저장할 수 있습니다.</li>
<li>BRAM은 <code>Always Enabled</code> 상태로 두고 주소와 write enable로 제어합니다.</li>
<li>출력 레지스터는 사용하지 않습니다.</li>
</ol>
<ul>
<li><p><code>Memory Size</code></p>
<ul>
<li><code>Write Width</code><ul>
<li>한 번 쓸 때 사용하는 데이터 폭입니다.</li>
<li>값이 8이면 한 주소에 8비트를 씁니다.</li>
</ul>
</li>
<li><code>Read Width</code><ul>
<li>한 번 읽을 때 사용하는 데이터 폭입니다.</li>
<li>값이 8이면 한 주소에서 8비트를 읽습니다.</li>
</ul>
</li>
<li><code>Write Depth</code><ul>
<li>몇 개 주소에 데이터를 쓸 수 있는지입니다.</li>
<li>값이 8이면 8개의 주소를 사용할 수 있습니다.</li>
</ul>
</li>
<li><code>Read Depth</code><ul>
<li>몇 개 주소에서 데이터를 읽을 수 있는지입니다.</li>
<li>보통 <code>Write Depth</code>와 동일하게 설정합니다.</li>
</ul>
</li>
</ul>
</li>
<li><p><code>Enable Port Type</code></p>
<ul>
<li><code>Use ENA Pin</code><ul>
<li>BRAM에 <code>ena</code> 포트가 추가됩니다.</li>
<li><code>ena = 1</code>일 때만 해당 클럭에서 읽기/쓰기 동작을 수행합니다.</li>
</ul>
</li>
<li><code>Always Enabled</code><ul>
<li>BRAM이 항상 활성화된 상태입니다.</li>
<li>주소를 넣으면 읽고, <code>we = 1</code>이면 해당 주소에 데이터를 씁니다.</li>
</ul>
</li>
</ul>
</li>
<li><p><code>Port A Optional Output Registers</code></p>
<ul>
<li><code>Primitives Output Register</code><ul>
<li>BRAM 내부 출력에 레지스터를 하나 추가합니다.</li>
<li>타이밍은 더 좋아질 수 있지만 읽기 지연이 1클럭 늘어날 수 있습니다.</li>
</ul>
</li>
<li><code>Core Output Register</code><ul>
<li>BRAM 바깥에 출력 레지스터를 하나 더 추가합니다.</li>
<li>이 경우에도 출력 지연이 늘어날 수 있습니다.</li>
</ul>
</li>
<li><code>SoftECC Input Register</code><ul>
<li>ECC를 사용할 때 관련되는 옵션입니다.</li>
<li>이번 설정처럼 <code>No ECC</code>라면 크게 신경 쓰지 않아도 됩니다.</li>
</ul>
</li>
<li><code>REGCEA Pin</code><ul>
<li>출력 레지스터의 clock enable 핀입니다.</li>
<li>출력 레지스터를 사용할 때 의미가 있습니다.</li>
</ul>
</li>
</ul>
</li>
<li><p><code>Port A Output Reset Options</code></p>
<ul>
<li><code>RSTA Pin</code><ul>
<li>BRAM 출력 레지스터에 reset 핀을 추가합니다.</li>
</ul>
</li>
<li><code>Output Reset Value (Hex)</code><ul>
<li>reset 시 출력값을 지정합니다.</li>
</ul>
</li>
<li><code>Reset Memory Latch</code><ul>
<li>출력 래치나 레지스터 reset과 관련된 옵션입니다.</li>
</ul>
</li>
<li><code>Reset Priority</code><ul>
<li>reset과 CE가 동시에 들어왔을 때 어떤 신호를 우선할지 정하는 옵션입니다.</li>
</ul>
</li>
</ul>
</li>
<li><p><code>READ Address Change A</code></p>
<ul>
<li>읽기 주소가 바뀔 때 출력 동작과 관련된 고급 옵션입니다.</li>
<li>일반적인 단순 BRAM 사용에서는 기본값을 유지해도 됩니다.</li>
</ul>
</li>
</ul>
<h3 id="4-generate">4. Generate</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/c9849b29-b497-4742-ae56-3302fb81a48b/image.png" alt=""></p>
<p>설정을 마쳤다면 <code>Generate</code>를 눌러 IP를 생성하면 됩니다.</p>
<hr>
<h2 id="ila-ip">ILA IP</h2>
<p><code>ILA (Integrated Logic Analyzer)</code>는 FPGA 내부 신호를 실시간으로 관찰할 수 있게 해주는 디버깅용 IP입니다. 시뮬레이션에서는 보이지 않는 실제 보드 동작을 확인할 때 매우 유용합니다.</p>
<h3 id="1-ila-선택">1. ILA 선택</h3>
<ol>
<li><p>IP Catalog 열기</p>
</li>
<li><p><code>ILA</code> 검색</p>
</li>
<li><p>더블클릭해서 추가<br><img src="https://velog.velcdn.com/images/young-0320/post/b4ca6cbe-ab21-4a38-8ed5-4c21d7a16b17/image.png" alt=""></p>
</li>
</ol>
<h3 id="2-general-options">2. General Options</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/bbe6dfaf-a7aa-4a5d-85d1-d4812e3772e3/image.png" alt=""></p>
<ul>
<li><p><code>Monitor Type</code></p>
<ul>
<li><code>Native</code><ul>
<li>일반 RTL 신호를 직접 관찰하는 모드입니다.</li>
</ul>
</li>
<li><code>AXI</code><ul>
<li>AXI 버스를 분석할 때 사용하는 전용 모드입니다.</li>
</ul>
</li>
</ul>
</li>
<li><p><code>Number of Probes</code></p>
<ul>
<li>ILA에 몇 개의 probe 포트를 둘지 정하는 옵션입니다.</li>
</ul>
</li>
<li><p><code>Sample Data Depth</code></p>
<ul>
<li>파형을 몇 샘플까지 저장할지 정하는 값입니다.</li>
<li>숫자가 클수록 더 긴 구간을 볼 수 있지만 FPGA 자원을 더 사용합니다.</li>
<li><code>1024</code> 정도의 기본값이면 보통 충분합니다.</li>
</ul>
</li>
<li><p><code>Same Number of Comparators for All Probe Ports</code></p>
<ul>
<li>모든 probe 포트에 같은 수의 trigger comparator를 적용할지 정하는 옵션입니다.</li>
<li>보통 체크한 상태로 둡니다.</li>
<li>comparator는 probe 값이 설정한 조건을 만족하는지 비교하는 장치입니다.</li>
</ul>
</li>
<li><p><code>Number of Comparators</code></p>
<ul>
<li>각 probe 포트에 comparator를 몇 개 둘지 정하는 값입니다.</li>
</ul>
</li>
<li><p><code>Trigger Out Port</code></p>
<ul>
<li>ILA가 트리거를 발생시켰을 때 외부로 신호를 내보내는 기능입니다.</li>
<li>여러 디버그 IP를 연동할 때 사용합니다.</li>
</ul>
</li>
<li><p><code>Trigger In Port</code></p>
<ul>
<li>외부 신호를 받아 ILA 캡처를 시작하게 하는 기능입니다.</li>
<li>고급 디버깅에서 사용합니다.</li>
</ul>
</li>
<li><p><code>Input Pipe Stages</code></p>
<ul>
<li>ILA 입력 앞에 파이프라인 레지스터를 몇 단계 둘지 설정하는 기능입니다.</li>
</ul>
</li>
<li><p><code>Trigger and Storage Settings</code></p>
<ul>
<li><code>Capture Control</code><ul>
<li>언제부터, 어떤 방식으로 저장할지 세밀하게 제어하는 옵션입니다.</li>
</ul>
</li>
<li><code>Advanced Trigger</code><ul>
<li>복잡한 조건식으로 트리거를 걸 수 있는 기능입니다.</li>
<li>예를 들어 특정 값이 나온 뒤 다른 값이 이어질 때만 캡처하도록 설정할 수 있습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="3-probe-ports01">3. Probe Ports(0..1)</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/0ff8b252-992a-4cc4-8d72-341cb3ee53d5/image.png" alt=""></p>
<ul>
<li><code>Probe Width</code><ul>
<li>각 probe에 연결할 신호의 비트폭을 결정하는 화면입니다.</li>
</ul>
</li>
</ul>
<p>현재 화면에서는 다음과 같이 설정되어 있습니다.
<code>probe0</code> : 40비트 신호 연결 가능
<code>probe1</code> : 1비트 신호 연결 가능</p>
<ul>
<li><code>Probe Trigger or Data</code><ul>
<li>DATA AND TRIGGER<ul>
<li>파형 데이터로도 보고 트리거 조건에도 쓸 수 있음<ul>
<li>DATA</li>
</ul>
</li>
<li>파형으로는 볼 수 있고 트리거 조건으로는 못 씀<ul>
<li>TRIGGER</li>
</ul>
</li>
<li>트리거 조건으로만 쓰고 파형 데이터로는 못 봄</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="4-generate-1">4. Generate</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/1f86295a-ecde-4da6-bca0-7a889fa3147f/image.png" alt=""></p>
<p>설정을 마쳤다면 <code>Generate</code>를 눌러 ILA IP를 생성하면 됩니다.</p>
<h2 id="마무리하며">마무리하며</h2>
<p>이번 글에서는 Zybo Z7-20 보드에서 자주 사용하게 되는 <code>Clocking Wizard</code>, <code>Block Memory Generator</code>, <code>ILA</code> IP를 정리하였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RTL log #2 : 64-bit adder — Vivado 실습]]></title>
            <link>https://velog.io/@young-0320/RTL-log-2-64-bit-adder-Vivado-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@young-0320/RTL-log-2-64-bit-adder-Vivado-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Wed, 25 Feb 2026 02:32:41 GMT</pubDate>
            <description><![CDATA[<p>이번 글에서는 Vivado에서 64-bit Binary Adder(RCA) RTL 프로젝트를 합성(Synthesis)하는 과정을 정리했습니다.</p>
<h2 id="1-프로젝트-종류-선택">1. 프로젝트 종류 선택</h2>
<p><img src="https://velog.velcdn.com/images/young-0320/post/1a75ee16-b32c-4244-b923-579f499a4e08/image.png" alt=""></p>
<p>64-bit adder RTL 합성에서는 보통 RTL Project 선택을 합니다.</p>
<p>**  1. RTL Project**</p>
<ul>
<li>가장 일반적인 HDL 설계용.</li>
<li>Verilog/VHDL 소스 추가, 합성, 구현, 타이밍 분석까지 가능</li>
</ul>
<p>추가 체크박스( RTL Project 아래 ):</p>
<ul>
<li>Do not specify sources at this time: 지금은 소스 안 넣고 빈 프로젝트만 생
성.</li>
<li>Project is an extensible Vitis platform: Vitis 플랫폼 개발용(일반 RTL 합성
에서는 보통 체크 안 함).</li>
</ul>
<p>**  2. Post-synthesis Project**</p>
<ul>
<li>RTL이 아니라 이미 합성된 결과물(netlist/DCP) 기준으로 여는 프로젝트</li>
<li>디바이스 리소스/배치/타이밍 분석 용도</li>
<li>보통 초반 설계 단계에서는 잘 안 씀</li>
</ul>
<p>**  3. I/O Planning Project**</p>
<ul>
<li>소스 없이 핀맵/패키지(I/O) 계획만 먼저 할 때 사용</li>
<li>XDC 핀 배치 준비 용도</li>
</ul>
<p>**  4. Imported Project**</p>
<ul>
<li>Synplify 같은 외부 툴 프로젝트를 Vivado로 가져올 때 사용</li>
<li>일반 RTL 직접 작성 과제에서는 거의 안 씀</li>
</ul>
<p>**  5. Example Project**</p>
<ul>
<li>Vivado 예제 템플릿으로 시작</li>
<li>학습용/샘플 확인용</li>
</ul>
<h2 id="2-프로젝트-소스-등록">2. 프로젝트 소스 등록</h2>
<p>이미 rtl 설계 파일이 있으니 Add Files을 눌러 파일(*.v)을 추가합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/cf06c986-c7ff-4f65-bf4b-b822b3f2aee5/image.png" alt="">
물리/타이밍 제약 사항을 넣는 페이지입니다. Next 눌러줍니다.
<img src="https://velog.velcdn.com/images/young-0320/post/3b41c056-bd7b-40bf-a3d9-6a540c15877c/image.png" alt=""></p>
<h2 id="3-보드-선택">3. 보드 선택</h2>
<p>가장 많이 이용하는 Basys3 보드를 선택했습니다. Finish 눌러줍니다.
<img src="https://velog.velcdn.com/images/young-0320/post/fb27add1-6a9f-46c9-8e12-b60e0ad23d51/image.png" alt=""></p>
<h2 id="4-run-synthesis">4. Run Synthesis</h2>
<p>합성할 모듈이 Top 모듈인지 확인하고 좌측에서 Run Synthesis를 눌러줍니다.
<img src="https://velog.velcdn.com/images/young-0320/post/0b81fff6-ee26-426a-b4ec-f1b57a9d0381/image.png" alt="">
XDC(제약 사항)가 없는 합성이었기에 Open Synthesized Design을 선택합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/7193900e-fc2e-45bd-aa96-d53b102fd87d/image.png" alt=""></p>
<h2 id="5-결과-확인">5. 결과 확인</h2>
<h3 id="1-로그-확인">1. 로그 확인</h3>
<p><code>24 Infos, 1 Warnings, 0 Critical Warnings and 0 Errors encountered.</code></p>
<p><code>synth_design completed successfully</code> </p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/0e5ac842-3868-48a3-8c7d-f5f8192b095a/image.png" alt=""></p>
<h3 id="2-report-utilization으로-사용-lutiob-확인">2. Report Utilization으로 사용 LUT/IOB 확인</h3>
<p>LUT: 108/20800
IOB: 193/ 106 (Top 포트가 a(64)+b(64)+sum(64)+c_out(1)=193비트라 Basys3 가용 I/O(106)를 초과합니다.)
<img src="https://velog.velcdn.com/images/young-0320/post/2446013e-a9a4-4112-bedf-e1a168a91804/image.png" alt=""></p>
<h3 id="3-open-elaborated-design-----확인">3. Open Elaborated Design     확인</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/18da32d2-888e-43d8-9d36-43379d39335e/image.png" alt="">
rca_32bit 모듈 두 개를 사용하여 계층적으로 모델링 된 것과 입출력 포트가 제대로 합성된 것을 확인할 수 있습니다.</p>
<h3 id="4-device-view-확인">4. Device View 확인</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/9490fcab-cc9d-4665-a40b-2d1d129de455/image.png" alt=""></p>
<ol>
<li><code>[Run Synthesis]</code> 버튼을 눌러 실제 합성을 진행합니다.</li>
<li><code>Open Synthesized Design</code>를 눌러 합성된 결과물을 확인합니다.</li>
</ol>
<p>중앙의 흰 사각형/분홍 점 : 현재 배치된 셀, 즉 합성 결과물이 올라간 위치</p>
<p><strong>상태 해석:</strong>
중앙에 배치된 셀이 매우 적고(흰 사각형 몇 개) 대부분의 칩 면적이 비어 있습니다. 이는 64비트 가산기 회로가 LUT 사용량이 낮아 칩의 극히 일부만 점유하고 있다는 것을 시각적으로 보여줍니다. I/O가 193비트로 핀 수를 초과했기 때문에 IOB 쪽에는 제대로 매핑이 되지 않은 상태로 보입니다.</p>
<h3 id="5-데이터-패스-지연-시간-확인">5. 데이터 패스 지연 시간 확인</h3>
<ol>
<li>Tcl console 창에 <code>report_timing -from [get_ports a[*]] -to [get_ports sum[*]] -setup</code> 해당 명령어를 입력합니다.</li>
<li>해당 명령어는 Netlist을 그래프로 인식하고, 지정된 시작점($a$)에서 끝점($sum$)까지의 모든 경로 중 가장 느린 최악의 경로를 찾아 지연 시간을 합산합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/ca004e8a-98ac-4afe-8f1e-8ad20ed5e3cd/image.png" alt="">
최악의 경로</li>
</ol>
<ul>
<li>시작점 : a[2]</li>
<li>끝점 : sum[61]</li>
<li>Data Path Delay : 19.706ns(logic delay 6.708ns, route delay 12.998ns)</li>
<li>Logic Levels : 28 (신호가 통과한 소자의 개수)</li>
<li>최대 주파수 : $1 / 19.706ns \approx 50.74MHz$</li>
</ul>
<p><strong>결론 :</strong> 
Half adder에서부터 RCA 64-bit adder까지의 계층적 구조적 한계, 즉 Ripple Carry 구조에서는 carry가 LSB에서 MSB 방향으로 직렬 전파되기 때문에 비트 수에 비례해 critical path가 길어지는 문제로 인해 net delay가 19.706ns 중 12.998ns를 차지할 만큼 배선 지연이 압도적으로 커졌습니다. 이로 인해 최대 동작 주파수가 약 50.74MHz에 그쳐 고속 설계 요구사항을 만족하기 어려우므로 하드웨어적 보완이 필요합니다.</p>
<p><strong>해결 :</strong> </p>
<ul>
<li>게이트 레벨 모델링 대신 데이터 플로우 모델링(assign 할당문)으로 재합성하여, 합성 툴이 carry look-ahead 등 최적화된 내부 구조를 자동으로 선택할 수 있도록 한다.</li>
<li>carry chain의 중간에 pipeline register를 삽입해 critical path를 절반으로 단축한다.</li>
</ul>
<h2 id="마무리하며">마무리하며</h2>
<p>합성은 에러 없이 완료되었고, LUT 사용량도 낮은 수준으로 확인되었습니다. 다만 Top I/O가 193비트로 Basys3의 가용 I/O(106핀)를 초과하여 그대로 구현하기는 어려운 상황이며, 실제 FPGA에 올리려면 I/O 수를 줄이는 설계 수정이 선행되어야 합니다. 또한 이번 실습에서는 XDC 제약을 적용하지 않았기 때문에 타이밍 리포트는 참고 수준으로만 해석하였습니다.</p>
<p>다음 실습에서는 XDC 제약을 적용하여 실제 타이밍 에러를 직접 확인하고 디버깅하는 과정을 진행할 예정입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #16 : Vivado 설치 가이드]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-16-Vivado-%EC%84%A4%EC%B9%98-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-16-Vivado-%EC%84%A4%EC%B9%98-%EA%B0%80%EC%9D%B4%EB%93%9C</guid>
            <pubDate>Tue, 24 Feb 2026 15:32:18 GMT</pubDate>
            <description><![CDATA[<p>Vivado 설치 과정을 단계별로 정리했습니다.</p>
<h2 id="설치-전-os-버전-확인">설치 전 OS 버전 확인</h2>
<p><img src="https://velog.velcdn.com/images/young-0320/post/b9d0a400-d108-4110-be82-d5e2204fc457/image.png" alt="">
fastfetch 프로그램으로 확인했을 때 OS 버전은 Ubuntu 24.04.4 LTS x86_64입니다.</p>
<h2 id="1-amd-회원가입-및-로그인">1. AMD 회원가입 및 로그인</h2>
<h2 id="2-20242-버전-설치">2. 2024.2 버전 설치</h2>
<p>AMD 공식 다운로드 페이지에 접속해 2024.2 버전을 선택합니다. <a href="https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/2024-2.html">https://www.xilinx.com/support/download/index.html/content/xilinx/en/downloadNav/vivado-design-tools/2024-2.html</a>
<img src="https://velog.velcdn.com/images/young-0320/post/8fa0b2c0-35af-412b-915c-21a50c499653/image.png" alt="">
스크롤을 내려 Linux용 설치 파일을 선택합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/879feb51-52d2-4006-b1a6-e7fff62e98a7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/36c2ed65-b8cd-43a1-8811-2150da1f022e/image.png" alt=""></p>
<h2 id="3-무결성-확인">3. 무결성 확인</h2>
<p>해당 파일이 있는 디렉토리로 이동 후 아래의 명령어를 입력해 파일의 해시값을 추출합니다.</p>
<pre><code>md5sum FPGAs_AdaptiveSoCs_Unified_2024.2_1113_2356_Lin64.bin</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/bf45b228-d6b9-40ce-b838-7c3ce8620d2d/image.png" alt=""></p>
<pre><code># 32자리의 16진수 값 출력
6be7a694bc631e02862e173f94165f88</code></pre><p>출력된 값을 AMD 공식 홈페이지에 명시된 해시값과 비교해 일치 여부를 확인합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/cc605e45-c363-4216-994e-71b3dc71492a/image.png" alt="">
일치함을 확인할 수 있습니다.</p>
<h2 id="4-파일-실행">4. 파일 실행</h2>
<p>아래의 명령어를 순서대로 입력해 설치 파일을 실행합니다.</p>
<pre><code># 작업 디렉토리를 파일이 설치된 곳으로 이동
cd ~/Downloads

# 실행 권한 부여
young@young-PC:~/Downloads$ chmod +x FPGAs_AdaptiveSoCs_Unified_2024.2_1113_2356_Lin64.bin

# 파일 실행
./FPGAs_AdaptiveSoCs_Unified_2024.2_1113_2356_Lin64.bin</code></pre><p><strong>실행 권한 부여:</strong> <code>chmod</code>(Change Mode) 명령어에 <code>+x</code>(eXecute) 옵션을 주어 해당 파일에 실행 권한을 부여합니다.</p>
<p><strong>파일 실행:</strong> 리눅스는 보안상 현재 디렉토리에 있는 파일을 파일명만으로 실행할 수 없습니다. 현재 위치를 나타내는 <code>./</code>를 앞에 붙여야 합니다.</p>
<h2 id="5-설치-과정">5. 설치 과정</h2>
<h3 id="1-continue-선택">1. Continue 선택</h3>
<p>Zynq-7000(Pynq-Z2)이나 Artix-7(Basys 3) 같은 7 Series 칩을 사용하는 경우, 2024.2와 2025.2 간의 성능 차이는 사실상 없습니다. 굳이 최신 버전을 고집하기보다는 어느 정도 검증된 2024.2 버전을 사용하는 것이 안정성 면에서 더 낫습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/3c8f9a0f-4cdd-4274-b8de-32ff3afdea3d/image.png" alt=""></p>
<h3 id="2-로그인">2. 로그인</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/c24dfa80-a97b-432b-aa77-6600f9be8a96/image.png" alt=""></p>
<h3 id="3-download-and-install-now-선택">3. <code>Download and Install Now</code> 선택</h3>
<p>필요한 파일만 선택적으로 다운로드할 수 있게하는 옵션입니다. 
<img src="https://velog.velcdn.com/images/young-0320/post/711f910f-4b30-432c-be4c-1d619aa7e9c7/image.png" alt=""></p>
<h3 id="4-vivado-선택">4. Vivado 선택</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/8510d8b2-00c2-485a-925a-c3b8cbf7c8d3/image.png" alt=""></p>
<h3 id="5-vivado-ml-standard-선택">5. Vivado ML Standard 선택</h3>
<p>무료 버전입니다. 타겟으로 하는 Pynq-Z2(Zynq-7000 계열)와 Basys 3(Artix-7 계열)는 모두 이 범주에 들어갑니다.
<img src="https://velog.velcdn.com/images/young-0320/post/5c37b2f9-5f9e-4dd0-897f-e60cd98e07f6/image.png" alt=""></p>
<h3 id="6-design-tools-설계-도구">6. Design Tools (설계 도구)</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/905d5edd-b3b1-4b6b-b4ec-75334b521cc4/image.png" alt=""></p>
<ul>
<li><p><code>Vivado</code>와 <code>Vitis HLS</code> 기본 선택 유지</p>
</li>
<li><p><code>Vitis Networking P4</code>: 데이터센터 스위치 라우터에서 패킷을 처리하는 특수 언어(P4)를 컴파일하는 엔진입니다. 일반적인 FPGA 설계와는 완전히 무관합니다.</p>
</li>
<li><p><code>Vitis Model Composer</code>: MATLAB에서 블록 다이어그램을 그리면 하드웨어 코드로 자동 변환해 주는 도구입니다.</p>
<ul>
<li><code>Vitis Embedded Development</code>: Zynq 칩 내부의 ARM 프로세서에서 돌아갈 소프트웨어(펌웨어)를 C/C++로 개발하기 위한 통합 개발 환경(IDE)입니다.
Pynq-Z2 보드에 미리 컴파일된 리눅스를 올리고 웹브라우저(Jupyter)에서 파이썬으로 보드를 제어할 것이면 필요 없습니다.</li>
</ul>
</li>
<li><p><code>Power Design Manager (PDM)</code>: 칩이 소모하는 전력을 계산하는 도구인데, 주로 최신 공정(UltraScale+, Versal)을 타겟으로 하므로 구형인 7 Series 칩에는 거의 쓰이지 않습니다.</p>
</li>
<li><p><code>DocNav</code>: PDF 문서 모음집입니다. 필요한 문서는 Xilinx 공식 사이트나 구글에서 직접 검색하는 편이 더 효율적입니다</p>
</li>
</ul>
<h3 id="7-devices">7. Devices</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/d8fe8fa2-0b14-4765-afe8-f0fa813cf52e/image.png" alt="">
타겟으로 하는 장치만 선별적으로 선택합니다.</p>
<ul>
<li><p><code>Zynq-7000</code>: Pynq-Z2 보드에 탑재된 칩입니다. ARM CPU(프로세서)와 FPGA(프로그래머블 로직)가 하나의 칩 안에 통합된 SoC(System-on-Chip) 구조로, 하드웨어 가속기를 구현하고 제어할 때 핵심적인 역할을 합니다.</p>
</li>
<li><p><code>Artix-7</code> : Basys 3 보드에 탑재된 칩입니다. 가격 대비 성능이 우수해 전 세계 대학의 디지털 논리 회로 실습에서 가장 널리 사용되는 칩입니다.</p>
</li>
<li><p><code>Kintex-7, Virtex-7</code>: <code>Artix-7</code>보다 규모가 크고 고성능인 칩들로, 주로 통신 기지국이나 방송 장비 등 전문 산업 분야에서 활용됩니다.</p>
</li>
<li><p><code>UltraScale, UltraScale+, Versal ACAP</code>: 7 Series 이후 세대의 칩들로, 데이터센터 AI 가속이나 5G 통신 인프라처럼 고성능·대규모 처리가 요구되는 환경에서 사용됩니다. 가격은 수백만 원에서 수천만 원대에 이릅니다.</p>
</li>
<li><p><code>Engineering Sample (ES) Devices</code>: 정식 출시 전 검증 목적으로 일부 기업에만 제공되는 프로토타입 칩입니다. 일반 사용자가 접할 일은 거의 없습니다.</p>
</li>
</ul>
<h3 id="8-용량-확인">8. 용량 확인</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/a6140374-a07f-4557-aaf1-033db11120d0/image.png" alt="">
필요한 옵션만 선택해도 설치 용량이 60.97GB에 달합니다. 불필요한 옵션까지 포함하면 100~200GB를 쉽게 넘길 수 있으니, 선택 항목을 다시 한번 확인하고 설치 전 디스크 여유 공간을 점검해 두세요.</p>
<h3 id="9-약관-동의">9. 약관 동의</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/41bd4c4e-4fde-4550-89a1-e7461aa8e857/image.png" alt=""></p>
<h3 id="10-설치-경로-설정">10. 설치 경로 설정</h3>
<p>기본 설치 경로인 <code>/tools/Xilinx</code>는 루트 디렉토리 하위에 있어 sudo 권한이 필요합니다. 설치 프로그램을 일반 권한으로 실행했기 때문에 이 경로에는 설치할 수 없습니다.</p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/d2085b4c-b296-4826-902a-801c242124b1/image.png" alt="">
사용자 홈 디렉토리 아래에 <code>Xilinx</code> 폴더를 생성하고 설치 경로를 해당 폴더로 변경합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/edc33bf2-9ac6-43ec-a8a1-78876b59f743/image.png" alt=""></p>
<h3 id="11-환경-변수-등록">11. 환경 변수 등록</h3>
<p>설치 후 터미널에서 <code>vivado</code> 명령어를 사용하려면 환경 변수를 등록해야 합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/243ab892-ee9d-4d6f-a88e-43c6c839040a/image.png" alt=""></p>
<pre><code># 설치 경로 확인
ls -l /home/young/Xilinx/Vivado/2024.2/settings64.sh

# .bashrc 파일 끝에 환경 변수 추가
echo &quot;source /home/young/Xilinx/Vivado/2024.2/settings64.sh&quot; &gt;&gt; ~/.bashrc

# 변경사항 즉시 적용
source ~/.bashrc</code></pre><h3 id="12-실행">12. 실행</h3>
<pre><code># 터미널로 실행 가능
vivado</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/e97bc8c7-4ffe-4dc7-992f-ace0dc338e63/image.png" alt="">
성공!</p>
<h2 id="마무리하며">마무리하며</h2>
<p>이것으로 Vivado 설치가 완료되었습니다. 다음 글에서는 Vivado 기본 사용법과 간단한 RTL 합성 과정을 다뤄보겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RTL log #1 : Half Adder 설계부터 검증까지 — iverilog 실습]]></title>
            <link>https://velog.io/@young-0320/Half-Adder-%EC%84%A4%EA%B3%84%EB%B6%80%ED%84%B0-%EA%B2%80%EC%A6%9D%EA%B9%8C%EC%A7%80-iverilog-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@young-0320/Half-Adder-%EC%84%A4%EA%B3%84%EB%B6%80%ED%84%B0-%EA%B2%80%EC%A6%9D%EA%B9%8C%EC%A7%80-iverilog-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Mon, 23 Feb 2026 09:43:54 GMT</pubDate>
            <description><![CDATA[<p>이번 포스팅에서는 가장 기초적인 Half Adder를 통해 RTL 설계의 기본기와 일반적인 검증 워크플로우를 정리해 보겠습니다.</p>
<p>Half Adder를 첫 예제로 고른 이유는 간단합니다. 로직 자체가 단순해서 설계보다 &quot;내가 만든 게 정말 맞게 동작하는지 어떻게 확인하지?&quot; 라는 검증의 흐름에 집중하기 좋기 때문입니다. 
처음 RTL을 접했을 때 Verilog 문법이나 시뮬레이터 사용법부터 막막하게 느껴졌습니다.
이 글이 같은 고민을 하고 있는 분들께 조금이나마 도움이 됐으면 좋겠습니다.</p>
<h2 id="rtl-설계-및-검증-프로세스">RTL 설계 및 검증 프로세스</h2>
<p>RTL(Register Transfer Level) 설계는 단순히 코드를 짜는 것에 그치지 않고, 의도한 대로 동작하는지 증명하는 과정이 핵심입니다. 일반적인 순서는 다음과 같습니다.</p>
<p><strong>1. RTL 작성 (Design):</strong> 하드웨어 로직 구현</p>
<p><strong>2. 테스트벤치 작성 (Testbench):</strong> 입력 시나리오 및 검증 로직 작성</p>
<p><strong>3. 컴파일 (Compilation):</strong> 설계 및 테스트벤치 코드의 문법 체크 및 실행 파일 생성</p>
<p><strong>4. 검증 (Verification):</strong> 파형(Waveform) 분석 또는 로그 확인</p>
<h2 id="1-rtl-작성-design-half-adder">1. RTL 작성 (Design): Half Adder</h2>
<p>반가산기는 가장 기본적인 산술 연산 블록으로, 2진수 1비트 두 개를 더해 합(Sum)과 올림수(C_out)를 출력합니다. </p>
<pre><code>`timescale 1ns / 1ps

module half_adder (
    input  a, b,
    output c_out, sum
);
  // XOR 게이트를 이용한 Sum 구현
  xor g1 (sum, a, b);
  // AND 게이트를 이용한 Carry 구현
  and g2 (c_out, a, b);
endmodule</code></pre><h2 id="2-테스트벤치testbench-작성">2. 테스트벤치(Testbench) 작성</h2>
<p>테스트벤치는 설계한 모듈(DUT, Design Under Test)에 가상의 입력을 넣어주는 실험 환경입니다. 여기서는 두 가지 방식을 비교합니다.</p>
<h3 id="a-directed-testbench-수동-검증">A. Directed Testbench (수동 검증)</h3>
<p>입력값을 하나하나 직접 인가하고, 터미널의 로그나 파형을 보고 눈으로 직접 결과를 확인하는 방식입니다.</p>
<ul>
<li><p>장점: 직관적이며 소규모 회로의 동작을 빠르게 확인할 때 유리합니다.</p>
</li>
<li><p>단점: 입력 조합이 많아질수록 누락되는 케이스가 생기기 쉽고, 하나하나 확인하기 번거롭습니다.</p>
</li>
</ul>
<pre><code>// directed testbench for half adder
`timescale 1ns / 1ps

module test_half_adder ();
  reg t_a, t_b;
  wire t_c_out, t_sum;
  half_adder uut (
      .a(t_a),
      .b(t_b),
      .c_out(t_c_out),
      .sum(t_sum)
  );

  initial #100 $finish;
  initial begin
    $dumpfile(&quot;sim/build/output/iverilog/test_half_adder.vcd&quot;);
    $dumpvars(0, test_half_adder);
    $display(&quot;a b | c_out sum&quot;);
    $display(&quot;-------------&quot;);
    t_a = 0;
    t_b = 0;
    #10;
    $display(&quot;%b %b | %b     %b&quot;, t_a, t_b, t_c_out, t_sum);
    t_a = 0;
    t_b = 1;
    #10;
    $display(&quot;%b %b | %b     %b&quot;, t_a, t_b, t_c_out, t_sum);
    t_a = 1;
    t_b = 0;
    #10;
    $display(&quot;%b %b | %b     %b&quot;, t_a, t_b, t_c_out, t_sum);
    t_a = 1;
    t_b = 1;
    #10;
    $display(&quot;%b %b | %b     %b&quot;, t_a, t_b, t_c_out, t_sum);

  end
endmodule</code></pre><h3 id="b-self-checking-testbench-자동-검증">B. Self-checking Testbench (자동 검증)</h3>
<p>입력값을 랜덤으로 인가하거나 모든 조합을 돌리면서, <strong>Reference Model(정답지)</strong>과 실제 출력값을 비교하여 자동으로 PASS/FAIL을 판정하는 방식입니다.</p>
<ul>
<li>눈으로 직접 확인하는 대신, 코드 내부의 if문과 ref_model이 결과를 실시간으로 대조합니다.</li>
<li>repeat 문을 통해 수천 번의 랜덤 테스트를 수행할 수 있어, 설계자가 예상치 못한 코너 케이스(Corner Case)를 잡기에 유리합니다.</li>
<li>seen 변수 등을 활용해 모든 입력 조합이 한 번씩은 들어갔는지(Coverage)를 확인할 수 있습니다.</li>
</ul>
<p>보통 6개의 블럭으로 구성됩니다.</p>
<ol>
<li><p>DUT 연결 (u_dut)</p>
</li>
<li><p>입력 인가 (apply stimulus)</p>
</li>
<li><p>기대값 계산 (reference model)</p>
</li>
<li><p>자동 비교 (if (got !== exp))</p>
</li>
<li><p>에러 카운트/최종 PASS-FAIL</p>
</li>
<li><p>타임아웃(TIMEOUT) 종료</p>
<p>시스템 베릴로그 문법을 사용하여 작성했습니다.</p>
<pre><code>// self-checking testbench for half_adder
`timescale 1ns / 1ps
module test_half_adder;
reg t_a, t_b;
reg [1:0] ref_out;
wire t_c_out, t_sum;
integer i;
integer err_cnt;
reg [3:0] seen;  // 입력 조합 관측 체크용
// 1. DUT 연결
half_adder u_dut (
 .a(t_a),
 .b(t_b),
 .c_out(t_c_out),
 .sum(t_sum)
);

// 3. reference model
function [1:0] ref_half_adder;
input a_i, b_i;
begin
 ref_half_adder = a_i + b_i;  // {c_out, sum}
end
endfunction

initial begin
err_cnt = 0;
seen    = 4&#39;b0000;

// ── 2. 입력 인가 ──
repeat (50) begin
 t_a = $urandom_range(0, 1);
 t_b = $urandom_range(0, 1);
 #1;
 seen[{t_a, t_b}] = 1&#39;b1;
 // ── 4. 자동 비교: 랜덤 50회 ──
 ref_out = ref_half_adder(t_a, t_b);
 if ({t_c_out, t_sum} !== ref_out) begin
   $error(&quot;Mismatch: a=%0b b=%0b got=%0b%0b exp=%0b%0b&quot;, t_a, t_b, t_c_out, t_sum, ref_out[1],
          ref_out[0]);
   err_cnt = err_cnt + 1;
 end
end

// ── 미커버 조합 강제 인가 (전수 커버리지 보장) ─────────
for (i = 0; i &lt; 4; i = i + 1) begin
 if (!seen[i]) begin
   {t_a, t_b} = i[1:0];
   #1;
   seen[{t_a, t_b}] = 1&#39;b1;
   ref_out = ref_half_adder(t_a, t_b);
   if ({t_c_out, t_sum} !== ref_out) begin
     $error(&quot;Mismatch: a=%0b b=%0b got=%0b%0b exp=%0b%0b&quot;, t_a, t_b, t_c_out, t_sum,
            ref_out[1], ref_out[0]);
     err_cnt = err_cnt + 1;
   end
 end
end

// ── 5. 최종 판정 ──
if (seen !== 4&#39;b1111) $fatal(1, &quot;FAIL: not all input combos covered, seen=%b&quot;, seen);

if (err_cnt == 0) $display(&quot;PASS: self-checking random TB&quot;);
else $fatal(1, &quot;FAIL: err_cnt=%0d&quot;, err_cnt);

$finish;
end

initial begin
#1000;
$fatal(1, &quot;TIMEOUT&quot;);
end
</code></pre></li>
</ol>
<p>endmodule</p>
<pre><code>

## 3. 컴파일 (Compilation): iverilog 가이드
컴파일 단계에서는 iverilog를 사용합니다. 각 옵션의 의미를 정확히 아는 것이 중요합니다.</code></pre><p>// iverilog 컴파일 명령어 예시
iverilog -g2012 -Wall -s test_half_adder -o sim/build/output/iverilog/test_half_adder.vvp <br>rtl/half_adder.v sim/test/test_half_adder.v</p>
<pre><code>**옵션 상세 설명**
```-g2012```: iverilog가 사용할 Verilog 표준을 지정합니다. 
g2005, g2001 등 여러 버전이 있는데, -g2012는 IEEE 1800-2012(SystemVerilog) 표준으로 $urandom_range 같은 최신 시스템 함수를 사용하려면 이 옵션이 필요합니다. 
명시하지 않으면 iverilog 기본값으로 컴파일되어 최신 문법에서 에러가 날 수 있습니다.

```-Wall```: 모든 경고(Warning) 메시지를 출력합니다. 사소한 문법 실수나 포트 연결 누락처럼 에러는 아니지만 잠재적으로 문제가 될 수 있는 부분을 알려줍니다.

```-s test_half_adder```: 시뮬레이션의 최상위 모듈(Top-level module)을 지정합니다. 보통 테스트벤치 모듈 이름인 ```test_half_adder```가 들어갑니다.

```-o [출력파일경로]```: 컴파일 결과로 생성될 실행 파일의 경로와 이름을 지정합니다. iverilog의 출력물은 .vvp 확장자를 사용하며, 이후 vvp 명령어로 실행합니다. 경로를 지정하지 않으면 현재 디렉토리에 a.out으로 생성됩니다.

```소스 파일 나열```: 마지막에는 컴파일에 필요한 모든 .v 파일을 나열합니다. 설계 파일(```half_adder.v```)을 먼저, 테스트벤치 파일(```test_half_adder.v)```을 그 뒤에 적는 것이 일반적입니다. 파일을 빠뜨리면 &quot;module not found&quot; 에러가 발생하니 주의하세요.

## 4. 검증 (Verification)
컴파일이 성공했다면 vvp 명령어로 시뮬레이션을 실행합니다.</code></pre><p>// 시뮬레이션 실행
vvp sim/build/output/iverilog/test_half_adder.vvp</p>
<p>// 출력 예시
PASS: self-checking random TB</p>
<pre><code>### 결과 분석 방법

### 1. Directed Testbench 방식
- 터미널에 출력된 진리표로 직접 확인합니다.
![](https://velog.velcdn.com/images/young-0320/post/3b160ce2-6ae6-4ea7-83af-7639be32695e/image.png)
-  혹은 아래 명령어로 파형을 직접 확인할 수도 있습니다.
![](https://velog.velcdn.com/images/young-0320/post/dffdc6e5-27bd-4082-b22b-173dd5d0a831/image.png)
</code></pre><p>// gtkwave를 이용하여 파형 확인
gtkwave sim/build/output/iverilog/test_half_adder.vcd</p>
<pre><code>### 2. Self-checking Testbench 방식
아래 메시지가 뜨면 모든 테스트를 통과한 것입니다.</code></pre><p>PASS: self-checking random TB</p>
<pre><code>![](https://velog.velcdn.com/images/young-0320/post/52496ee8-1d9a-4d63-9d78-1cde1aaca428/image.png)
만약 실패했다면 $error와 $fatal 메시지가 함께 출력됩니다. 
$error는 어떤 입력값에서 출력이 틀렸는지 알려주고, $fatal은 최종적으로 몇 개의 오류가 발생했는지 요약해줍니다. 로그를 위에서부터 읽으면서 첫 번째 ERROR가 찍힌 시점을 찾는 것이 디버깅의 시작입니다.</code></pre><p>ERROR: Mismatch: a=1 b=1 got=01 exp=10
FAIL: err_cnt=1</p>
<pre><code>
## 마무리하며 
이번 포스팅에서는 Half Adder를 통해 RTL 설계부터 iverilog를 이용한 컴파일, 검증까지 전체 흐름을 정리해봤습니다. 단순한 회로지만 막상 직접 테스트벤치를 짜고 시뮬레이션을 돌려보면 생각보다 알아야 할 것이 많다고 느꼈습니다. 

다음 포스팅에서는 베릴레이터를 이용하여 64bit adder를 검증해 볼 예정입니다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #14 : 가장 깔끔한 파이썬 개발 환경: Ubuntu + uv ]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-13-%EA%B0%80%EC%9E%A5-%EA%B9%94%EB%81%94%ED%95%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-Ubuntu-uv</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-13-%EA%B0%80%EC%9E%A5-%EA%B9%94%EB%81%94%ED%95%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-Ubuntu-uv</guid>
            <pubDate>Sun, 15 Feb 2026 12:41:15 GMT</pubDate>
            <description><![CDATA[<p>기존 파이썬 환경 설정(pyenv, pip 등)은 꽤나 번거롭고 속도가 느렸습니다. 또한 의존성 충돌도 발생할 수 있기에 고민이 되었습니다.
Rust로 작성된 차세대 패키지 매니저 uv는 기존 도구들을 대체하는 압도적인 속도와 cargo 스타일의 통합된 워크플로우를 제공합니다. </p>
<p>이번 포스팅에서는 Ubuntu 환경에서 uv를 설치하고, 가장 빠르고 안전하게 파이썬 개발 환경을 구축하는 방법을 정리했습니다.</p>
<h2 id="왜-poetry-대신-uv인가">왜 Poetry 대신 uv인가?</h2>
<p>파이썬 프로젝트를 시작할 때 패키지 관리 도구로 가장 먼저 떠오르는 것은 Poetry입니다. 하지만 저는 이번 프로젝트에서 Rust 기반의 차세대 도구인 uv를 선택했습니다. 그 이유는 다음과 같습니다.</p>
<p><strong>Poetry: 기존의 강력한 표준</strong>
의존성 관리, 패키징, 배포를 위한 올인원 도구로 오랫동안 사랑받아 왔습니다.
하지만 프로젝트 규모가 커질수록 의존성 해결 속도가 느려지는 단점이 있습니다.</p>
<p><strong>uv: 압도적인 속도</strong>
Rust로 작성되어 기존 pip이나 pip-tools보다 10~100배 빠른 압도적인 속도를 보여줍니다.
<img src="https://velog.velcdn.com/images/young-0320/post/1c42bc6b-4f17-432a-be0f-ce0c00f35900/image.png" alt=""></p>
<p>단순히 패키지만 설치하는 것이 아니라, <strong>Python 버전 관리(pyenv 대체)</strong>부터 <strong>가상 환경 관리(venv 대체)</strong>까지 하나의 툴로 끝낼 수 있습니다.</p>
<p><strong>&quot;속도&quot;와 &quot;통합성&quot;</strong></p>
<ul>
<li><p>Rust 기반의 빠른 설치 및 해석 속도로 개발 생산성을 극대화할 수 있습니다.</p>
<ul>
<li>pyenv로 파이썬 버전을 깔고, venv로 가상 환경을 만들고, pip으로 패키지를 설치하는 복잡한 과정 없이, uv 명령어 하나로 모든 환경 설정이 끝납니다.</li>
</ul>
</li>
</ul>
<h1 id="uv-설치-가이드">uv 설치 가이드</h1>
<h2 id="1-바이너리-파일-설치">1. 바이너리 파일 설치</h2>
<p><img src="https://velog.velcdn.com/images/young-0320/post/7332e6b4-6252-4053-9c9c-1c8be2018d17/image.png" alt=""></p>
<pre><code># 공식 설치 스크립트
curl -LsSf https://astral.sh/uv/install.sh | sh</code></pre><h2 id="2-설치-확인">2. 설치 확인</h2>
<p>uv는 자동으로 환경 변수를 설정하기에 단순히 터미널을 껐다 킨 뒤
<code>uv --version</code> 명령어로 버전을 확인합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/9db916a8-a193-496d-bf30-e81dcf108d7d/image.png" alt=""></p>
<p>성공!</p>
<h2 id="3-실행">3. 실행</h2>
<p>프로젝트의 루트 디렉토리로 이동해 <code>uv init</code> 명령어로 uv를 실행시킵니다.
<img src="https://velog.velcdn.com/images/young-0320/post/f9bda4a6-2929-4b7f-964e-6b7d52bf83a1/image.png" alt=""></p>
<p>생성되는 파일 목록:</p>
<ul>
<li><code>.gitignore</code> : Git이 추적하지 않을 파일 혹은 폴더 지정</li>
<li><code>.ptrhon-version</code> : 파이썬 버전 명시</li>
<li><code>main.py</code> : 파이썬 프로그램 실행 진입점</li>
<li><code>pyproject.toml</code> : 프로젝트 통합 설정 파일</li>
<li><code>README.md</code> : 프로젝트 설명서</li>
</ul>
<p><img src="https://velog.velcdn.com/images/young-0320/post/1cc41fcb-9fa6-41d7-bb9c-3299b5d6d47d/image.png" alt=""></p>
<pre><code>uv run python --version</code></pre><p>명령어를 통해 적용되는 파이썬 버전을 확인할 수 있습니다.</p>
<p><strong>이때 생성되는 파일:</strong></p>
<ul>
<li><code>.venv</code> :가상 환경 폴더. 파이썬 인터프리터와 라이브러리 저장</li>
<li><code>uv.lock</code> : 실제로 설치된 패키지들의 모든 정보가 기록</li>
</ul>
<h2 id="4-사용법">4. 사용법</h2>
<h3 id="패키지-관리">패키지 관리</h3>
<ol>
<li><p>설치</p>
<pre><code># pyproject.toml, uv.lock에 기록
uv add &lt;라이브러리 명&gt;</code></pre><p>또는 ,</p>
<pre><code># 기록 없이 임시로 설치할 라이브러리
uv pip install &lt;라이브러리 명&gt;</code></pre></li>
<li><p>삭제</p>
<pre><code>uv remove &lt;라이브러리 명&gt;</code></pre></li>
<li><p>패키지 환경 구성</p>
<pre><code>uv sync</code></pre><p><code>pyproject.toml</code> 파일과 <code>uv.lock</code> 파일만 있다면 위의 명령어를 이용하여 완벽하게 동일한 가상 환경 폴더를 생성해 낼 수 있습니다.</p>
</li>
</ol>
<p>다만 <code>uv run &lt;파일 명.py&gt;</code> 명령어를 입력하면 자동으로 <code>uv sync</code>를 실행시켜줍니다.
<img src="https://velog.velcdn.com/images/young-0320/post/bae71d20-34d3-43b4-a23f-654791881b5b/image.png" alt=""></p>
<h2 id="마무리하며">마무리하며</h2>
<p>이제 더 이상 복잡한 가상 환경 활성화나 의존성 꼬임 문제로 시간을 낭비할 필요가 없습니다. </p>
<p>uv run 명령어 하나로 언제 어디서든 동일한 개발 환경을 재현할 수 있게 되었습니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #15 : CMake Tools로 C/C++ 빌드 환경 설정하기]]></title>
            <link>https://velog.io/@young-0320/c-%EB%B9%8C%EB%93%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@young-0320/c-%EB%B9%8C%EB%93%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Sat, 14 Feb 2026 16:11:18 GMT</pubDate>
            <description><![CDATA[<p>일관된 C/C++ 빌드 세팅을 유지하는 것이 가장 중요합니다.
이번 포스팅에서는 CMakePresets를 활용한 환경 표준화부터 사이드바 제어를 이용해 VS Code 기반의 CMake 워크플로우 구축 방법을 단계별로 알아보겠습니다.</p>
<h2 id="1-개발-환경-표준화">1. 개발 환경 표준화</h2>
<p>VS Code에서 CMake를 사용할 때 가장 먼저 해야 할 일은 빌드 환경을 고정하는 것입니다. 
<code>CMakePresets.json</code>을 프로젝트 최상위 경로에 작성하면, 팀원 간의 환경 차이나 Windows/Ubuntu 등 운영체제 변환 시에도 동일한 빌드 폴더 구조와 컴파일러 설정을 유지할 수 있습니다.</p>
<p>이 파일은 크게 빌드 환경을 세팅하는 <strong>configurePresets</strong>와 실제 컴파일 대상을 지정하는 <strong>buildPresets</strong> 두 부분으로 나뉩니다.</p>
<h3 id="a-구성-사전-설정-configurepresets">A. 구성 사전 설정 (configurePresets)</h3>
<p>CMake가 빌드 파일(Makefile 등)을 어디에, 어떤 설정으로 생성할지 정의합니다. 
VS Code가 기본으로 생성해 주는 더미 템플릿은 삭제하고, 해당 프로젝트에 맞는 구조로 직접 작성합니다.</p>
<pre><code>{
    &quot;version&quot;: 3,
    &quot;configurePresets&quot;: [
        {
            &quot;name&quot;: &quot;default-build&quot;,
            &quot;displayName&quot;: &quot;Default Build (Project Root)&quot;,
            &quot;description&quot;: &quot;프로젝트 최상위 루트에 build 폴더를 생성하는 표준 방식&quot;,
            &quot;binaryDir&quot;: &quot;${sourceDir}/build&quot;,
            &quot;cacheVariables&quot;: {
                &quot;CMAKE_BUILD_TYPE&quot;: &quot;Debug&quot;,
                &quot;BUILD_FIR_TESTS&quot;: &quot;ON&quot;
            }
        },
        {
            &quot;name&quot;: &quot;fir-1d-custom&quot;,
            &quot;displayName&quot;: &quot;1D FIR Filter (Sub-folder Build)&quot;,
            &quot;description&quot;: &quot;FIR 필터 시뮬레이션 관련 빌드 파일만 하위 폴더로 격리&quot;,
            &quot;binaryDir&quot;: &quot;${sourceDir}/fir_1d/sim/build&quot;,
            &quot;cacheVariables&quot;: {
                &quot;CMAKE_BUILD_TYPE&quot;: &quot;Debug&quot;,
                &quot;BUILD_FIR_TESTS&quot;: &quot;ON&quot;
            }
        }
    ],</code></pre><p><strong>default-build preset:</strong> 프로젝트 최상위 루트에 build 폴더를 만들고 모든 구성 파일을 이곳에 저장하는 가장 표준적인 방식입니다.</p>
<p><strong>fir-1d-custom preset:</strong> 특정 하위 모듈(1D FIR 필터)의 시뮬레이션 및 검증만을 위해 독립적인 build 폴더를 구축하는 맞춤형 설정입니다.</p>
<ul>
<li>binaryDir: 빌드 산출물이 저장될 경로입니다. ${sourceDir} 매크로를 사용하여 절대 경로 하드코딩으로 인한 에러를 방지합니다.</li>
</ul>
<p>전체 프로젝트를 제어하는 default-build와 달리, fir-1d-custom은 빌드 폴더를 fir_1d/sim/build로 깊게 지정하여 다른 모듈의 목적 파일(.o)과 섞이지 않도록 관리합니다.</p>
<h3 id="b-빌드-사전-설정buildpresets">B. 빌드 사전 설정(buildPresets)</h3>
<p>앞서 만든 <code>configurePreset</code>를 바탕으로, 소스 코드 중 어떤 타겟(Target)을 컴파일할지 구체적인 대상을 지정합니다.</p>
<pre><code>&quot;buildPresets&quot;: [
        {
            &quot;name&quot;: &quot;build-all-default&quot;,
            &quot;configurePreset&quot;: &quot;default-build&quot;
        },
        {
            &quot;name&quot;: &quot;build-test-fir-1d-default&quot;,
            &quot;configurePreset&quot;: &quot;default-build&quot;,
            &quot;targets&quot;: [
                &quot;test_fir_1d&quot;
            ]
        },
        {
            &quot;name&quot;: &quot;build-test-fir-1d-custom&quot;,
            &quot;configurePreset&quot;: &quot;fir-1d-custom&quot;,
            &quot;targets&quot;: [
                &quot;test_fir_1d&quot;
            ]
        }
    ]
}</code></pre><p><strong>build-all-default:</strong> default-build 프리셋을 사용합니다. 기본 디폴트 설정입니다.</p>
<p><strong>build-test-fir-1d-default:</strong> default-build 폴더를 사용하되 targets를 test_fir_1d로 명시합니다. 해당 타겟만 빌드하므로, 컴파일 및 디버깅 속도가 상승합니다.</p>
<p><strong>build-test-fir-1d-custom:</strong> fir-1d-custom 프리셋을 사용하여 격리된 빌드 디렉토리를 사용합니다. 마찬가지로 targets 명시를 통해 빠른 빌드와 검증 속도를 확보합니다.</p>
<h3 id="c-프리셋preset-적용-및-타겟-제어">C. 프리셋(Preset) 적용 및 타겟 제어</h3>
<p>작성한 <code>CMakePresets.json</code>을 VS Code에 실제로 적용하는 단계입니다. 
CMake는 <strong>구성(Configure)</strong>과 <strong>빌드(Build)</strong>를 철저히 분리하여 관리하므로, 두 단계를 순서대로 진행해야 합니다.</p>
<h4 id="1-configure-preset-선택-빌드-환경-선택">1. Configure Preset 선택 (빌드 환경 선택)</h4>
<p><code>Ctrl + Shift + P</code>를 눌러 명령 팔레트를 열고 <code>CMake: Select Configure Preset</code>을 실행합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/3d3ae852-9b7e-4888-aa81-896efef637f8/image.png" alt=""></p>
<p>이 단계는 &quot;어떤 폴더에서, 어떤 컴파일러로 빌드 환경을 구성할 것인가?&quot;를 결정하는 단계입니다.</p>
<h4 id="2-build-preset-선택-컴파일-타겟-지정">2. Build Preset 선택 (컴파일 타겟 지정)</h4>
<p>환경 구성이 끝났다면 <code>CMake: Select Build Preset</code>을 실행하여 실제 컴파일 대상을 고릅니다.</p>
<p>하나의 구성 항목 중 어떤 종류의 빌드 명령을 수행할지 선택하는 단계입니다. 즉, 어떤 타겟을 어떤 방식으로 컴파일할지 결정하는 설정입니다.</p>
<p><strong>default preset (Default Build 선택 시)</strong>
<img src="https://velog.velcdn.com/images/young-0320/post/28860552-ce57-4fdf-841f-cc1adce5ef02/image.png" alt=""></p>
<p><strong>custom preset (1D FIR Filter 선택 시)</strong>
<img src="https://velog.velcdn.com/images/young-0320/post/11e10819-db5d-42c2-a363-99a10081e97d/image.png" alt=""></p>
<p>원하는 프리셋을 선택하여 적용합니다.</p>
<h2 id="2-cmake-tools-사이드바-활용하기">2. CMake Tools 사이드바 활용하기</h2>
<p>VS Code 좌측의 삼각형 아이콘(CMake)을 누르면 나타나는 사이드바의 핵심 기능을 정리합니다.</p>
<h3 id="a-프로젝트-상태-확인">A. 프로젝트 상태 확인</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/e61bfdad-17fa-458e-8faa-cb724f5e8f29/image.png" alt="">
현재 프로젝트의 상태를 시각적으로 보여줍니다. 
현재 어떤 타겟이 &#39;빌드&#39; 및 &#39;실행&#39; 대상으로 설정되어 있는지 실시간으로 확인할 수 있습니다.</p>
<h3 id="b-타겟별-개별-제어build-clean-debug">B. 타겟별 개별 제어(Build, Clean, Debug)</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/21c2646d-d670-40e0-81cb-c2aa445c9655/image.png" alt=""></p>
<p>현재 선택된 타겟을 나타냅니다. 리스트의 특정 타겟에 마우스를 올리면 작은 아이콘들이 나타납니다.</p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/baac60ed-fa88-410f-a5cd-6895e1fd0408/image.png" alt="">
빌드 타겟에 마우스를 올리면 나타나는 작은 아이콘을 통해 빌드 대상을 변경할 수 있습니다. 
<img src="https://velog.velcdn.com/images/young-0320/post/979d6b11-7cff-42e0-9476-d64e60079993/image.png" alt=""></p>
<p>마찬가지로 해당 아이콘으로 실행 타겟도 변경할 수 있습니다.</p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/c7a6520a-0cbc-4ebc-88cc-211d7977aa7b/image.png" alt=""></p>
<p>사이드바에서 설정된 타겟은 하단 상태 표시줄의 망치 및 화살표 아이콘과 즉시 동기화됩니다. 덕분에 한 번 타겟을 잡아두면, 이후에는 단축키나 하단 버튼 클릭만으로 반복적인 컴파일과 실행을 빠르게 수행할 수 있습니다.</p>
<h2 id="마무리하며">마무리하며</h2>
<p>이번 글에서는 CMakePresets로 빌드 환경을 표준화하고, VS Code CMake Tools에서 Configure와 Build를 분리해 운영하는 흐름을 정리했습니다.
이렇게 세팅해두면 Windows와 Ubuntu를 오가더라도 동일한 절차로 빌드와 디버깅을 반복할 수 있습니다.</p>
<p>다음 글에서는 generator/toolchain/컴파일러를 preset에 명시적으로 고정하고, CTest preset까지 연결해 자동 검증 루틴을 완성해보겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #12 : VS Code의 생산성을 높여주는 Extensions]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-12-VS-Code%EC%9D%98-%EC%83%9D%EC%82%B0%EC%84%B1%EC%9D%84-%EB%86%92%EC%97%AC%EC%A3%BC%EB%8A%94-Extensions</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-12-VS-Code%EC%9D%98-%EC%83%9D%EC%82%B0%EC%84%B1%EC%9D%84-%EB%86%92%EC%97%AC%EC%A3%BC%EB%8A%94-Extensions</guid>
            <pubDate>Thu, 12 Feb 2026 05:40:33 GMT</pubDate>
            <description><![CDATA[<p>제대로 된 익스텐션 몇 개만 설치해도 코딩 생산성이 눈에 띄게 달라집니다.
이 글에서는 실제로 사용하면서 작업 효율을 크게 높여준 익스텐션들을 정리해봤습니다.</p>
<h2 id="1-gitlens">1. GitLens</h2>
<p>Git 커밋 기록을 누가 언제 어떤 이유로 수정했는지를 코드 위에서 바로 보여주는 익스텐션입니다.
<img src="https://velog.velcdn.com/images/young-0320/post/efd135e3-59a6-4338-beb6-7993a114044d/image.png" alt="">
이런 식으로 코드 라인 끝에 회색 글씨로 누가, 언제, 왜 이 코드를 작성했는지를 보여줍니다.</p>
<p>해당 코드 라인에 마우스를 올리면 상세한 커밋 정보가 팝업으로 나타납니다.
<img src="https://velog.velcdn.com/images/young-0320/post/9d214d49-15ae-406f-901e-525a68afac72/image.png" alt=""></p>
<p>사이드바의 GitLens 아이콘을 클릭하면</p>
<ul>
<li>현재 파일의 모든 수정 기록</li>
<li>누가 몇 번 수정했는지</li>
<li>각 커밋에서 어떤 내용이 바뀌었는지</li>
</ul>
<p>등을 시각적으로 확인할 수 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/9356427d-b7f1-496f-a355-39ea21d89175/image.png" alt=""></p>
<h2 id="2-remote---tunnels-remote-explorer">2. Remote - Tunnels, Remote Explorer</h2>
<p><img src="https://velog.velcdn.com/images/young-0320/post/30e4b818-6b81-4a9c-8dac-14d79060810b/image.png" alt=""></p>
<p>인터넷만 있으면 어디서든 다른 컴퓨터의 VSCode에 접속할 수 있게 해주는 익스텐션입니다.</p>
<p>일반적인 원격 접속 방식은 방화벽 설정, 포트포워딩 등 복잡한 네트워크 설정이 필요하지만, Remote - Tunnels는 Microsoft 서버를 중간다리로 활용하는 방식이라 이런 번거로운 과정이 전혀 필요 없습니다.</p>
<p>집 데스크탑에 개발 환경을 구축해두고, 카페에서 노트북으로 접속해 마치 데스크탑 앞에 앉아있는 것처럼 작업할 수 있습니다. 노트북의 제한된 성능이 아닌 데스크탑의 강력한 성능을 그대로 활용할 수 있죠.</p>
<p><strong>필수 설정 명령어</strong></p>
<pre><code>code tunnel service install</code></pre><p>데스크탑을 원격 서버로 등록하는 명령어로, 
이걸 실행해야 데스크탑이 백그라운드에서 항상 접속 대기 상태가 됩니다.
컴퓨터를 켜두기만 하면 언제든지 원격 접속이 가능해 집니다.</p>
<p><strong>Remote Explorer</strong>
Remote - Tunnels의 사이드바 UI 역할을 하는 익스텐션입니다.</p>
<p><strong>주요 기능:</strong></p>
<ul>
<li>등록된 원격 컴퓨터 목록 표시</li>
<li>클릭 한 번으로 원격 접속</li>
<li>연결 상태 확인</li>
<li>SSH, 터널, 컨테이너 등 다양한 원격 환경 관리</li>
</ul>
<p><img src="https://velog.velcdn.com/images/young-0320/post/5be0f0d8-5931-4775-984e-4b60737d9d03/image.png" alt="">
해당 이미지와 같이 사이드바에 UI가 나타나고 Microsoft나 GitHub에 등록된 터널로 접속할 수 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/ed2a6360-2b45-4279-a171-68e84a01a4e3/image.png" alt="">
하단 상태 표시줄 가장 왼쪽 버튼을 클릭하여 터널을 선택할 수도 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/f7bc299f-759a-435c-9aef-10bead391e5a/image.png" alt=""></p>
<h2 id="3-markdown-extensions">3. Markdown extensions</h2>
<h3 id="a-markdown-all-in-one">A. Markdown All in one</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/bd4a9d58-6280-4dd2-ab70-94eccd4e2736/image.png" alt="">
마크다운 작성을 위한 도구 모음입니다.</p>
<p><strong>주요 기능:</strong></p>
<ul>
<li>키보드 단축키로 빠른 서식 적용 (굵게, 기울임, 취소선 등)</li>
<li>자동 목차(TOC) 생성 및 업데이트</li>
<li>자동 리스트 넘버링</li>
<li>표 자동 정렬 및 포맷팅</li>
<li>섹션 번호 자동 매기기</li>
<li>미리보기 스크롤 동기화<h3 id="b-markdown-preview-enhanced">B. Markdown Preview Enhanced</h3>
<img src="https://velog.velcdn.com/images/young-0320/post/c8d1bb2e-d1b2-40e6-97e3-40d5ef48c7c7/image.png" alt="">
강력한 미리보기 및 내보내기 기능을 제공하는 익스텐션입니다.</li>
</ul>
<p><strong>주요 기능:</strong></p>
<ul>
<li>실시간 미리보기 (수학 수식, 다이어그램 지원)</li>
<li>Mermaid, PlantUML 등 다이어그램 렌더링</li>
<li>코드 청크 실행 기능</li>
<li>PDF, HTML, PNG 등 다양한 포맷으로 내보내기</li>
<li>프레젠테이션 모드</li>
<li>커스터마이징 가능한 CSS 스타일</li>
</ul>
<h3 id="c-markdown-pdf">C. Markdown PDF</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/bd5bd25c-f974-4837-a1fa-a9b2209b5e0a/image.png" alt=""></p>
<p>마크다운 파일을 PDF로 간편하게 변환하는 익스텐션입니다.</p>
<h2 id="4-office-viewer">4. Office Viewer</h2>
<p><img src="https://velog.velcdn.com/images/young-0320/post/47b88485-26b9-4e7a-bee9-1bf117c3bed2/image.png" alt=""></p>
<p>Microsoft Office 파일을 VSCode 내에서 직접 열람할 수 있는 익스텐션입니다.</p>
<p><strong>주요 기능:</strong></p>
<ul>
<li>Word(.docx), Excel(.xlsx), PowerPoint(.pptx) 파일을 VSCode에서 바로 보기</li>
<li>PDF 파일도 함께 지원</li>
<li>별도의 Office 프로그램 실행 없이 파일 내용 확인 가능</li>
<li>편집 불가</li>
</ul>
<h2 id="5-hex-editor">5. Hex Editor</h2>
<p><img src="https://velog.velcdn.com/images/young-0320/post/71945ca5-30ce-4798-b4a1-8e569eedde71/image.png" alt="">
파일의 바이너리 데이터를 16진수(Hexadecimal)로 직접 보고 편집할 수 있는 익스텐션입니다.</p>
<p><strong>주요 기능:</strong></p>
<ul>
<li>모든 파일을 바이트 단위로 16진수로 표시</li>
<li>바이너리 데이터 직접 편집 가능</li>
<li>ASCII/UTF-8 텍스트와 16진수 동시 표시</li>
<li>파일 구조 분석 (이미지, 실행파일 등)</li>
<li>대용량 파일도 효율적으로 처리</li>
<li>특정 바이트 검색 및 이동</li>
</ul>
<h2 id="6-가독성-향상">6. 가독성 향상</h2>
<h3 id="a-material-icon-theme">A. Material Icon Theme</h3>
<p>파일과 폴더에 직관적이고 예쁜 아이콘을 적용해주는 테마입니다.</p>
<p><strong>세부 설정 방법</strong>
기본 아이콘만으로도 충분하지만, 특정 폴더에 원하는 아이콘을 직접 지정할 수도 있습니다.</p>
<h4 id="1-설정-파일-열기">1. 설정 파일 열기</h4>
<p><code>F1</code> 또는 <code>Ctrl+Shift+P</code>를 눌러 명령 팔레트를 연 후, Preferences: Open User Settings (JSON)을 입력하고 선택합니다.</p>
<p>프로젝트별로 다르게 설정하고 싶다면 .vscode/settings.json 파일을 사용하세요.</p>
<h4 id="2-폴더-아이콘-매핑-추가">2. 폴더 아이콘 매핑 추가</h4>
<p>아래 코드를 <code>settings.json</code> 파일 안에 추가합니다. 이미 material-icon-theme.folders.associations 항목이 있다면, 그 안에 원하는 항목만 추가하면 됩니다.</p>
<pre><code># &quot;rtl&quot; 이름의 폴더 아이콘을 &quot;core&quot; 폴더 아이콘과 매칭
json&quot;material-icon-theme.folders.associations&quot;: {
    &quot;rtl&quot;: &quot;core&quot;,
    &quot;components&quot;: &quot;component&quot;,
    &quot;utils&quot;: &quot;helper&quot;
}</code></pre><h4 id="3-저장-및-확인">3. 저장 및 확인</h4>
<p>Ctrl+S로 저장하면 즉시 아이콘이 변경된 것을 확인할 수 있습니다.</p>
<ul>
<li>설정 적용 전
<img src="https://velog.velcdn.com/images/young-0320/post/91fa47cd-eea8-4a95-be8d-229ef1484276/image.png" alt=""></li>
<li>설정 적용 후
<img src="https://velog.velcdn.com/images/young-0320/post/cae658a4-7c48-4fea-953e-ca0b4cbaf32a/image.png" alt=""></li>
</ul>
<h3 id="b-verilog-hdlsystemverilogbluespec-systemverilog">B. Verilog-HDL/SystemVerilog/Bluespec SystemVerilog</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/17012e05-4b02-4fd4-839a-df37aea01f23/image.png" alt="">
하드웨어 설계 언어(HDL)를 지원하는 VS Code 익스텐션입니다.</p>
<p>다만 이 익스텐션은 린터나 포매터 그 자체가 아니라, 외부 엔진을 VS Code에 연결해주는 프론트엔드(대시보드) 역할을 합니다. 따라서 익스텐션만 설치한다고 해서 자동 포맷이나 의미 있는 진단이 바로 동작하지는 않습니다. </p>
<p>제대로 활용하려면 프로젝트에 맞는 <strong>린터(Linter)</strong>와 <strong>포매터(Formatter)</strong>를 별도로 설치한 뒤, VS Code가 해당 바이너리를 정확히 호출할 수 있도록 경로와 옵션을 직접 설정해줘야 합니다.</p>
<ul>
<li><p><strong>린터(Linter):</strong>
소스 코드를 “컴파일러처럼” 읽어서 문법 오류, 잠재 버그를 잡아주는 검사기입니다.</p>
</li>
<li><p><strong>포매터(Formatter):</strong>
코드의 기능은 바꾸지 않고 들여쓰기, 개행, 정렬, 공백 규칙같은 포맷을 맞춰주는 도구입니다.</p>
</li>
</ul>
<p><strong>세부 설정 방법</strong>
린터/포매터는 Verible을 선택했습니다. </p>
<h4 id="1--github-릴리즈-페이지에서-다운로드">1.  GitHub 릴리즈 페이지에서 다운로드</h4>
<p><a href="https://github.com/chipsalliance/verible/releases">https://github.com/chipsalliance/verible/releases</a>
<img src="https://velog.velcdn.com/images/young-0320/post/72cb05c7-18f6-4a46-825b-25b1c6ca7e0b/image.png" alt=""></p>
<h4 id="2-릴리즈-파일-다운로드-및-압축-해제">2. 릴리즈 파일 다운로드 및 압축 해제</h4>
<p>Ubuntu 22.04 x86_64 환경에 맞는 tar.gz 파일을 선택해 다운로드합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/484f9fef-d7f5-4630-8f53-917e6889b127/image.png" alt=""></p>
<p>다운로드가 완료되면 ~/Downloads 디렉토리에서 압축을 해제합니다.</p>
<pre><code># 압축 해제
cd ~/Downloads
tar -xzf verible-*.tar.gz</code></pre><h4 id="3-시스템-경로에-설치">3. 시스템 경로에 설치</h4>
<p>압축 해제된 파일을 시스템 전역에서 사용할 수 있도록 <code>/opt/verible</code> 디렉토리를 생성하고 복사합니다.</p>
<pre><code>sudo mkdir -p /opt/verible
sudo rsync -a --delete verible-*/ /opt/verible/</code></pre><p><code>rsync -a</code> 옵션은 파일의 권한·타임스탬프 등 속성을 그대로 유지하며 복사하고, <code>--delete</code>는 대상 디렉토리에 남아 있는 불필요한 구버전 파일을 자동으로 제거합니다. 
덕분에 향후 버전을 업그레이드할 때도 동일한 명령어를 재사용할 수 있습니다.</p>
<h4 id="4-심볼릭-링크-설정">4. 심볼릭 링크 설정</h4>
<p><code>/usr/local/bin</code>에 심볼릭 링크를 생성하여 터미널 어디서든 Verible 명령어를 바로 호출할 수 있도록 합니다.</p>
<pre><code>sudo ln -sf /opt/verible/bin/verible-verilog-format /usr/local/bin/verible-verilog-format
sudo ln -sf /opt/verible/bin/verible-verilog-lint   /usr/local/bin/verible-verilog-lint
sudo ln -sf /opt/verible/bin/verible-verilog-ls     /usr/local/bin/verible-verilog-ls</code></pre><p>-s는 심볼릭 링크 생성, -f는 동일한 이름의 링크가 이미 존재할 경우 덮어쓰기를 의미합니다. 
버전 업그레이드 시 <code>/opt/verible</code> 내용만 교체하면 링크를 다시 만들 필요 없이 자동으로 새 버전을 가리키게 됩니다.</p>
<h4 id="5-설치-확인">5. 설치 확인</h4>
<p>아래 명령어로 설치가 정상적으로 완료되었는지 검증합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/b936c357-1fb8-49c0-a835-6ff70cfcfed2/image.png" alt=""></p>
<pre><code>which verible-verilog-format verible-verilog-lint verible-verilog-ls
readlink -f /usr/local/bin/verible-verilog-format
readlink -f /usr/local/bin/verible-verilog-lint
verible-verilog-format --version
verible-verilog-lint --version</code></pre><p>which 명령이 <code>/usr/local/bin/...</code> 경로를 반환하고, readlink -f가 <code>/opt/verible/bin/...</code>로 실제 바이너리 경로를 추적하며, --version이 설치된 버전 문자열을 출력하면 정상 설치가 완료된 것입니다.</p>
<h4 id="6-vs-code에서-세부-설정">6. VS Code에서 세부 설정</h4>
<p><strong>6.1 Formatting 설정</strong>
<code>Ctrl + ,</code>로 익스텐션 설정 창을 열어 아래 항목들을 순서대로 설정합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/adf83d33-59df-489d-8602-c9d0f8f894cd/image.png" alt=""></p>
<p><strong>6.1.1 System Verilog(.sv) 포매터를 지정</strong>
<code>Verilog &gt; Formatting &gt; SystemVerilog: Formatter → verible-verilog-format</code>
<img src="https://velog.velcdn.com/images/young-0320/post/be7eb491-f47f-493f-a1e6-a049c8ec74e7/image.png" alt=""></p>
<p><strong>6.1.2 바이너리 경로 지정</strong>
<code>Verilog &gt; Formatting &gt; Verible Verilog Formatter: Path</code>
<img src="https://velog.velcdn.com/images/young-0320/post/7f09e58d-f61d-4381-8873-2bc29231ef10/image.png" alt=""></p>
<p>경로란에는 <code>verible-verilog-format</code>을 입력합니다. 
만약 이 방식으로 동작하지 않는다면 <code>/usr/local/bin/verible-verilog-format</code>과 같이 절대 경로를 직접 입력합니다.</p>
<p><strong>6.1.3 Verilog HDL(.v) 포매터 지정</strong>
<code>Verilog &gt; Formatting &gt; Verilog HDL: Formatter → verible-verilog-format</code>
<img src="https://velog.velcdn.com/images/young-0320/post/4be5d1dd-63b6-4790-a250-ccda2dc593bd/image.png" alt=""></p>
<p><strong>6.2 linting 설정</strong>
<strong>6.2.1 linter 지정</strong>
<code>Verilog &gt; Linting: Linter → verible-verilog-lint</code>
<img src="https://velog.velcdn.com/images/young-0320/post/73ae8d5e-8dde-4cc5-a1a1-f0b738b8ee83/image.png" alt=""></p>
<p><strong>6.3 Format On Save 활성화</strong>
<code>Ctrl+S</code> 저장 시 자동으로 포매팅이 실행되도록 VS Code 기본 설정에서 <code>Editor: Format On Save</code>(<code>editor.formatOnSave</code>)를 활성화합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/51f3312e-4c8e-463f-943d-e959503dbb10/image.png" alt=""></p>
<h3 id="c-mips-support-rainbow-csv">C. MIPS Support, Rainbow CSV</h3>
<p><strong>MIPS Support:</strong>
MIPS 어셈블리 언어를 위한 익스텐션입니다.</p>
<p><strong>Rainbow CSV:</strong>
CSV 파일을 컬럼별로 다른 색으로 표시해주는 익스텐션입니다.</p>
<h2 id="마무리하며">마무리하며</h2>
<p>VSCode의 생산성을 높여주는 주요 익스텐션들을 소개했습니다.</p>
<p>처음부터 익스텐션들을 전부 설치할 필요는 없고, 자신의 작업 환경에 맞춰 필요한 것들만 골라 사용하면 됩니다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #13 : Ubuntu에서 생산성 극대화하기]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-12-Ubuntu%EC%97%90%EC%84%9C-%EC%83%9D%EC%82%B0%EC%84%B1-%EA%B7%B9%EB%8C%80%ED%99%94%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-12-Ubuntu%EC%97%90%EC%84%9C-%EC%83%9D%EC%82%B0%EC%84%B1-%EA%B7%B9%EB%8C%80%ED%99%94%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 09 Feb 2026 11:48:40 GMT</pubDate>
            <description><![CDATA[<p>우분투 24.04 환경에서 유용하게 사용하고 있는 도구를 소개합니다. </p>
<p>Rust와 Zig 기반의 고성능 설계로 하드웨어 리소스를 효율적으로 사용하는 Ghostty, 그리고 네트워크만 연결되어 있다면 어떤 기기와도 즉시 연결되는 LocalSend입니다.</p>
<h2 id="1-터미널-선택">1. 터미널 선택</h2>
<p><strong>고성능 중심의 터미널</strong> </p>
<ul>
<li>Ghostty: 균형 잡힌 고성능 터미널</li>
<li>Alacritty: 세상에서 가장 빠른 터미널을 표방</li>
</ul>
<p><strong>사용자 편의성 및 AI 통합 중심의 터미널</strong></p>
<ul>
<li>Warp: AI 에이전트가 내장된 Rust 기반 터미널</li>
<li>Wave: 오픈 소스 기반의 현대적 터미널</li>
</ul>
<h3 id="선택한-터미널--ghostty">선택한 터미널 : Ghostty</h3>
<p>텍스트 출력이 많은 작업을 하고 있고 렌더링 레이턴시가 적은 것을 선호하기에 해당 터미널을 선택했습니다. 또한 작업 환경이 원격 데스크탑에 접속하는 일이 잦기에 미세한 이질감을 줄여준다고 생각했습니다.</p>
<p><strong>개발 환경 요약 : Ghostty + 5.3 Codex + 최소한의 도구</strong></p>
<h3 id="ghostty-설치">Ghostty 설치</h3>
<h4 id="ghostty-다운로드-가이드-확인">Ghostty 다운로드 가이드 확인</h4>
<p>공식 홈페이지 : <a href="https://ghostty.org/docs">https://ghostty.org/docs</a></p>
<p><strong>다운로드 방식</strong></p>
<ul>
<li>소스 코드를 직접 zig로 빌드하여 사용</li>
<li>배포된 빌드 파일을 설치하여 사용</li>
</ul>
<p>일반 사용자에게는 소스 코드를 직접 빌드하는 것이 권장되지 않기에 바이너리 파일을 설치하겠습니다.</p>
<p>홈페이지를 확인해 보면 우분투 24.04는 공식 바이너리 파일이 없어 GitHub 커뮤니티에서 만든 빌드 파일을 설치해야 합니다.</p>
<p>이미지에서 볼 수 있듯 공식 릴리즈가 아니므로 업데이트 시 호환성 이슈가 발생할 수 있습니다. 
<img src="https://velog.velcdn.com/images/young-0320/post/43b8b5aa-a769-4996-8064-7ce910ccfa1d/image.png" alt="">
해당 깃허브 페이지에 방문하여 README를 읽어 설치 방법을 확인합니다.
<a href="https://github.com/mkasberg/ghostty-ubuntu">https://github.com/mkasberg/ghostty-ubuntu</a>
<img src="https://velog.velcdn.com/images/young-0320/post/29f56c8b-cd7f-4f32-8be1-3831f2fd6b55/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/42f08eec-97d5-4db3-8411-68cee40fa448/image.png" alt="">
Ubuntu 24.04 + x86_64 버전에 맞는 링크를 클릭해 설치해 줍니다.
<img src="https://velog.velcdn.com/images/young-0320/post/3de2b1a3-ca51-4977-8a1f-15df858fab1b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/22ffe2dd-3c75-47c3-8bc3-cef8b88345ed/image.png" alt=""></p>
<pre><code>sudo dpkg -i ghostty_1.2.3-0.ppa1_amd64_24.04.deb
sudo apt -f install</code></pre><p>해당 명령어를 이용하여 설치를 완료해 줍니다.</p>
<p><strong>설치 확인</strong>
<img src="https://velog.velcdn.com/images/young-0320/post/09af2f36-ca6e-458c-9107-83b8aea1782a/image.png" alt="">
성공!</p>
<p>*<em>실행 *</em></p>
<pre><code>ghostty</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/f965c2af-87a7-40fd-b971-62a475b5df14/image.png" alt=""></p>
<h2 id="2-localsend">2. LocalSend</h2>
<p>에어드롭의 크로스플랫폼 버전 프로그램입니다.</p>
<pre><code># 설치
sudo snap install localsend

# 실행
localsend</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/9e9fbd5f-653c-4342-8bde-9a4436c8d18e/image.png" alt=""></p>
<h3 id="사용-방법">사용 방법</h3>
<h4 id="1-우분투에서-localsend-실행">1. 우분투에서 LocalSend 실행</h4>
<ul>
<li>앱 메뉴에서 &quot;LocalSend&quot; 검색해서 실행
-또는 터미널에서 localsend 입력</li>
</ul>
<h4 id="2-아이패드아이폰에-앱-설치">2. 아이패드/아이폰에 앱 설치</h4>
<ul>
<li>App Store에서 &quot;LocalSend&quot; 검색 후 설치</li>
<li>안드로이드는 Play Store에서 설치</li>
</ul>
<h4 id="3-같은-wifi에-연결">3. 같은 WiFi에 연결</h4>
<ul>
<li>우분투와 아이패드가 같은 WiFi에 연결되어 있어야 함</li>
</ul>
<h4 id="4-파일-전송">4. 파일 전송</h4>
<ul>
<li><strong>아이패드 → 우분투:</strong></li>
</ul>
<ol>
<li>아이패드에서 LocalSend 앱 실행</li>
<li>근처 기기에서 우분투 컴퓨터가 보임</li>
<li>보낼 파일 선택 → 우분투 선택 → 전송</li>
<li>우분투에서 수락하면 다운로드됨 (기본 위치: ~/Downloads)</li>
</ol>
<ul>
<li><strong>우분투 → 아이패드:</strong></li>
</ul>
<ol>
<li>우분투 LocalSend에서 파일 선택 또는 드래그 앤 드롭</li>
<li>근처 기기 목록에서 아이패드 선택</li>
<li>아이패드에서 수락</li>
</ol>
<h2 id="마무리하며">마무리하며</h2>
<p><strong>기본 터미널과 카카오톡 전송을 졸업하며</strong>
이제 세련된 고성능 터미널과 OS 간 장벽 없는 파일 전송 환경이 갖춰졌습니다. 
불필요한 레이턴시와 연결의 번거로움을 덜어낸 이 미니멀한 셋업이, 앞으로의 개발 몰입도를 한 층 높여줄 것이라 생각합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #11 : PSpice 설치 가이드]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-11-PSpice-%EC%B2%98%EC%9D%8C-%EC%84%A4%EC%B9%98%ED%95%98%EB%8A%94-%EC%82%AC%EB%9E%8C%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-11-PSpice-%EC%B2%98%EC%9D%8C-%EC%84%A4%EC%B9%98%ED%95%98%EB%8A%94-%EC%82%AC%EB%9E%8C%EC%9D%84-%EC%9C%84%ED%95%9C-%EA%B0%80%EC%9D%B4%EB%93%9C</guid>
            <pubDate>Mon, 09 Feb 2026 11:20:05 GMT</pubDate>
            <description><![CDATA[<p>이번 포스트에서는 Windows에 TEXAS INSTRUMENTS에서 제공하는 무료 버전 PSpice를 다운로드해 보겠습니다.</p>
<p>PSpice는 Cadence에서 제공하는 회로 시뮬레이션 도구입니다.</p>
<h3 id="윈도우-사용자-이름-확인">윈도우 사용자 이름 확인</h3>
<p>PSpice 설치 전 윈도우 사용자 이름이 영문인지와 윈도우 버전을 확인해야 합니다.</p>
<ol>
<li><p>Win + R 키를 누른 뒤 <code>cmd</code>를 입력하고 엔터를 칩니다.</p>
</li>
<li><p>입력창에 <code>whoami</code>를 입력합니다.</p>
</li>
<li><p>출력되는 이름이 한글이라면 문제가 발생할 확률이 높고, 영문이라면 안전합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/bb61cb06-6f11-43c3-a118-ebd02128a4de/image.png" alt=""></p>
</li>
</ol>
<p><strong>만약 사용자 이름이 한글인 경우</strong>:
기존 계정 이름을 바꾸는 것은 레지스트리 충돌 위험이 큽니다. 일반적으로 활용되는 해결 방법은 <strong>&#39;설정 &gt; 계정 &gt; 다른 사용자&#39;</strong>에서 영문 이름으로 된 새로운 로컬 계정을 하나 생성하여 툴 전용 계정으로 사용하는 것입니다.</p>
<h3 id="윈도우-버전-확인">윈도우 버전 확인</h3>
<ol>
<li><p>Win + R 키를 누른 뒤 <code>cmd</code>를 입력하고 엔터를 칩니다.</p>
</li>
<li><p>입력창에 <code>winver</code>를 입력합니다.</p>
</li>
<li><p>팝업창에 해당 Windows 버전(예: 22H2, 23H2)과 빌드 번호를 즉시 확인할 수 있습니다.</p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/young-0320/post/880b6244-eb50-4ab7-83ca-ff4e7697b531/image.png" alt=""></p>
<h2 id="pspice-for-ti-설치-가이드">PSpice for TI 설치 가이드</h2>
<h3 id="1-texas-instruments의-공식-홈페이지에-방문하여-request-버튼을-누릅니다">1. TEXAS INSTRUMENTS의 공식 홈페이지에 방문하여 Request 버튼을 누릅니다.</h3>
<p>공식 홈페이지 <a href="https://www.ti.com/tool/PSPICE-FOR-TI">https://www.ti.com/tool/PSPICE-FOR-TI</a>
<img src="https://velog.velcdn.com/images/young-0320/post/3e9a7924-6448-4cbc-a909-3ced3d752669/image.png" alt=""></p>
<h3 id="2-회원가입을-진행해줍니다">2. 회원가입을 진행해줍니다.</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/1627e9f4-ae0d-45d6-9f2b-1655b6d28333/image.png" alt=""></p>
<h3 id="3-로그인-후-해당-정보들을-입력해줍니다">3. 로그인 후 해당 정보들을 입력해줍니다.</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/c6a7243a-4d59-4ff6-9fff-37298d5fc19b/image.png" alt=""></p>
<h4 id="3-1-create-an-address">3-1. Create an address</h4>
<p>주소는 경희대학교 국제캠퍼스를 입력하였습니다. 
<strong>Company name</strong>: Kyung Hee University
<strong>Company URL</strong>: <a href="http://www.khu.ac.kr">www.khu.ac.kr</a>
<img src="https://velog.velcdn.com/images/young-0320/post/4d512fd0-2eab-4241-aa36-09902e8ea5d2/image.png" alt="">
상세 주소를 입력해줍니다.
<img src="https://velog.velcdn.com/images/young-0320/post/86126a79-8974-48e9-949c-be70a4cea9a1/image.png" alt=""></p>
<p><strong>Address Line 1</strong>: 1732, Deogyeong-daero, Giheung-gu</p>
<p><strong>City</strong>: Yongin-si</p>
<p><strong>State/Province</strong>: Gyeonggi-do</p>
<p><strong>Zip/Postal code</strong>: 17104</p>
<h4 id="3-2-create-a-checkout-profile">3-2. Create a checkout profile</h4>
<p>단계 별로 진행해 줍니다.
<img src="https://velog.velcdn.com/images/young-0320/post/78922cbd-7d40-49c3-8c13-4b8eb29c3db6/image.png" alt="">
<img src="https://velog.velcdn.com/images/young-0320/post/2ac6a346-e902-4cdf-92e5-b41e394b302b/image.png" alt="">
<img src="https://velog.velcdn.com/images/young-0320/post/e9659e2b-d2cd-4ca5-b5ff-eb5270f0276f/image.png" alt="">
<img src="https://velog.velcdn.com/images/young-0320/post/64181008-fcde-4c38-b740-fce86751a347/image.png" alt="">
<img src="https://velog.velcdn.com/images/young-0320/post/592a1a75-62d0-4c31-8ae6-d920a52b76ae/image.png" alt="">
<img src="https://velog.velcdn.com/images/young-0320/post/c3a3d487-c126-4119-818b-48672a2c689c/image.png" alt="">
마지막으로 Save를 눌러 저장을 합니다.</p>
<h3 id="4-request-창으로-돌아가서-submit-버튼을-눌러줍니다">4. Request 창으로 돌아가서 Submit 버튼을 눌러줍니다.</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/71af8c83-ab5b-4e9e-b979-815f63efb068/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/7e8c9c61-9ddb-4579-9443-c77ac0f000e8/image.png" alt="">
이제 약 5~10분 이내에 가입 한 이메일로 28자리의 Access Key가 발송될 것입니다.</p>
<h3 id="5-메일을-확인해-줍니다">5. 메일을 확인해 줍니다.</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/55eea86b-2a08-4b77-9eb4-2339118ae473/image.png" alt="">
메일에 포함된 링크를 클릭하여 페이지로 이동한 다음 로그인을 완료합니다.</p>
<h3 id="6-pspice를-설치해-줍니다">6. PSPice를 설치해 줍니다.</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/2e9eb1f9-d83f-4e3d-8fd2-9abb8bf8ee01/image.png" alt="">
Download 버튼을 클릭하여 설치를 진행합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/cf43e4c0-e512-4924-a3a2-9bca2ce99da2/image.png" alt="">
가입한 이메일과 메일로 전달받은 Access Key를 입력합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/0805cebe-efa4-47f6-8ef7-5002086c1fd8/image.png" alt="">
이후 설치가 자동으로 진행됩니다.
<img src="https://velog.velcdn.com/images/young-0320/post/d2f5ef5b-9064-4252-82cc-01e1465c7f1e/image.png" alt="">
설치가 완료되면 정상적으로 실행할 준비가 끝납니다.
<img src="https://velog.velcdn.com/images/young-0320/post/4a00e20e-00ec-4851-8a2e-2e3cd567cdc0/image.png" alt="">
성공!</p>
<h3 id="마무리하며">마무리하며</h3>
<p>이번 과정에서는 업계 표준 아날로그 회로 시뮬레이터 PSpice를 설치하고 설계를 진행할 수 있는 환경을 준비했습니다.</p>
<p>다음 포스팅에서는 VS Code에서 프로젝트를 설정하고, 보다 효율적으로 작업하기 위한 생산성 향상 방법들을 다뤄보겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[현대적 C++ 프로젝트 관리의 표준 : CMake의 필요성과 사용 방법]]></title>
            <link>https://velog.io/@young-0320/CMake-%EB%AC%B8%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@young-0320/CMake-%EB%AC%B8%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Mon, 09 Feb 2026 09:34:09 GMT</pubDate>
            <description><![CDATA[<p>C/C++ 개발자가 IDE의 빌드 버튼 하나로 프로그램을 실행하는 것은 편리하지만, 프로젝트의 규모가 커지고 협업 환경이 다양해지면 곧 한계에 부딪힙니다. </p>
<p>내 컴퓨터(Windows/VS)에서는 잘 돌아가는 코드가 서버(Linux/GCC)에서는 빌드조차 되지 않는 상황, 이 &#39;환경의 파편화&#39;를 해결하는 것이 바로 CMake의 존재 이유입니다.</p>
<h2 id="1-cmake란-무엇인가">1. CMake란 무엇인가?</h2>
<p><img src="https://velog.velcdn.com/images/young-0320/post/e5ddf628-2f80-4a40-9a64-4b8f1255915f/image.png" alt=""></p>
<p><strong>CMake는 특정 IDE나 OS에 종속되지 않는 독립적인 빌드 환경을 구축하기 위한 &#39;메타 빌드 시스템&#39;입니다.</strong></p>
<p>C/C++ 프로젝트를 빌드할 때는 전통적으로 Makefile을 작성해야 합니다. 
하지만 개발자가 Makefile이나 Solution 파일을 직접 짜는 대신, 고수준의 설정 파일(CMakeLists.txt)만 작성하면 CMake가 타겟 환경에 맞는 빌드 파일을 알아서 빌드를 해줍니다.</p>
<p>또한 운영체제마다 다른 빌드 시스템(Linux의 Make, Windows의 Visual Studio 등)을 사용하기 때문에 OS별로 빌드 스크립트를 중복 관리할 필요가 없습니다.</p>
<p>소스 파일이 늘어나도 설정 파일의 변수나 와일드카드 기능을 통해 복잡한 의존 관계를 간단하게 업데이트할 수 있습니다.</p>
<h2 id="2-cmake의-필요성">2. CMake의 필요성</h2>
<p>왜 CMake를 사용해야 할까요? 단순히 Visual Studio를 쓰기 싫어서가 아니라, 
어떤 환경에서도 동작하는 지속 가능한 빌드 시스템이 필요하기 때문입니다.</p>
<p>전통적으로 Visual Studio 같은 IDE 없이 직접 코드를 빌드하기 위해서는 컴파일러 명령어를 터미널에 직접 입력해야 합니다. </p>
<pre><code># 1. 각 소스 파일(.c)을 컴파일하여 기계어인 목적 파일(.o)로 변환
gcc -c main.c   # main.c -&gt; main.o 생성
gcc -c A.c      # A.c -&gt; A.o 생성

# 2. 생성된 목적 파일들을 하나로 Link하여 최종 실행 파일(code.out) 생성
gcc -o code.out main.o A.o</code></pre><p>파일이 2~3개일 때는 문제가 없지만, 소스 파일이 수십, 수백 개로 늘어난다면 이런 명령어를 매번 입력하는 것은 불가능에 가깝습니다.</p>
<p>이 과정을 자동화하기 위해 make가 등장했습니다. 
Makefile에 빌드 규칙을 한 번만 적어두면, make가 파일의 변경 사항을 감지하여 필요한 부분만 효율적으로 컴파일해 줍니다. 즉 모든 명령어를 입력할 필요 없이 <code>make</code> 입력 한번으로 끝납니다.</p>
<pre><code># Makefile 예시
code.out: main.o A.o
    gcc -o code.out main.o A.o

main.o: main.c
    gcc -c main.c

A.o: A.c
    gcc -c A.c</code></pre><p>make는 훌륭한 도구이지만, 다음과 같은 한계가 있습니다.</p>
<p><strong>1. 플랫폼 종속성</strong>: 리눅스에서 작성한 Makefile은 윈도우의 nmake나 Visual Studio 환경에서 그대로 사용할 수 없습니다. 운영체제마다 빌드 도구가 다르기 때문입니다.</p>
<p><strong>2. 복잡한 문법</strong>: 프로젝트가 커질수록 Makefile 자체의 문법이 난해해져 유지보수가 어려워집니다.</p>
<p><strong>3. IDE와의 연동성 부족</strong>: 현대 엔지니어링에서는 VS Code, CLion, Visual Studio 등 다양한 에디터를 사용하는데, 각 에디터에 맞는 프로젝트 파일을 수동으로 생성하는 것은 매우 비효율적입니다.</p>
<p>결국 CMake는 운영체제마다 다른 Makefile이나 프로젝트 파일을 자동으로 생성해 주는 메타 빌드 시스템으로서, 현대 C/C++ 개발 환경의 사실상 표준이 되었습니다.</p>
<h2 id="3-cmake-문법">3. CMake 문법</h2>
<p>Cmake의 단계는 아래 이미지와 같습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/c315dba6-70bb-4386-b731-f40af2295193/image.png" alt=""></p>
<p>CMake 문법을 3단계로 나누어서 설명해 보겠습니다.</p>
<p>🟢 <strong>당장 프로젝트를 빌드하는 데 필요한 것(기초)</strong></p>
<p>🟡 <strong>협업·확장 가능한 구조를 만드는 데 필요한 것(모듈화)</strong></p>
<p>🔵 <strong>대형 프로젝트, 패키징, 자동화까지 다루는 영역(심화-생략)</strong></p>
<p>CMake 문법 자체가 워낙 방대하고 어려운 부분도 있어 해당 포스팅에서는 2단계까지만 설명하겠습니다.</p>
<h3 id="🟢-당장-프로젝트를-빌드하는-데-필요한-것기초">🟢 당장 프로젝트를 빌드하는 데 필요한 것(기초)</h3>
<p>최소한의 빌드 환경 구축에는 다음과 같은 과정이 필요합니다.</p>
<p>해당 단계의 목표는 수동으로 <code>gcc</code> 명령어를 치던 과정을 <code>CMakeLists.txt</code> 파일로 대체하는 것입니다. 이때 파일 이름은 대소문자를 구분하여 생성해야 합니다.</p>
<ol>
<li>프로젝트 루트 디렉토리에 <code>CMakeLists.txt</code> 파일을 생성합니다.</li>
<li>해당 파일 안에 다음과 같은 필수 코드들을 입력합니다.</li>
</ol>
<ul>
<li><p><code>cmake_minimum_required(VERSION [버전])</code> : CMake의 최소 버전을 지정합니다.</p>
</li>
<li><p><code>project([프로젝트 이름] VERSION [발전 단계] LANGUAGES [사용 언어])</code> :  프로젝트 정보들을 설정합니다.</p>
</li>
<li><p><code>add_executable([실행파일 이름] [필요한 소스 파일들])</code> : 실행파일을 빌드할 때 [필요한 소스 코드들]을 컴파일하고 링크하여 [실행파일 이름]이라는 실행파일을 생성합니다.</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/young-0320/post/de32e401-057f-4685-b40f-c30ecb67ef71/image.png" alt=""></p>
<ul>
<li>최소 버전은 3.10으로 지정했습니다.</li>
<li>프로젝트의 이름은 CH11이고 버전은 0.1.0, 사용 언어는 C와 C++입니다.</li>
<li>mycomplex.cpp와 mycomplex_test.cpp 소스 파일을 컴파일하고 링크하여 LAB11이라는 실행파일을 빌드합니다.<pre><code># 폴더 구조
Project_Root/
├── CMakeLists.txt
├── mycomplex.cpp
└── mycomplex_test.cpp</code></pre><h3 id="🟡-협업·확장-가능한-구조를-만드는-데-필요한-것모듈화">🟡 협업·확장 가능한 구조를 만드는 데 필요한 것(모듈화)</h3>
프로젝트가 커지면 모든 소스를 한곳에 두는 것은 불가능합니다. 
CMake의 핵심은 물리적으로는 폴더(Directory)로 나누고, 
논리적으로는 타겟(Target)으로 묶어 의존성을 관리하는 것입니다.</li>
</ul>
<h4 id="1-물리적-계층-구조">1. 물리적 계층 구조</h4>
<p><code>add_subdirectory()</code>를 사용하면 프로젝트를 기능 단위로 물리적으로 분리할 수 있습니다. 
프로젝트의 파일 구조를 트리 형태로 조직화하여 관리의 편의성을 높이는 것입니다 </p>
<p>폴더별로 CMakeLists.txt를 두어 해당 폴더 내의 소스들만 관리하게 함으로써 관심사를 분리합니다.</p>
<p><strong>기본적으로 다음의 구조를 따릅니다.</strong></p>
<pre><code># 폴더 구조
FIR-FILTER/
  ├── CMakeLists.txt                  # [Root] 프로젝트 전체 관리 정의
  ├── lib
  │   ├── CMakeLists.txt              # `mycomplex` 정적 라이브러리 타깃 정의
  │   ├── mycomplex.h                 # `MyComplex` 클래스 선언(헤더)
  │   └── mycomplex.cpp               # `MyComplex` 클래스 구현(소스)
  └── fir_1d
      ├── model
      │   └── cpp
      │       ├── CMakeLists.txt      # fir_1d_ref 정적 라이브러리 타겟 정의
      │       ├── fir_1d_ref.h        # 1D FIR 모델 인터페이스(클래스 선언)
      │       └── fir_1d_ref.cpp      # 1D FIR 모델 구현
      └── sim
          └── tests
              └── CMakeLists.txt      # 최종 실행 파일 타겟 정의</code></pre><h4 id="2-단계별-구현">2. 단계별 구현</h4>
<p><strong>A. 최상위 <code>CMakeLists.txt</code>가 가장 먼저 호출되어 프로젝트를 정의하고 하위 작업을 지정합니다.</strong>
<img src="https://velog.velcdn.com/images/young-0320/post/4d8e7807-6843-4ca5-a35c-b848691ed9fc/image.png" alt=""></p>
<pre><code># Root CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(FIR-FILTER VERSION 1.0 LANGUAGES C CXX)

# 하위 디렉토리 추가 (컴파일 순서 제어)
add_subdirectory(lib)

add_subdirectory(fir_1d/model/cpp)
add_subdirectory(fir_1d/sim/tests)</code></pre><p>이때 하위 디렉토리는 명령어가 나열된 순서대로 탐색됩니다. 
따라서 fir_1d와 같은 하위 디렉토리에서 lib의 결과물을 참조하여 빌드하려면, 반드시 lib을 먼저 추가하여 라이브러리 타겟이 먼저 정의되도록 해야 합니다.</p>
<p><strong>B. 범용 라이브러리 모듈화</strong>
소스 코드를 재사용 가능한 이진 파일(Target)로 캡슐화하고, 컴파일에 필요한 헤더 경로를 외부에 전파합니다.</p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/e9b3a4ac-a85f-4fb1-a145-1c41ac44ef08/image.png" alt="">
mycomplex라는 이름의 정적 라이브러리를 생성하고 이를 사용할 다른 타겟들에게 헤더 위치를 공개합니다.</p>
<pre><code># Lib CMakeLists.txt
# 라이브러리 생성
add_library(mycomplex 
    [STATIC|SHARED|MODULE] 
    mycomplex.cpp
)</code></pre><ul>
<li><p><strong>STATIC</strong> : 정적 라이브러리(.a, .lib). 컴파일 시 실행 파일에 포함됩니다. 용량이 증가하지만 배포가 간편하여 보통 기본값으로 사용됩니다.</p>
</li>
<li><p><strong>SHARED</strong> : 동적 라이브러리(.dll, .dylib). 실행 시 메모리에 로드됩니다. 실행 파일 용량은 줄어들지만, 실행 환경에 해당 라이브러리 파일이 함께 배포되어야 합니다.</p>
</li>
<li><p><strong>MODULE</strong> : 런타임에 동적으로 로드되는 플러그인 형식의 라이브러리입니다.</p>
<pre><code># mycomplex가 사용할 헤더 파일 경로 지정
target_include_directories(mycomplex 
  [PRIVATE|PUBLIC|INTERFACE] 
  ${CMAKE_CURRENT_SOURCE_DIR}
)</code></pre></li>
<li><p><strong>PRIVATE</strong> : 내부 구현용으로, 헤더 경로가 내(mycomplex) 빌드에만 필요함</p>
</li>
<li><p><strong>PUBLIC</strong> : 공개용으로, mycomplex 빌드에도 필요하고 나를 가져다 쓰는 상위 타겟(fir_1d_ref 등) 모두에게 필요함</p>
</li>
<li><p><strong>INTERFACE</strong> : 인터페이스 전용으로, 나를 빌드할 땐 필요 없지만 나를 쓰는 타겟은 반드시 알아야 할 때 사용합니다.</p>
</li>
</ul>
<p><strong>C. 소스 파일의 라이브러리화</strong></p>
<p><code>fir_1d_ref</code> 라이브러리를 생성하고, 자체 헤더 경로와 하위 의존성(mycomplex)을 모두 PUBLIC으로 설정하여 상위 타겟(test_fir_1d)으로 한 번에 전파하는 과정입니다.
<img src="https://velog.velcdn.com/images/young-0320/post/4a336cdc-eb15-4b7a-badc-8412a8f5df3d/image.png" alt=""></p>
<pre><code>add_library(fir_1d_ref STATIC fir_1d_ref.cpp)

# 상위 타겟에 라이브러리 전파
target_include_directories(fir_1d_ref
    PUBLIC 
        ${CMAKE_CURRENT_SOURCE_DIR}
)

# 범용 라이브러리(mycomplex)를 fir_1d_ref와 연결
target_link_libraries(fir_1d_ref PUBLIC mycomplex)
</code></pre><ol>
<li><p>타겟 생성
fir_1d_ref.cpp 소스 코드를 컴파일하여 정적 라이브러리(STATIC)로 만듭니다. 하나의 독립적인 모듈 블록을 생성하는 것입니다.</p>
</li>
<li><p>헤더 경로 전파 (PUBLIC)
<code>target_include_directories</code>를 PUBLIC으로 설정합니다. 이는 fir_1d_ref를 빌드할 때뿐만 아니라, 이 라이브러리를 가져다 쓰는 상위 실행 파일에게도 &quot;내 헤더 파일은 이 폴더에 있어&quot;라고 위치를 알려주는 역할을 합니다.</p>
</li>
<li><p>라이브러리 체이닝 (의존성 상속)
fir_1d_ref가 동작하려면 앞서 만든 mycomplex 라이브러리가 필요합니다. 이를 PUBLIC으로 링크하면, 나중에 최종 실행 파일이 fir_1d_ref 하나만 링크하더라도 하위의 mycomplex까지 자동으로 딸려와서 링크됩니다. 즉, 의존성이 체인처럼 연결됩니다.</p>
</li>
</ol>
<p>참고:
<strong>하위 타겟 (Lower-level Target):</strong> 다른 모듈에 의존하지 않고 독립적으로 존재할 수 있는 기본 부품</p>
<ul>
<li>예: mycomplex 라이브러리 </li>
</ul>
<p><strong>상위 타겟 (Upper-level Target):</strong> 하위 부품들을 조립하여 더 복잡한 기능을 만드는 주체</p>
<ul>
<li>예: fir_1d_ref 라이브러리나 test_fir_1d 실행 파일 </li>
</ul>
<p><strong>D. 실행파일 및 라이브러리 연결</strong>
Modern CMake의 가장 강력한 기능입니다. 
복잡한 헤더 경로를 일일이 추가할 필요 없이, 단순히 타겟을 link하는 것만으로 라이브러리의 모든 정보(헤더 경로, 컴파일 옵션 등)를 자동으로 상속받습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/3e7cf54b-6314-4a6e-8de7-cf3dfbeaa472/image.png" alt=""></p>
<pre><code># App CMakeLists.txt
# 실행 파일 생성
add_executable(test_fir_1d
    test_fir_1d_golden.cpp
  )

# fir_1d_ref가 PUBLIC으로 공개한 헤더 경로와 컴파일 옵션을 자동으로 상속받습니다.
target_link_libraries(test_fir_1d PRIVATE fir_1d_ref)</code></pre><ul>
<li><strong>PRIVATE</strong> : test_fir_1d는 최종 실행 파일이므로 다른 타겟이 이를 다시 링크하여 사용할 일이 없습니다. 따라서 상속받은 의존성을 더 이상 전파하지 않고 여기서 마무리하기 위해 PRIVATE을 사용합니다.</li>
<li><strong>PUBLIC</strong> : 실행 파일은 최상위 계층이며 다른 타겟이 이를 링크하지 않으므로, 의존성을 외부로 전파하는 PUBLIC을 사용할 필요가 없습니다.</li>
</ul>
<h4 id="마무리--cmake-프로젝트-설계-흐름-요약">마무리 : CMake 프로젝트 설계 흐름 요약</h4>
<p>지금까지 다룬 내용을 바탕으로, 확장 가능한 프로젝트가 구성되는 단계별 흐름을 정리하면 다음과 같습니다.</p>
<p><strong>1. 물리적 격리 (add_subdirectory):</strong> 소스 코드를 기능별 폴더로 분리하고 Root에서 순차적으로 호출하여, 빌드 시스템의 스코프(Scope)를 명확히 나눕니다.</p>
<p><strong>2. 논리적 캡슐화 (add_library):</strong> 각 기능 모듈(예: mycomplex, fir_1d_ref)을 독립적인 타겟으로 묶어 재사용 가능한 블록으로 만듭니다.</p>
<p><strong>3. 인터페이스 정의 (target_include_directories):</strong> 가시성(PRIVATE/PUBLIC/INTERFACE)을 설정하여 내부 구현은 숨기고, 외부 타겟과 결합할 때 필요한 헤더 경로만 선택적으로 전파합니다.</p>
<p><strong>4. 의존성 체이닝 (target_link_libraries):</strong> 상위 타겟은 복잡한 경로 설정 없이 하위 타겟을 링크하는 것만으로 컴파일에 필요한 모든 정보를 자동으로 상속받아 최종 실행 파일(add_executable)을 완성합니다.</p>
<h2 id="4-cmake의-사용">4. CMake의 사용</h2>
<h3 id="1-vs-code의-cmake-toolsgui-방식">1. VS Code의 CMake Tools(GUI 방식)</h3>
<p>마이크로소프트가 제공하는 CMake Tools 익스텐션을 사용하면, 복잡한 명령어를 버튼 클릭으로 대체할 수 있습니다.</p>
<ul>
<li><strong>1. 설치 :</strong> VS Code 마켓플레이스에서 <code>CMake Tools</code> 설치합니다.</li>
<li><strong>2. 설정 :</strong> Command Palette의  <code>CMake: Configure</code>에서 컴파일러(Kit)를 선택하고, 빌드 시스템(Makefile 등)을 생성합니다.</li>
<li><strong>3. 빌드 :</strong> 하단 상태 표시줄의 Build 버튼 클릭 혹은 <code>F7</code>으로 빌드합니다.</li>
<li><strong>4. 실행 :</strong> 이후 하단 상태 표시줄의 화살표 버튼을 클릭하여 터미널에서 실행합니다.</li>
</ul>
<h3 id="2-터미널--cli">2. 터미널 / CLI</h3>
<h4 id="a-out-of-source-빌드-폴더를-생성합니다">A. Out-of-source 빌드 폴더를 생성합니다.</h4>
<pre><code>mkdir build
cd build</code></pre><p>소스 코드와 빌드 결과물(.o, 실행 파일 등)이 섞이지 않도록 별도의 build 디렉토리를 생성하고 진입합니다.</p>
<h4 id="b-빌드-시스템을-구성configure합니다">B. 빌드 시스템을 구성(Configure)합니다.</h4>
<pre><code>cmake ..</code></pre><p>현재 위치(build)에서 상위 디렉토리(..)에 있는 CMakeLists.txt를 읽어들여, 현재 OS와 컴파일러 환경에 맞는 빌드 시스템(Makefile 등)을 생성합니다. (Root 디렉토리로 이동하는 것이 아닙니다.)</p>
<h4 id="c-실제-빌드build를-수행합니다">C. 실제 빌드(Build)를 수행합니다.</h4>
<pre><code>cmake --build .</code></pre><p>생성된 빌드 시스템을 이용해 소스 코드를 컴파일하고 타겟들을 링킹하여 최종 실행 파일을 만듭니다.</p>
<h4 id="d-프로그램을-실행합니다">D. 프로그램을 실행합니다.</h4>
<pre><code>./fir_1d/sim/tests/test_fir_1d</code></pre><p>최종 산출물은 Root의 build 폴더를 기준으로 CMakeLists.txt가 있던 계층 구조를 그대로 따라 생성됩니다.</p>
<h4 id="표준-명령어-흐름">표준 명령어 흐름</h4>
<pre><code>mkdir build &amp;&amp; cd build          # 1. 빌드 폴더 격리
cmake ..                         # 2. 구성 (Configure)
cmake --build .                  # 3. 컴파일 및 링킹 (Build)
./fir_1d/sim/tests/test_fir_1d  # 4. 최종 실행 (Run)</code></pre><h2 id="마무리하며">마무리하며</h2>
<p>단순히 언어의 문법을 넘어, 코드가 어떻게 시스템 위에서 실행 파일이 되는지 이해해야 합니다.</p>
<p>프로젝트의 규모가 커지고 리눅스 서버나 임베디드 보드 등 다양한 환경을 마주하게 되면, &quot;어디서든 빌드되는 프로젝트&quot;를 설계하는 능력은 코딩 실력만큼이나 중요한 핵심 역량이 됩니다.</p>
<p>오늘 다룬 CMake는 단순한 컴파일 도구가 아닙니다. 
복잡한 의존성을 통제하고 자동화하는 엔지니어링의 기초입니다.</p>
<p>이 글이 IDE의 편리한 &#39;Build 버튼&#39; 뒤에 숨겨진 원리를 이해하고, 더 견고하고 확장 가능한 프로젝트를 설계하는 첫걸음이 되기를 바랍니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #10 : Ubuntu에서 C++ 툴체인 구축하기]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-10-Ubuntu%EC%97%90%EC%84%9C-C-%ED%88%B4%EC%B2%B4%EC%9D%B8-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-10-Ubuntu%EC%97%90%EC%84%9C-C-%ED%88%B4%EC%B2%B4%EC%9D%B8-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 08 Feb 2026 08:49:46 GMT</pubDate>
            <description><![CDATA[<p>이번 포스팅은 지난 파이썬 환경 구축(#9)에 이어, C++ 컴파일러와 CMake 빌드 시스템을 설치하고 설정하는 방법에 대해 알아보겠습니다.</p>
<h3 id="1-c-툴체인의-핵심-구성-요소">1. C++ 툴체인의 핵심 구성 요소</h3>
<ul>
<li>컴파일러 (g++)</li>
<li>빌드 시스템(CMake, make)</li>
<li>디버거(GDB)</li>
</ul>
<h4 id="1-g">1. g++</h4>
<pre><code>g++ --version</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/043f0eca-9ad6-4ce3-9b66-d7685401dbd4/image.png" alt="">
<strong>g++ version : 13.3.0</strong></p>
<p>만약 설치가 안되어 있다면 아래의 명령어로 설치합니다.</p>
<pre><code>sudo apt update
sudo apt install g++</code></pre><h4 id="2-cmake">2. cmake</h4>
<pre><code>cmake --version</code></pre><p>설치가 되어 있지 않아 에러 코드 출력되었습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/f2b9eec9-474c-4884-a7ef-3e04b1b21c51/image.png" alt="">
설치 후 다시 버전 확인합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/e0d2ab9e-a18f-47b6-92c2-48f29b941382/image.png" alt=""></p>
<p><strong>cmake version : 3.28.3</strong></p>
<h4 id="3-make">3. make</h4>
<pre><code>make -v</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/17bd52a2-2613-42f4-b92a-b543d1e1458c/image.png" alt=""></p>
<p><strong>make version : 4.3</strong></p>
<h4 id="4-gdb">4. GDB</h4>
<pre><code>gdb --version</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/73fa87f9-60bf-4e5a-9b27-8a2418748687/image.png" alt=""></p>
<p><strong>gdb version : 15.0.50</strong></p>
<h3 id="2-c-툴체인의-추가-구성-요소">2. C++ 툴체인의 추가 구성 요소</h3>
<ul>
<li>버전 관리 (Git)</li>
<li>가독성 향상 (clang-format)</li>
</ul>
<h4 id="1-git">1. Git</h4>
<p><img src="https://velog.velcdn.com/images/young-0320/post/6037c37c-83e6-4e44-97b7-2ba8ae128e0d/image.png" alt=""></p>
<p><strong>git version : 2.43.0</strong></p>
<h4 id="2-clang-format">2. clang-format</h4>
<pre><code>sudo apt install clang-format</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/0dee7469-923c-4fd6-b429-176009e30c31/image.png" alt=""></p>
<p><strong>clang-format version : 18.1.3</strong></p>
<h3 id="3-디지털-회로-설계-도구">3. 디지털 회로 설계 도구</h3>
<p><strong>시뮬레이션 및 검증:</strong></p>
<ul>
<li>Icarus Verilog (RTL 시뮬레이터)</li>
<li>Verilator (고성능 시뮬레이터)</li>
</ul>
<p><strong>분석 및 디버깅:</strong></p>
<ul>
<li>GTKWave (파형 분석)</li>
</ul>
<p><strong>텍스트 에디터:</strong></p>
<ul>
<li>Visual Studio Code (VS Code)</li>
<li>Emacs</li>
<li>Vi IMproved (Vim)</li>
</ul>
<h3 id="4-해당-툴-설치">4. 해당 툴 설치</h3>
<h4 id="1-icarus-verilog">1. Icarus Verilog</h4>
<pre><code># 버전 확인 
iverilog -v

# 설치되어 있지 않다면 
sudo apt update
sudo apt install iverilog</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/967ca7ba-8c4f-469b-ba37-8612473612ed/image.png" alt="">
<strong>iverilog version : 12.0</strong></p>
<h4 id="2-verilator">2. Verilator</h4>
<pre><code># 버전 확인 
verilator --version

# 설치되어 있지 않다면 
sudo apt install verilator</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/1dca268d-bae5-400a-9e0b-42da36f71066/image.png" alt=""></p>
<p><strong>verilator version : 5.020-1</strong></p>
<h4 id="3-gtkwave">3. GTKWave</h4>
<pre><code># 버전 확인 
gtkwave --version

# 설치되어 있지 않다면 
sudo apt install gtkwave</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/b4c38464-5b6b-4310-aab2-8af5af087831/image.png" alt=""></p>
<p><strong>gtkwave version : 3.3.116</strong></p>
<h4 id="4-visual-studio-code">4. Visual Studio Code</h4>
<pre><code># 버전 확인 
code --version

# 설치되어 있지 않다면 
sudo apt install code

# 실행
code .</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/9a457059-8a53-463d-92f9-cf184ae7655d/image.png" alt=""></p>
<p><strong>vscode version : 1.109.0</strong></p>
<h4 id="5-emacs">5. Emacs</h4>
<pre><code># 버전 확인 
emacs --version

# 설치되어 있지 않다면 
sudo apt install emacs</code></pre><p>Emacs를 이용하여 메일 서비스를 사용할지를 묻는 단계입니다. 메일 서비스를 굳이 텍스트 에디터에서 쓸 이유는 없으니 거절해 줍니다.</p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/9b39134c-8a90-4fd6-aded-e8aa241ae487/image.png" alt="">
<code>&lt;Ok&gt;</code>  선택 후 ENTER
<img src="https://velog.velcdn.com/images/young-0320/post/7ad14092-5588-419d-875f-a8f049da76cd/image.png" alt="">
<code>No configuration</code> 선택 후 ENTER</p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/b9d4eed1-7ed7-4f91-9225-a0ccd12c1219/image.png" alt="">
<strong>emacs version : 29.3</strong></p>
<h4 id="6-vim">6. vim</h4>
<pre><code># 버전 확인 
vim --version

# 설치되어 있지 않다면 
sudo apt install vim</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/d017b7fc-20ab-47b3-a764-127818312f09/image.png" alt=""></p>
<p><strong>vim version : 9.1</strong></p>
<h3 id="5-vs-code에서-emacs-vim-호출해보기">5. VS Code에서 emacs, vim 호출해보기</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/9907f31a-7710-4014-860c-158b9482bc9f/image.png" alt=""></p>
<p>vim와 emacs가 설치되어 있고 PATH에 정상적으로 등록됐음을 확인할 수 있습니다.</p>
<h3 id="6-개발-환경-구성">6. 개발 환경 구성</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/ce5f66db-582f-4332-9f5f-621e796130a9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/a9b2b0c0-3f3a-46e5-a737-24595ee78936/image.png" alt=""></p>
<h3 id="마무리하며">마무리하며</h3>
<p>VS Code를 메인 개발 환경으로 사용하되, 필요에 따라 Vim과 Emacs를 통합 터미널에서 활용하는 하이브리드 워크플로우를 구성했습니다. 특정 도구에 종속되기보다는 각 도구의 강점을 상황에 맞게 선택할 수 있는 유연한 개발 환경이 이번 툴체인 구축의 목표였습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #9 : Ubuntu 22.04에서 pyenv로 Python 버전 관리하기]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-9-Ubuntu-22.04%EC%97%90%EC%84%9C-pyenv%EB%A1%9C-Python-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-9-Ubuntu-22.04%EC%97%90%EC%84%9C-pyenv%EB%A1%9C-Python-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sun, 08 Feb 2026 06:27:55 GMT</pubDate>
            <description><![CDATA[<p>Ubuntu 22.04.3 LTS를 설치하니 기본 시스템 Python 버전이 3.12.3이었습니다. 하지만 프로젝트에 필요한 버전이 따로 있었고, 향후 여러 Python 버전을 유연하게 관리할 필요가 있어 pyenv를 도입하기로 결정했습니다.</p>
<p>이 포스팅에서는 pyenv 설치부터 원하는 Python 버전 설정까지 전 과정을 다룹니다.
<img src="https://velog.velcdn.com/images/young-0320/post/5b9548e3-fc21-45ca-9287-9e1889fa3351/image.png" alt=""></p>
<h3 id="1-github-페이지-방문">1. Github 페이지 방문</h3>
<p>pyenv의 깃허브 페이지(<a href="https://github.com/pyenv/pyenv)%EB%A1%9C">https://github.com/pyenv/pyenv)로</a> 이동하여 README를 살펴봅니다.
<img src="https://velog.velcdn.com/images/young-0320/post/037aeb12-f07e-44ec-8be8-d5cb43341e53/image.png" alt=""></p>
<h3 id="2-pyenv-설치-전-빌드-의존성-설정">2. pyenv 설치 전 빌드 의존성 설정</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/a07b9802-01f8-489e-ad47-ab0aa7707221/image.png" alt="">
아래의 명령어를 입력하여 빌드 의존성을 해결합니다.</p>
<pre><code>sudo apt update; sudo apt install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl git \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/37f7ba57-03fd-4d5b-8bf7-a93abef5f552/image.png" alt=""></p>
<p>약간의 수정 버전. wget와 llvm을 추가로 설치해 확장성을 높였습니다.</p>
<pre><code>sudo apt update
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev</code></pre><h3 id="3-pyenv-설치">3. pyenv 설치</h3>
<p>해당 페이지의 README에 따라 진행해줍니다.</p>
<pre><code>curl -fsSL https://pyenv.run | bash</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/e94f883e-abc1-45f2-b97b-6a156bbe9991/image.png" alt=""></p>
<h3 id="4-환경-변수-설정">4. 환경 변수 설정</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/2a7e5b8b-2fec-4b0f-98d3-24d23c8f42b2/image.png" alt="">
환경 변수가 설정되지 않아 발생하는 경고 문구입니다. 현재 상황에 따라 수정 파일을 선택하고, 설치 마지막에 출력되는 경로 코드를 복사하여 파일 맨 아래에 추가합니다.</p>
<pre><code>export PYENV_ROOT=&quot;$HOME/.pyenv&quot;
[[ -d $PYENV_ROOT/bin ]] &amp;&amp; export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;
eval &quot;$(pyenv init - bash)&quot;

# Restart your shell for the changes to take effect.
# Load pyenv-virtualenv automatically by adding
# the following to ~/.bashrc:

eval &quot;$(pyenv virtualenv-init -)&quot;</code></pre><p><strong>참고:</strong></p>
<ul>
<li><p><code>~/.bash_profile</code> : 로그인 시 1회 실행되는 전역 환경 변수를 설정하는 파일입니다. 해당 파일이 존재하면 <code>~/.profile</code>은 무시됩니다.</p>
</li>
<li><p><code>~/.profile</code> : 로그인 시 1회 실행되는 Bash 전용 로그인 설정 파일입니다.</p>
</li>
<li><p><code>~/.bashrc</code> : 터미널을 열 때마다(인터랙티브) 실행되는 작업 환경의 설정 파일입니다.</p>
</li>
</ul>
<h4 id="1-명령어로-파일의-존재-여부를-확인합니다">1. 명령어로 파일의 존재 여부를 확인합니다.</h4>
<p><img src="https://velog.velcdn.com/images/young-0320/post/eb3ec9e4-cc93-4c69-bd57-9bd93d5cdbf8/image.png" alt="">
<code>~/.profile</code> 파일은 존재하고 <code>~/.bash_profile</code> 파일은 존재하지 않습니다.</p>
<p><strong>로그인 셸에서 자동 로드하려면:</strong>
<code>~/.bash_profile</code> 파일이 존재하면 해당 파일에, 없으면<code>~/.profile</code> 파일에 경로를 추가해줍니다.</p>
<p><strong>인터랙티브 셸(비 로그인 셸)에서 자동 로드하려면:</strong>
<code>~/.bashrc</code>에 경로를 추가해줍니다.</p>
<h4 id="2-1-인터랙티브-셸비-로그인-셸에서-자동-로드하기">2-1. 인터랙티브 셸(비 로그인 셸)에서 자동 로드하기</h4>
<pre><code># 파일 열기
nano ~/.bashrc

# 파일의 맨 아래에 코드 추가
export PYENV_ROOT=&quot;$HOME/.pyenv&quot;
[[ -d $PYENV_ROOT/bin ]] &amp;&amp; export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;
eval &quot;$(pyenv init - bash)&quot;
eval &quot;$(pyenv virtualenv-init -)&quot;</code></pre><p>저는 절대 경로를 사용하여 경로 지정하였습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/fbe6c441-ff6a-4b0b-868d-b864097efe17/image.png" alt=""></p>
<p>CTRL + O, ENTER 그리고 CTRL + X를 눌러 파일을 저장하고 종료합니다.</p>
<h4 id="2-2-로그인-셸에서-자동-로드하기">2-2. 로그인 셸에서 자동 로드하기</h4>
<pre><code># 파일 열기
nano ~/.profile

# 파일의 맨 아래에 코드 추가
export PYENV_ROOT=&quot;$HOME/.pyenv&quot;
[[ -d $PYENV_ROOT/bin ]] &amp;&amp; export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;
eval &quot;$(pyenv init - bash)&quot;

# 파일 열기
nano ~/.bashrc

# 파일의 맨 아래에 코드 추가
export PYENV_ROOT=&quot;$HOME/.pyenv&quot;
[[ -d $PYENV_ROOT/bin ]] &amp;&amp; export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;
eval &quot;$(pyenv init - bash)&quot;
eval &quot;$(pyenv virtualenv-init -)&quot;</code></pre><p>CTRL + O, ENTER 그리고 CTRL + X를 눌러 파일을 저장하고 종료합니다.</p>
<h4 id="3-수정한-설정을-적용합니다">3. 수정한 설정을 적용합니다.</h4>
<pre><code># ~/.bashrc 파일을 수정했다면
source ~/.bashrc 

# ~/.bash_profile 파일을 수정했다면
source ~/.bash_profile

# ~/.profile 파일을 수정했다면
source ~/.profile</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/d3d37938-a8b9-4b5b-9111-62742151641e/image.png" alt=""></p>
<h3 id="5-pyenv-설치-확인">5. pyenv 설치 확인</h3>
<p>모든 터미널을 완전히 껐다 킨 뒤 다음 명령어를 입력하여 <code>pyenv</code>가 정상적으로 설치되었는지 확인합니다.</p>
<pre><code>pyenv --version</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/2b910c4a-2336-4fa6-ba4f-88316d5ad388/image.png" alt=""></p>
<p>성공!</p>
<h3 id="6-python-설치">6. Python 설치</h3>
<h4 id="1-설치-가능-python-목록을-확인합니다">1. 설치 가능 Python 목록을 확인합니다.</h4>
<pre><code>pyenv install --list | grep &quot; 3.1&quot;</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/32b7d138-0ef9-4c90-8450-bf68d3e70e45/image.png" alt=""></p>
<p>3.1.0부터 3.15t-dev까지 설치가 가능합니다.</p>
<h4 id="2-python-버전-선택">2. Python 버전 선택</h4>
<p><strong>3.13.12 버전을 선택하였습니다.</strong></p>
<p>이유는 다음과 같습니다:</p>
<p>*<em>안정성 *</em></p>
<ul>
<li>3.13.12는 이미 전 세계 엔지니어들이 검증을 끝낸 버전입니다. </li>
<li>주요 라이브러리들과의 안정적인 호환성이 확보되어 있습니다.</li>
</ul>
<p><strong>최신 버전의 위험성</strong></p>
<ul>
<li>3.14 혹은 3.15와 같은 최신 버전은 아직 충분한 실전 검증을 거치지 못했습니다.</li>
<li>NumPy, SciPy 같은 수치 연산 라이브러리와의 예기치 않은 호환성 문제가 발생할 수 있습니다.</li>
<li>만약 미세한 부동소수점 연산 버그라도 있다면, &#39;알고리즘 문제인지, 하드웨어 구현 문제인지, Python 환경 문제인지&#39; 구분하기 어려운 디버깅 지옥에 빠질 수 있습니다.</li>
</ul>
<h4 id="3-python-31212-설치">3. Python 3.12.12 설치</h4>
<pre><code># 3.13.12 버전 설치
pyenv install 3.13.12

# 전역 버전으로 변경
pyenv global 3.13.12</code></pre><p><code>pyenv global 3.13.12</code> 명령어는 시스템 Python을 직접 수정하지 않습니다. 
대신 Shim(가로채기) 방식으로 동작합니다</p>
<ul>
<li>시스템 Python(3.12.3)은 절대 경로에 그대로 유지됩니다.</li>
<li>pyenv가 PATH 앞쪽에 위치하여 python 명령을 가로챕니다.</li>
<li>OS의 핵심 도구들은 절대 경로로 시스템 Python을 실행하므로 영향을 받지 않습니다.</li>
</ul>
<p>이는 시스템 Python을 직접 업데이트하는 것보다 훨씬 안전한 방식입니다.</p>
<h3 id="7-python-설치-확인">7. Python 설치 확인</h3>
<pre><code>python --version
which python</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/c3e8eac0-9770-4541-b543-9cd271adc05b/image.png" alt=""></p>
<p>&#39;3.13.12&#39;와 &#39;/home/young/.pyenv/shims/python&#39; 출력을 통해 버전과 경로가 제대로 설정됐음을 확인할 수 있습니다.</p>
<h3 id="마무리하며">마무리하며</h3>
<p>pyenv를 통해 안정적인 Python 개발 환경 구축을 완료했습니다. 
시스템 Python을 건드리지 않으면서도 원하는 버전을 자유롭게 관리할 수 있게 되었습니다.</p>
<p>다음 포스팅에서는 VSCode에서 C++ 개발 환경을 구축하는 방법을 다뤄보겠습니다. 컴파일러 설정부터 디버깅 환경까지, 효율적인 C++ 개발을 위한 설정을 다루겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #8 : 5개 디스크를 위한 Ubuntu 고정 마운트 설정하기]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-8-5%EA%B0%9C-%EB%94%94%EC%8A%A4%ED%81%AC%EB%A5%BC-%EC%9C%84%ED%95%9CUbuntu-%EA%B3%A0%EC%A0%95-%EB%A7%88%EC%9A%B4%ED%8A%B8-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-8-5%EA%B0%9C-%EB%94%94%EC%8A%A4%ED%81%AC%EB%A5%BC-%EC%9C%84%ED%95%9CUbuntu-%EA%B3%A0%EC%A0%95-%EB%A7%88%EC%9A%B4%ED%8A%B8-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 07 Feb 2026 08:55:07 GMT</pubDate>
            <description><![CDATA[<p>우분투를 처음 설치하면 우분투 디스크 외에 다른 디스크들은 자동 마운트 상태로 인식합니다. 이번 포스팅에서는 자동 마운트를 고정 마운트(Static Mount)로 수정하고, 심볼릭 링크(Symbolic Link)를 통해 분산된 하드웨어 자원을 최적화된 단일 경로로 통합하는 과정을 다뤄보겠습니다. </p>
<h3 id="1-고정-마운트-설정">1. 고정 마운트 설정</h3>
<p><strong>자동 마운트의 문제점</strong>:</p>
<ul>
<li>파일 탐색기에서 디스크를 클릭해야만 마운트되어 디스크에 접근할 수 있음</li>
<li>마운트 경로가 고정되어 있지 않아 매번 달라질 수 있음 (예: /media/young/xxxxx)</li>
<li>터미널이나 스크립트에서 일관된 경로로 접근하기 어려움</li>
</ul>
<p><strong>현재 디스크 인식 상태 확인</strong></p>
<pre><code>lsblk</code></pre><p>명령어로 Block Device 인식 상태를 확인합니다.</p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/666929fa-20e6-4f1c-9a9d-54f13374688b/image.png" alt=""></p>
<p>현재 물리적으로는 5개의 디스크(sda, sdb, sdc, nvme0n1, nvme1n1)가 인식되지만, 실제로 읽고 쓸 수 있는 상태로 마운트된 것은 일부뿐입니다.</p>
<ul>
<li>nvme0n1: 우분투가 설치된 시스템 디스크 </li>
<li>nvme1n1: 윈도우가 설치된 시스템 디스크(부분 마운트 중)</li>
<li>sdb, sdc: 임시로 마운트된 디스크</li>
</ul>
<p>나머지 디스크들은 인식은 되지만 아직 마운트되지 않아 접근할 수 없는 상태입니다.
이러한 문제점을 해결하기 위해 고정 마운트 설정을 진행하겠습니다. 고정 마운트를 설정하면 부팅 시 자동으로 지정된 경로에 디스크가 마운트되어, 언제든 일관된 경로로 접근할 수 있습니다.</p>
<h4 id="1-각-디스크의-고유-식별자uuid-확보">1. 각 디스크의 고유 식별자(UUID) 확보</h4>
<pre><code>sudo blkid</code></pre><p>명령어로 각 디스크의 UUID를 확보합니다.</p>
<p>/dev/sda1: LABEL=&quot;Archive&quot; UUID=<code>982E35F32E3xxxx</code> 
/dev/sdb2: LABEL=&quot;Workspace&quot; UUID=<code>0ECE-xxxx</code>
/dev/sdc2: LABEL=&quot;ToolBox&quot; UUID=<code>960EBAE30EBAxxxx</code>
/dev/nvme1n1p3: LABEL=&quot;Windows&quot; UUID=<code>04DC4011DC40xxxx</code> 
dev/nvme0n1p2: UUID=<code>07b2f762-a6a8-4fcf-bc0a-8adca4abxxxx</code> </p>
<h4 id="2-마운트-포인트-생성">2. 마운트 포인트 생성</h4>
<p>각 디스크가 연결될 빈 폴더를 생성합니다.</p>
<pre><code>sudo mkdir -p /mnt/workspace
sudo mkdir -p /mnt/toolbox
sudo mkdir -p /mnt/archive
sudo mkdir -p /mnt/windows</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/9587d91a-d2ad-444b-a0d9-8ea850ec394c/image.png" alt=""></p>
<p><strong>/mnt를 사용하는 이유</strong> :
/mnt는 리눅스에서 외부 디스크를 마운트할 때 관례적으로 사용하는 디렉토리입니다. /media는 자동 마운트용, /mnt는 수동/고정 마운트용으로 구분합니다.</p>
<h4 id="3-fstab-백업-파일-생성">3. fstab 백업 파일 생성</h4>
<p>fstab 파일은 부팅 시 디스크 마운트를 설정하는 핵심 파일입니다. 잘못 수정하면 시스템이 부팅되지 않을 수 있으므로, 반드시 백업 후 신중하게 작업하세요.</p>
<pre><code>sudo cp /etc/fstab /etc/fstab.bak
sudo nano /etc/fstab</code></pre><p><strong>uid/gid=1000</strong> : 일반 사용자가 sudo 없이 파일을 읽고 쓸 수 있게 권한을 부여합니다.
<strong>nofail</strong> : 디스크가 연결되지 않아도 우분투 부팅이 멈추지 않게 합니다.
<strong>ro (Read-only)</strong>: 윈도우 시스템 파일을 보호합니다.</p>
<p><strong>파일을 수정하기 전 터미널에 아래의 명령어를 입력하여 해당 정보들을 다시 한번 더 확인합니다.</strong></p>
<p><code>blkid /dev/sdXX</code> : UUID 다시 확인
<code>id</code> : uid와 gid 다시 확인
<code>ls /mnt</code> : 마운트 포인트가 있는지 다시 확인</p>
<p>*<em>fstab 파일의 맨 아랫줄에 다음 내용을 추가합니다. *</em></p>
<p><strong>Archive (ntfs)</strong>: <code>UUID=982E35F32E35xxxx /mnt/archive ntfs defaults,uid=1000,gid=1000,nofail 0 0</code></p>
<p><strong>Workspace (exfat)</strong>: <code>UUID=0ECE-xxxx /mnt/workspace exfat defaults,uid=1000,gid=1000,nofail 0 0</code></p>
<p><strong>ToolBox (ntfs)</strong>: <code>UUID=960EBAE30EBAxxxx /mnt/toolbox ntfs defaults,uid=1000,gid=1000,nofail 0 0</code></p>
<p><strong>Windows (ntfs)</strong>: <code>UUID=04DC4011DC40xxxx /mnt/windows ntfs defaults,uid=1000,gid=1000,ro,nofail 0 0</code> (안전을 위해 읽기 전용 ro 추천)</p>
<p>저장(CTRL + O, ENTER) 이후 편집기를 종료(CTRL + X)합니다.</p>
<h4 id="4-설정-적용-및-검증">4. 설정 적용 및 검증</h4>
<pre><code>sudo mount -a
lsblk -f</code></pre><p>/mnt/toolbox와 같이 고정 마운트가 된 것을 터미널 창에서 확인합니다.</p>
<p>이제 모든 디스크가 외장 하드가 아닌 시스템 구성 요소로 인식되어 독바에서 사라집니다.</p>
<h4 id="예외-상황">예외 상황</h4>
<p><strong>1. 마운트 경로 불일치</strong>
<code>sudo mount -a</code>를 입력했을 때 아래와 같은 문구가 출력될 수 있습니다. 해당 내용은 임시 자동 마운트와 새로운 고정 마운트 경로가 불일치하는 경우 출력됩니다.
<img src="https://velog.velcdn.com/images/young-0320/post/e880f4c8-7309-4b13-a7c6-6b04b17085fb/image.png" alt=""></p>
<pre><code>mount: (hint) your fstab has been modified, but systemd still uses
       the old version; use &#39;systemctl daemon-reload&#39; to reload.
Mount is denied because the NTFS volume is already exclusively opened.
The volume may be already mounted, or another software may use it which
could be identified for example by the help of the &#39;fuser&#39; command.</code></pre><p>아래의 명령어로 fstab 파일을 동기화 한 뒤 임시 마운트 경로를 해제 후 다시 마운트합니다.</p>
<pre><code># 1. 내부 설정을 다시 읽어 동기화합니다.
sudo systemctl daemon-reload 

# 2. 기존의 임시 마운트를 해제합니다.
sudo umount /dev/sdb2

# 3. 수정한 fstab 설정대로 다시 마운트를 시도합니다.
sudo mount -a

# 4. 결과를 확인합니다.
lsblk -f</code></pre><p><strong>2. 부팅 불가</strong>
fstab 구문 오류 혹은 UUID 오타 발생 시 부팅이 불가능(검은 화면)할 수도 있습니다.
Emergency Mode에서 fstab을 백업본으로 복구 하여 해당 오류를 해결합니다.</p>
<pre><code># 복구 모드로 진입
sudo cp /etc/fstab.bak /etc/fstab
sudo reboot</code></pre><h3 id="2-심볼릭-링크-생성">2. 심볼릭 링크 생성</h3>
<p>윈도우의 바로가기(Shortcut)와 유사하지만, 운영체제 커널 수준에서 경로를 치환해주는 더 강력한 기능입니다.</p>
<pre><code>ln -s [원본 디렉토리의 절대 경로] [내가 만들 바로가기 이름]</code></pre><p><strong>예시</strong></p>
<pre><code># workspace 연결
ln -s /mnt/workspace ~/ws

# toolbox 연결
ln -s /mnt/toolbox ~/tool

# archive 연결
ln -s /mnt/archive ~/archive</code></pre><p><strong>연결 확인</strong></p>
<pre><code>ls -l ~</code></pre><p>해당 명령어를 입력했을 때 아래의 이미지와 같이 폴더 이름 옆에 화살표(-&gt;)와 같이 절대 경로가 출력되면 성공입니다.
<img src="https://velog.velcdn.com/images/young-0320/post/27a35cda-b0ff-4185-9ca3-3c2431af7ace/image.png" alt=""></p>
<h3 id="마무리하며">마무리하며</h3>
<p>5개의 물리 디스크를 우분투 시스템의 일부로 연결시켰습니다. /etc/fstab을 통한 고정 마운트와 심볼릭 링크를 활용한 경로 추상화는 개발 환경의 재현성과 안정성을 확보하는 핵심적인 작업입니다.
이제 재부팅을 하거나 장치를 재연결해도 빌드 스크립트와 시뮬레이션 경로는 절대 깨지지 않을 것입니다.</p>
<p>다음 포스팅에서는 Python 환경과 신호처리 및 시스템 프로그래밍을 위한 C++, 그리고 반도체 설계를 위한 Verilog 도구들의 설치에 대해 다루겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #7 : Ubuntu에서 VS Code 동기화 및 Git 설정하기]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-6</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-6</guid>
            <pubDate>Sat, 07 Feb 2026 08:14:53 GMT</pubDate>
            <description><![CDATA[<p>기존 윈도우의 VS Code 설정과 테마를 우분투에 그대로 이식하는 VS Code 동기화와 함께, Git 설치 및 기본적인 설정을 다루겠습니다.</p>
<h3 id="1-vs-code-설치">1. VS Code 설치</h3>
<ol>
<li>이번에는 터미널이 아닌 웹 브라우저를 통해 다운로드하는 방법을 알아보겠습니다.
다운로드 페이지(<a href="https://code.visualstudio.com/download)%EC%97%90">https://code.visualstudio.com/download)에</a> 접속한 후, Ubuntu용 .deb 파일을 다운로드합니다. 여기서 주의할 점은 큰 버튼을 바로 클릭하는 대신, .deb x64 버전을 선택해 정확한 버전을 설치하는 것이 안정성 측면에서 더 좋습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/9ccdfea8-bfbc-410d-bad3-628f715f3af6/image.png" alt=""></li>
<li>다운로드가 완료되면 터미널을 열어 다운로드 폴더로 이동합니다.<pre><code>cd Downloads/</code></pre>참고: 리눅스(우분투)는 대소문자를 구분하므로 downloads가 아닌 Downloads로 정확하게 입력해야 합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/08435cdb-4aa2-4adf-800b-6dfc6e39516e/image.png" alt=""></li>
<li>ls 명령어로 다운로드 폴더에 있는 VS Code 파일명을 확인합니다. <pre><code>ls</code></pre>확인한 파일명을 아래 명령어에 입력하여 설치를 진행합니다.<pre><code>sudo dpkg -i code_1.109.0-1770171879_amd64.deb</code></pre>이때 code까지만 입력 후 Tab 키를 누르면 자동완성됩니다.</li>
</ol>
<p><img src="https://velog.velcdn.com/images/young-0320/post/1e36332e-13f1-498d-9807-132ff6ee4e8c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/e9882670-771b-47df-8d2e-94b8075e5688/image.png" alt="">
Yes를 눌러 설치를 완료해줍니다.
4. 아래의 명령어를 입력하여 VS Code 실행해줍니다.</p>
<pre><code>code</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/5711dc63-680f-4b1b-aff5-238c81418bee/image.png" alt=""></p>
<h3 id="2-vs-code-동기화-설정">2. VS Code 동기화 설정</h3>
<p>이미 윈도우에서 VS Code를 사용 중이었기 때문에, 기존에 설정해둔 글꼴과 테마를 우분투에서도 그대로 사용하기 위해 동기화 작업을 진행했습니다.</p>
<p><strong>동기화 순서</strong>:</p>
<ol>
<li>좌측 하단의 톱니바퀴 클릭</li>
<li>Backup and Sync Settings... 선택</li>
<li>Profiles와 Prompts and Instructions 체크 해제</li>
<li>Sign in 클릭
<img src="https://velog.velcdn.com/images/young-0320/post/8204f29e-412f-46fd-b637-839ca5c5b309/image.png" alt="">
이렇게 설정하면 테마, 글꼴, 확장 프로그램만 동기화되고, 컴파일러 경로 같은 OS별 설정은 각각 독립적으로 관리할 수 있습니다.</li>
</ol>
<h3 id="3-git-설치">3. Git 설치</h3>
<p>아래의 명령어로 Git을 설치합니다.</p>
<pre><code>sudo apt update
sudo apt install git -y</code></pre><p>설치가 완료되면 Git 버전을 확인하여 정상적으로 설치되었는지 확인할 수 있습니다.</p>
<pre><code>git --version</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/8c837d30-9a72-4985-9394-dfd089486a9b/image.png" alt="">
이후 사용자 정보를 설정해줍니다.</p>
<pre><code>git config --global user.name &quot;Your Name&quot;
git config --global user.email &quot;your.email@example.com&quot;</code></pre><p>이후 기본적인 설정들을 완료해줍니다.</p>
<p><strong>1. 기본 브랜치 이름 설정</strong></p>
<pre><code>git config --global init.defaultBranch main</code></pre><p>master라는 브랜치 대신 main으로 브랜치 이름을 변경해줍니다.</p>
<p><strong>2. 줄바꿈 문자 설정</strong></p>
<pre><code>git config --global core.autocrlf input</code></pre><p>윈도우와 리눅스는 줄바꿈 문자를 다르게 처리합니다.</p>
<ul>
<li>윈도우: 줄바꿈을 CRLF (\r\n)로 저장</li>
<li>리눅스/맥: 줄바꿈을 LF (\n)로 저장</li>
</ul>
<p>듀얼 부팅 환경에서 양쪽 OS를 오가며 작업할 때, 이 차이로 인해 Git이 파일을 변경된 것으로 잘못 인식할 수 있습니다.</p>
<p><code>autocrlf input</code>  :</p>
<ul>
<li>체크아웃 : 줄바꿈 변환 하지 않음 (LF 유지) </li>
<li>커밋 : CRLF → LF 자동 변환</li>
</ul>
<p>이렇게 설정하면 Git 저장소에는 항상 LF로 통일되어 저장되며, 윈도우와 우분투 간 원활한 협업이 가능합니다.</p>
<p><strong>3. 컬러 출력 설정</strong></p>
<pre><code>git config --global color.ui auto</code></pre><p>Git 명령어 결과를 컬러로 표시하여 가독성을 높여줍니다.</p>
<p><strong>4. 설정 확인</strong></p>
<pre><code>git config --list</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/f4efc468-9bbe-48b5-b24c-309ca6998f29/image.png" alt=""></p>
<h3 id="마무리하며">마무리하며</h3>
<p>개발을 위한 기본적인 소프트웨어 설정을 하였습니다. 하지만 더욱 중요한 것은 설치 목록이 아니라 자원을 다루는 방식에서 나옵니다. 여러 디스크가 공존하는 환경에서는 경로의 일관성이 곧 안정성입니다.
다음 포스팅에서는 시스템의 기본이 되는 디스크 고정 마운트와 접근성을 극대화하는 심볼릭 링크 설정을 통해, 안정적인 개발 환경을 만들어 보겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #6 : 기본적인 Ubuntu 환경 설정하기]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-6-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-Ubuntu-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-6-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-Ubuntu-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</guid>
            <pubDate>Fri, 06 Feb 2026 05:47:17 GMT</pubDate>
            <description><![CDATA[<p>우분투 설치를 마친 뒤 가장 먼저 해야 할 일은 기본적인 프로그램을 설치하고 시스템의 안정성을 확인하는 것입니다. 크롬과 노션 같은 필수 앱 설치부터 하드웨어의 성능 확인을 위한 벤치마크까지, 쾌적한 개발 환경을 위한 기초 단계를 정리했습니다.</p>
<h3 id="1-chrome-설치">1. Chrome 설치</h3>
<ul>
<li>파일 다운로드<pre><code>wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb</code></pre></li>
<li>패키지 설치<pre><code>sudo apt install ./google-chrome-stable_current_amd64.deb</code></pre></li>
</ul>
<p><strong>설치 파일 제거</strong>
Chrome 설치가 완료되면 설치 파일은 더 이상 필요하지 않습니다. Home 디렉토리에 남아있는 google-chrome-stable_current_amd64.deb 파일을 우클릭하여 Move to Trash를 선택해 삭제합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/8cce70d5-7eb7-40c6-ac0f-fb50e12fd8fd/image.png" alt=""></p>
<h3 id="2-notion-설치">2. Notion 설치</h3>
<pre><code>sudo snap install notion-snap-reborn</code></pre><h3 id="3-claude-및-claude-code-설치">3. Claude 및 Claude Code 설치</h3>
<ul>
<li>Claude 설치
현재 Anthropic은 Windows와 macOS용 데스크탑 앱만 제공하며, Linux/Ubuntu용 네이티브 앱은 아직 출시되지 않았습니다. 대신 Chrome 브라우저의 앱으로 설치 기능을 활용하여 Claude를 PWA(Progressive Web App) 형태로 설치할 수 있습니다.</li>
</ul>
<p><strong>오른쪽 상단의 점 세개 -&gt; Cast, save, and share -&gt; Install Claude...</strong>
<img src="https://velog.velcdn.com/images/young-0320/post/68473fe0-2cc2-47a4-9b26-87eb50001651/image.png" alt=""></p>
<ul>
<li>Claude Code 설치
공식 홈페이지의 명령어를 입력합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/ce1ba7c0-23fe-49ca-99fb-ae367d00e024/image.png" alt=""></li>
</ul>
<pre><code>curl -fsSL https://claude.ai/install.sh | bash</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/3efb0e02-2bd3-465f-8c27-ecb4d2a0ca54/image.png" alt=""></p>
<ul>
<li><p>curl 설치
터미널 메세지를 확인해보니 Claude Code 설치를 진행하기 전에 curl이 필요합니다. 다음 명령어로 curl을 설치합니다.</p>
<pre><code>sudo apt install curl -y</code></pre></li>
<li><p>Claude Code 설치 명령어 재입력
curl 설치가 완료되면 이전에 실행했던 Claude Code 설치 명령어를 다시 입력합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/18c05337-e6f0-432d-a5bd-7c5129ee7877/image.png" alt=""></p>
</li>
<li><p>환경 변수 설정
터미널 메세지의 추천 명령어를 입력합니다.</p>
<pre><code>echo &#39;export PATH=&quot;$HOME/.local/bin:$PATH&quot;&#39; &gt;&gt; ~/.bashrc &amp;&amp; source ~/.bashrc</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/93128d02-4e4a-4d86-afd6-c6f60af6a31f/image.png" alt=""></p>
</li>
<li><p>claude code 초기 설정</p>
<pre><code>claude</code></pre><p>명령어를 입력하여 초기 설정을 해줍니다.
<img src="https://velog.velcdn.com/images/young-0320/post/e0e24751-8d19-45c9-b8d1-1a9495a697c7/image.png" alt=""></p>
</li>
</ul>
<ol>
<li>Claude 요금제를 구독 중인 경우에 선택해줍니다.</li>
<li>API 키를 발급받아 사용하는 방식입니다.</li>
<li>클라우드 플랫폼을 통해 사용하는 방식입니다.</li>
</ol>
<h3 id="4-mirage-설치">4. Mirage 설치</h3>
<p>간단한 이미지 편집 툴입니다.</p>
<pre><code>sudo apt update
sudo apt install mirage -y</code></pre><p>다만 이미지 Crop 기능이 별로 좋지는 않습니다...</p>
<h3 id="5-btop-설치">5. btop++ 설치</h3>
<p>btop(btop++)는 CPU, 메모리, 디스크, 네트워크 및 GPU의 상태를 터미널에서 실시간으로 시각화하고 관리할 수 있는 모니터링 툴입니다.
아래의 명령어로 설치를 진행합니다.</p>
<pre><code>sudo apt install btop -y</code></pre><p>아래의 명령어로 실행시켜줍니다.</p>
<pre><code>btop</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/c202ba04-9e69-4ed0-b2ba-277c86990946/image.png" alt=""></p>
<h3 id="6-stress-ng-설치">6. stress-ng 설치</h3>
<p>CPU 표준 스트레스 테스터입니다. 논리 프로세서(Thread) 모두에 100% 부하를 원하는 시간 동안 가합니다. 연산 오류 여부와 시스템 안정성을 확인하기에 가장 강력한 도구입니다. btop++와 함께 사용하여 CPU의 성능을 모니터링합니다.</p>
<p>아래의 명령어로 설치를 진행합니다.</p>
<pre><code>sudo apt install stress-ng -y</code></pre><p>아래의 명령어를 입력하여 사용합니다. 60초 동안 16 Thread에 100% 부하를 가합니다.</p>
<pre><code>stress-ng --cpu 16 --timeout 60s --metrics-brief</code></pre><p>CPU load가 1%에서 100%가 된 것과 클럭이 3.1GHz에서 5.4GHz까지 상승한 것을 확인할 수 있습니다. 또한 미리 설정해둔 PBO Set Thermal Point 값인 85∘C를 넘지 않는 것을 확인할 수 있습니다.  </p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/a7f7c624-7aba-436e-9c7c-6981e47217ae/image.png" alt="">
<img src="https://velog.velcdn.com/images/young-0320/post/f263ffb2-f255-416b-b690-f6ef0a61b32e/image.png" alt=""></p>
<p>-결과 해석
<strong>Bogo ops</strong> : 1분간 총 2,063,033번의 가상 연산(Bogo operations)을 수행했습니다.
<strong>연산 속도</strong> : 초당 약 34,383.52 ops의 속도를 기록했습니다. 
<strong>stress-info</strong> : skipped와 failed가 0이므로 시스템의 안정성을 확인할 수 있습니다.</p>
<h3 id="7-glmark2-설치">7. glmark2 설치</h3>
<p>간단한 GPU 성능 테스트 툴입니다.
아래의 명령어로 설치를 진행합니다.</p>
<pre><code>sudo apt install glmark2 -y</code></pre><p>아래의 명령어로 실행합니다.</p>
<pre><code>glmark2</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/b36d2e4d-55e4-4d77-b0dc-0bc2171cfeb1/image.png" alt="">
GPU load가 4%에서 100%가 된 것을 확인할 수 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/dc9f5abb-f3a4-4efd-aecd-4b2d47b37134/image.png" alt=""></p>
<p>-결과 해석
<strong>glmark2 Score</strong> : 10,881으로 사무용 PC에 비해 매우 높은 수치가 나옴을 알 수 있습니다.
<strong>FPS</strong> : 초당 프레임수가 12,000대의 수치로 GPU가 아주 원활하게 작동하고 있음을 확인할 수 있습니다.
GPU온도가 39°C로 평상시 작동 온도와 유사합니다. 해당 테스트가 GPU 성능에 비해 매우 낮은 부하를 주었거나, RTX 5060의 쿨링 성능이 우수하기 때문으로 보입니다.</p>
<h3 id="마무리하며">마무리하며</h3>
<p>Ubuntu 환경에서 기본 프로그램 설치부터 CPU/GPU 성능 벤치마크까지 기본 설정을 완료하였습니다.
다음 포스팅에서는 VS Code 및 Git 설정에 대해서 다루겠습니다.
감사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AI 가속기 & SoC 개발용 워크스테이션 구축기 5편 - 윈도우/우분투 듀얼부팅 최적화
]]></title>
            <link>https://velog.io/@young-0320/AI-%EA%B0%80%EC%86%8D%EA%B8%B0-SoC-%EA%B0%9C%EB%B0%9C%EC%9A%A9-%EC%9B%8C%ED%81%AC%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%85%98-%EA%B5%AC%EC%B6%95%EA%B8%B0-5%ED%8E%B8-%EC%9C%88%EB%8F%84%EC%9A%B0%EC%9A%B0%EB%B6%84%ED%88%AC-%EB%93%80%EC%96%BC%EB%B6%80%ED%8C%85-%EC%B5%9C%EC%A0%81%ED%99%94</link>
            <guid>https://velog.io/@young-0320/AI-%EA%B0%80%EC%86%8D%EA%B8%B0-SoC-%EA%B0%9C%EB%B0%9C%EC%9A%A9-%EC%9B%8C%ED%81%AC%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%85%98-%EA%B5%AC%EC%B6%95%EA%B8%B0-5%ED%8E%B8-%EC%9C%88%EB%8F%84%EC%9A%B0%EC%9A%B0%EB%B6%84%ED%88%AC-%EB%93%80%EC%96%BC%EB%B6%80%ED%8C%85-%EC%B5%9C%EC%A0%81%ED%99%94</guid>
            <pubDate>Fri, 06 Feb 2026 04:05:05 GMT</pubDate>
            <description><![CDATA[<p>듀얼부팅 환경을 구축했다면 이제 본격적으로 사용하기 전에 몇 가지 최적화 작업이 필요합니다. 
운영체제를 전환할 때마다 시간이 어긋나는 문제, 파일 시스템 공유 등 실제 개발 환경에서 마주치게 될 실용적인 이슈들을 중심으로 정리했습니다.</p>
<h3 id="1-윈도우와-우분투-시간-동기화">1. 윈도우와 우분투 시간 동기화</h3>
<p>듀얼부팅 환경에서 윈도우로 시간 동기화를 해도, 우분투로 부팅한 후 다시 윈도우로 전환하면 시간이 일치하지 않는 문제가 발생했습니다.
윈도우는 하드웨어 시계를 로컬 시간으로 인식하는 반면, 우분투는 UTC(협정 세계시)로 인식합니다.
이 문제는 우분투 터미널에서 다음 명령어를 입력하여 해결할 수 있습니다.</p>
<pre><code>timedatectl set-local-rtc 1 --adjust-system-clock</code></pre><p>이 명령어는 우분투도 하드웨어 시계를 윈도우와 동일하게 로컬 시간으로 사용하도록 설정합니다.</p>
<h3 id="2-윈도우-빠른-시작-켜기-옵션-체크-해제">2. 윈도우 빠른 시작 켜기 옵션 체크 해제</h3>
<p>이전 포스팅에서 설명했듯, 
윈도우의 빠른 시작 기능은 시스템 종료 시에도 커널 상태를 하드디스크에 저장하기 때문에 
결과적으로 윈도우에 저장된 파일을 우분투에서 수정하거나 이동할 수 없게 됩니다.
또한 시스템이 완전히 초기화되지 않아 GRUB 메뉴가 제대로 표시되지 않거나 드라이버 충돌이 발생할 수도 있기에 해당 기능은 필수적으로 비활성화해야 합니다.</p>
<pre><code>제어판-&gt;하드웨어 및 소리-&gt;전원 옵션-&gt;전원 단추 작동 설정에서 빠른 시작 켜기를 체크 해제</code></pre><h3 id="3-공유-드라이브-마운트-경로-확인">3. 공유 드라이브 마운트 경로 확인</h3>
<p>기본적으로 우분투는 다른 저장장치를 자동 마운트 방식으로 처리합니다. 해당 드라이브를 클릭하면 그때그때 자동적으로 마운트되는 방식입니다.</p>
<p>현재 시스템에 연결된 저장장치의 정보는 다음 명령어로 확인할 수 있습니다.</p>
<pre><code>lsblk -f </code></pre><p>출력 결과에서 각 드라이브의 UUID를 확인할 수 있습니다. 이번 현재 사용 중인 공유 드라이브는 다음과 같습니다: 
<strong>Archive</strong> (ntfs) : <code>982E35F32E35xxxx</code></p>
<p><strong>Workspace</strong> (exfat) : <code>0ECE-xxxx</code></p>
<p><strong>ToolBox</strong> (ntfs) : <code>960EBAE30EBAxxxx</code></p>
<h3 id="4-드라이버-설치-및-설치-확인">4. 드라이버 설치 및 설치 확인</h3>
<p><strong>4-1. NVIDIA 드라이버</strong></p>
<pre><code>nvidia-smi</code></pre><p>그래픽카드 정보가 출력되면 제대로 설치된 것입니다.
<img src="https://velog.velcdn.com/images/young-0320/post/48d3a2bc-f45b-4b70-84df-8c512a5e68b9/image.png" alt=""></p>
<p><strong>4-2. CPU 마이크로코드</strong>
Ryzen 9700X를 사용 중이므로 다음 명령어를 입력합니다.</p>
<pre><code>sudo apt install amd64-microcode -y</code></pre><p><img src="https://velog.velcdn.com/images/young-0320/post/27904d07-4b43-46d7-bacc-24ef7c6adf9e/image.png" alt="">
이미 최신 버전이 설치되어 있음을 확인할 수 있습니다.</p>
<p><strong>4-3 메인보드 및 주변기기 인식 확인</strong></p>
<pre><code>lspci -nnk | grep -i vga -A 3</code></pre><p>PCI 버스에 연결된 모든 하드웨어 장치 목록을 보여주는 명령어입니다.
<img src="https://velog.velcdn.com/images/young-0320/post/64c3cca8-7c81-4447-983d-9870c155e253/image.png" alt="">
메인보드가 NVIDIA 외장 GPU와 AMD 내장 GPU를 모두 정상적으로 인식하고 있음을 확인할 수 있습니다.</p>
<h3 id="해당-시리즈를-마무리하며">해당 시리즈를 마무리하며</h3>
<p>지금까지 5편에 걸쳐 AI 가속기 &amp; SoC 개발용 워크스테이션의 구축 과정을 다루었습니다.</p>
<p>하드웨어 선택부터 조립, 그리고 물리적 SSD 분리를 통한 안정적인 OS의 설치와 GRUB 설정, 그리고 이번 편의 시간 동기화, 빠른 시작 기능 비활성화, 공유 드라이브 경로 확인, 각종 드라이버 설치 확인까지 완료했습니다.
하나의 워크스테이션에서 윈도우와 우분투를 안정적으로 사용할 수 있는 환경이 갖춰졌습니다.</p>
<p>해당 시리즈는 여기서 마무리하도록 하겠습니다.
감사합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #5 : VSCode와 CMake로 C++ 프로젝트 구성하기]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-5-VSCode%EC%99%80-CMake%EB%A1%9C-C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-5-VSCode%EC%99%80-CMake%EB%A1%9C-C-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Wed, 04 Feb 2026 16:04:11 GMT</pubDate>
            <description><![CDATA[<p>Windows 개발 환경 설정을 진행하겠습니다.
개발 환경 설정 #1에서 사용한 C/C++ Compile Run 확장은 단일 소스 파일 실행에는 편리하지만, 분할 컴파일이나 외부 라이브러리 연결 등 실무 프로젝트에 필요한 기능을 지원하지 않습니다.</p>
<p>이제 CMake를 도입하여 보다 전문적인 C++ 개발 환경을 구축해보겠습니다.
참고: Visual Studio Code 공식 유튜브 채널의 영상을 참고하여 작성했습니다. (<a href="https://www.youtube.com/watch?v=_BWU5mWqVA4&amp;t=87s">https://www.youtube.com/watch?v=_BWU5mWqVA4&amp;t=87s</a>)</p>
<h3 id="사전-준비-이전-설정-정리">사전 준비: 이전 설정 정리</h3>
<p><strong>참고</strong> : C/C++ Compile Run 확장을 굳이 삭제하지 않아도 CMake 환경 설정에는 문제가 없습니다. 필요에 따라 두 방식을 병행할 수도 있습니다.
<strong>1. 확장프로그램 삭제</strong> : 기존에 사용하던 C/C++ Compile Run(danielpinto8zz6) 확장을 제거합니다.
<strong>2. 프로젝트 내부 폴더 삭제</strong> : 프로젝트 루트의 .vscode 폴더를 삭제합니다. 이전 설정이 남아있을 경우 새로운 설정과 충돌할 수 있기 때문입니다.
<strong>3. 레지스트리 복구</strong> : 레지스트리의 Autorun 파일에 등록한 chcp 65001 명령어를 삭제합니다.</p>
<h3 id="1-cc-확장-프로그램-설치">1. C/C++ 확장 프로그램 설치</h3>
<p>아래의 확장 프로그램을 다운받습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/0b484385-2ecf-4beb-9612-52863e366f8b/image.png" alt=""></p>
<p><strong>1. C/C++</strong>
VS Code에서 C++ 개발을 위한 핵심 엔진입니다.</p>
<p>*<em>2. C/C++ Extension Pack *</em>
사용자의 편의를 위해 여러 확장을 하나로 묶어놓은 확장 팩입니다. C/C++, C/C++ Themes, CMake, CMake Tools 등을 한 번에 설치합니다.</p>
<p><strong>3. C/C++ Themes</strong>
C++ 코드의 예약어, 변수, 함수 등을 더 명확하게 구분해 주는 전용 색상 테마를 제공합니다.</p>
<h3 id="2-cc-edit-configuration-설정">2. C/C++ Edit Configuration 설정</h3>
<ol>
<li><p>Command Palette(CTRL + SHIFT + P)를 열어 <strong>C/C++: Edit Configurations(UI)</strong>를 클릭합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/a65ba9e6-c227-4f27-b695-919267558469/image.png" alt=""></p>
</li>
<li><p>Compiler Path에 해당 컴파일러 경로(C:/msys64/mingw64/bin/g++.exe)를 입력합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/95cdc31c-9434-4866-97d2-6012b40ffd9f/image.png" alt=""></p>
</li>
<li><p>IntelliSense Mode도 GCC(windosw-gcc-x64)로 수정합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/9d693caf-07d1-44c2-a346-a31046ba6707/image.png" alt=""></p>
</li>
</ol>
<h3 id="3-cmake-설치">3. CMake 설치</h3>
<ol>
<li><p>CMake 공식 홈페이지(<a href="https://cmake.org/download/)%EC%97%90%EC%84%9C">https://cmake.org/download/)에서</a> Windows x64 Installer를 다운로드하여 설치합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/6575837f-474a-41c5-8e72-a425f7cb3cdb/image.png" alt=""></p>
</li>
<li><p>Add CMake to the PATH environment variable 옵션을 체크합니다. 이 옵션을 체크 해야 윈도우 시스템 전체에서 cmake라는 명령어를 인식할 수 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/dc0f2979-de16-44f8-aa75-d5ce264b54c5/image.png" alt=""></p>
</li>
<li><p>기본 경로 그대로 설치합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/ca952963-eacc-4b45-a0f9-ce9aba2a796e/image.png" alt=""></p>
</li>
</ol>
<h3 id="4-cmake-기본-설정">4. CMake 기본 설정</h3>
<ol>
<li>Command Palette의 CMake: Quick Start메뉴를 선택합니다.</li>
<li>프로젝트 이름을 입력합니다.</li>
<li>Executable를 선택합니다.(CMake의 기본 구성 코드를 자동 생성해주는 기능)</li>
</ol>
<h3 id="5-ninja-설치">5. Ninja 설치</h3>
<ol>
<li>MSYS2 MinGW64 터미널 창을 엽니다.</li>
<li>아래의 명령어를 입력하여 Ninja를 설치합니다.<pre><code>pacman -S mingw-w64-x86_64-ninja</code></pre><img src="https://velog.velcdn.com/images/young-0320/post/00921f5c-86a8-4f56-9a49-339c09fc9dba/image.png" alt=""></li>
</ol>
<h3 id="6-kit-선택">6. Kit 선택</h3>
<p>GCC 15.2.0 x86_64-w64-mingw32 (mingw64) 키트를 선택합니다.</p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/d2832e88-e4a0-4af3-8a50-83de09f66a21/image.png" alt=""></p>
<p>어떤 컴파일러를 사용할지 선택하는 단계입니다.
<img src="https://velog.velcdn.com/images/young-0320/post/f80e2d04-40f9-4572-9f1c-05d60c106c6c/image.png" alt=""></p>
<ul>
<li><p>MSVC (Visual Studio): 윈도우 환경에 가장 최적화된 컴파일러</p>
</li>
<li><p>GCC (MinGW/MSYS2): 리눅스 표준과 가깝고 가벼운 컴파일러</p>
</li>
</ul>
<h3 id="7-cmake-tools">7. CMake Tools</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/5dad4e73-dddb-43a8-9b20-31f81b9b1d93/image.png" alt="">
CMake Tools는 <code>CMakeLists.txt</code> 파일을 해석하여 컴파일러 구성, 빌드 자동화, 디버깅, 그리고 IntelliSense 연결을 GUI 기반으로 통합 관리해 주는 확장 프로그램입니다. </p>
<p>또한 사이드바와 하단 상태표시줄에 CMake 전용 영역이 생겨 더욱 편리하게 CMake를 사용할 수 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/a8dc5e69-85c0-4c24-8b26-6f5acbdebf0a/image.png" alt="">
사이드바에 CMake가 생긴 모습을 확인할 수 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/782c1c43-4e12-43d8-804d-7448400d6c37/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/cecff360-9aa6-476c-a730-b02a52a5410d/image.png" alt=""></p>
<p>하단 상태 표시줄에도 편의성 버튼이 생겼습니다.</p>
<h3 id="8-테스트-코드-생성">8. 테스트 코드 생성</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/9351ffe1-fb0d-4017-8d76-0a8bcb0f4da3/image.png" alt=""></p>
<h3 id="9-cmakeliststxt-생성">9. CMakeLists.txt 생성</h3>
<p>해당 파일은 프로젝트의 구성, 빌드 대상 및 컴파일러와 같은 빌드 방식을 CMake에 알려주는 핵심 구성 파일입니다. 파일 이름을 CMakeLists.txt라고 지정하여 생성합니다.
<img src="https://velog.velcdn.com/images/young-0320/post/aa1e098d-465d-4ec6-92f3-48b364c4db71/image.png" alt=""></p>
<p><strong>cmake_minimum_required(VERSION 4.2)</strong>
CMake 소프트웨어의 최소 버전을 명시하는 코드입니다. 
시스템에 설치된 CMake 버전이 이보다 낮으면 빌드를 중단힙니다.</p>
<pre><code>cmake --version</code></pre><p>해당 명령어를 이용해 현재 cmake version을 확인할 수 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/6d137bbf-3499-4258-9b73-1dc64f7a30e9/image.png" alt=""></p>
<p><strong>project(CH9 VERSION 0.1.0 LANGUAGES C CXX)</strong>
CH9 (Project Name): 프로젝트의 고유 이름입니다.
VERSION 0.1.0: 연구의 진행 단계를 기록합니다.
LANGUAGES C CXX: 이 프로젝트가 C와 C++(CXX) 언어를 사용함을 알립니다.</p>
<p><strong>add_executable(LAB_9.1 LAB_9.1.cpp)</strong>
어떤 소스를 엮어 어떤 실행 파일을 만들지 결정합니다. 
LAB_9.1 (Target Name): 생성될 실행 파일의 이름. 빌드 성공 시 LAB_9.1.exe라는 실행 파일이 생성됩니다.
LAB_9.1.cpp (Source Files): 실행 파일을 만드는 데 필요한 코드입니다.</p>
<h3 id="10-테스트-코드-실행">10. 테스트 코드 실행</h3>
<p>VS Code의 하단 상태 표시줄의 망치 모양 빌드를 클릭 후 화살표 버튼을 클릭하면 파일이 실행됨을 확인할 수 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/819d8531-de3a-49fa-be93-d8ae1dfd3728/image.png" alt="">
<img src="https://velog.velcdn.com/images/young-0320/post/7dd13a22-9725-4937-9ddb-652d4b790ae8/image.png" alt="">
성공!</p>
<h3 id="11-빌드-및-실행-대상-선택하기">11. 빌드 및 실행 대상 선택하기</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/3114c5c5-07f8-4a6c-abae-76388cdf0c83/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/f6b59680-a5bf-45ac-b7d2-32137ab0593e/image.png" alt=""></p>
<p>사이드바의 CMake 영역에서 빌드 대상 및 실행 대상을 선택할 수 있습니다.
<img src="https://velog.velcdn.com/images/young-0320/post/a02837b5-457e-44de-93e0-80482ca07e63/image.png" alt=""></p>
<p>또는 Command Palette에서 CMake: Set Launch/Debug Target이나 CMake: Set Build Target을 통해 원하는 대상을 선택할 수 있습니다.</p>
<h3 id="마무리하며">마무리하며</h3>
<p>이로써 Windows 환경에서 VS Code와 CMake를 활용한 C++ 개발 환경 구성을 마쳤습니다.</p>
<p>물론 가장 쉬운 선택은 Visual Studio를 사용하는 방법입니다. 그럼에도 CMake와 Ninja를 직접 구성한 이유는 단 하나, 환경의 연속성에 있습니다. 
앞으로 마주하게 될 많은 프로젝트와 리눅스 기반 개발 환경에서는 이러한 빌드 방식이 표준이 되기 때문입니다.</p>
<p>이제 코드를 실행하는 단계를 넘어, 프로젝트를 스스로 빌드하고 운영할 수 있는 체계를 갖추었습니다. 이 환경을 바탕으로 더 큰 규모의 개발로 확장해 나가겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #4 : Python 설치(Windows)]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-4-Python-%EC%84%A4%EC%B9%98Windows</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-4-Python-%EC%84%A4%EC%B9%98Windows</guid>
            <pubDate>Thu, 29 Jan 2026 15:16:22 GMT</pubDate>
            <description><![CDATA[<p>Python 3.13.11(windows) download</p>
<h3 id="1-파이썬-홈페이지httpswwwpythonorgdownloadsreleasepython-31311에서-windows-installer-64-bit-다운로드">1. 파이썬 홈페이지(<a href="https://www.python.org/downloads/release/python-31311/)%EC%97%90%EC%84%9C">https://www.python.org/downloads/release/python-31311/)에서</a> Windows Installer (64-bit) 다운로드</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/557f9ed5-cf77-4206-b1e5-7d177dacf478/image.png" alt=""></p>
<h3 id="2-설치-항목-선택">2. 설치 항목 선택</h3>
<ul>
<li><strong>Use admin privileges when installing py.exe</strong><ul>
<li>관리자 권한으로 파이썬을 설치. 윈도우 시스템 수준에서 파이썬 실행 파일들이 올바르게 등록되며, 추후 라이브러리 설치 시 발생할 수 있는 권한 오류를 사전에 방지 가능</li>
</ul>
</li>
<li><strong>Add python.exe to PATH</strong><ul>
<li>Git Bash나 VS Code의 터미널에서 <code>python</code> 명령어를 입력했을 때 컴퓨터가 파이썬을 찾지 못함. 경로의 수동 설정을 피하기 위해 반드시 체크</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/young-0320/post/6d667ab7-90e1-42c6-9d93-f019af0c582b/image.png" alt="">
Customize installation 선택</p>
<h3 id="3-optional-features-설정">3. Optional Features 설정</h3>
<p>default 설정 그대로
<img src="https://velog.velcdn.com/images/young-0320/post/a1f94e8b-3afe-4678-8c18-c570abd41b43/image.png" alt=""></p>
<h3 id="4-advanced-options-설정">4. Advanced options 설정</h3>
<p>파이썬 설치 경로 : C:\Program Files\Python313
<img src="https://velog.velcdn.com/images/young-0320/post/1fd7fe39-9e4d-43d9-9a44-90e3f3b166e9/image.png" alt=""></p>
<h3 id="5-disable-path-length-limit-설정">5. Disable path length limit 설정</h3>
<p>Disable path length limit 선택. 파일 경로의 최대 길이 제한 해제 옵션. 필수적으로 선택
<img src="https://velog.velcdn.com/images/young-0320/post/798f43de-af84-451f-b1a6-08c9eff1b9cc/image.png" alt=""></p>
<h3 id="6-python-인식-확인">6. Python 인식 확인</h3>
<p>vscode에서 python 설치 확인
<img src="https://velog.velcdn.com/images/young-0320/post/95fa57d1-b865-4af7-8e90-03eeb8ea9acd/image.png" alt=""></p>
<p>정상 설치!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발 환경 설정 #3 : Git 설치(Windows)]]></title>
            <link>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-3-Git-%EC%84%A4%EC%B9%98Windows</link>
            <guid>https://velog.io/@young-0320/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-3-Git-%EC%84%A4%EC%B9%98Windows</guid>
            <pubDate>Thu, 29 Jan 2026 15:03:02 GMT</pubDate>
            <description><![CDATA[<p> git version 2.52.0.windows.1 download</p>
<h3 id="1-git-홈페이지httpsgit-scmcom에서-windows용-설치">1. Git 홈페이지(<a href="https://git-scm.com/)%EC%97%90%EC%84%9C">https://git-scm.com/)에서</a> Windows용 설치</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/0b7b1c08-11c0-47c9-aeed-9a5fe9983098/image.png" alt=""></p>
<h3 id="2-다운로드-경로">2. 다운로드 경로</h3>
<p>기본 다운로드를 그대로 유지
<img src="https://velog.velcdn.com/images/young-0320/post/57976831-a384-4c7e-bf3d-981f0564658e/image.png" alt=""></p>
<h3 id="3-구성요소-선택">3. 구성요소 선택</h3>
<p>   <strong>a. Additional icons</strong> : 바탕화면에 바로가기를 생성 할지 여부 
   <strong>b. Windows Explorer Integration</strong> :
         - Open Git Bash here : 우클릭 메뉴(컨텍스트 메뉴)에 Git Bash를 연결할지 여부
         - Open Git GUI here : 우클릭 메뉴(컨텍스트 메뉴)에 Git GUI를 연결할지 여부
<em>*    c. Git LFS(Large File Support)** : 
    대용량 파일 지원 여부
    **d. Associate .git</em> configuration files with the default text editor<em>* : 
    .git</em> 구성 파일을 기본 텍스트 편집기와 연결
    <strong>e. Associate .sh files to be run with Bash</strong> : 
    확장자가 <code>.sh</code>인 쉘 스크립트 파일을 Git Bash를 통해 실행하도록 연결
    <strong>f. Check daily for Git for Windows updates</strong> : Windows 용 Git 업데이트를 매일 확인 할지 여부
    <strong>g. Add a Git Bash Profile to Windows Terminal</strong> : Windows 터미널에 Git Bash 프로필 추가. 즉 터미널 내에서 새 탭으로 Git Bash를 즉시 호출 가능
    <strong>h. Scalar (Git add-on to manage large-scale repositories)</strong> : 
    대규모 저장소에서 Git 작업 속도를 높여주는 도구
<img src="https://velog.velcdn.com/images/young-0320/post/d0dbbc3e-b765-438b-be0f-5236213d27a1/image.png" alt=""></p>
<h3 id="4-스타트-메뉴-폴더">4. 스타트 메뉴 폴더</h3>
<p>Git Bash를 직접 실행해야할 때 편리함
<img src="https://velog.velcdn.com/images/young-0320/post/4ad8ad99-fdc8-48b6-86eb-7d1089d8ce02/image.png" alt=""></p>
<h3 id="5-vim-언어-사용">5. vim 언어 사용</h3>
<p>VsCode가 더 편함. 하지만 Vim 언어는 리눅스 환경에서 필수적으로 사용되고, 윈도우지만 리눅스 환경에 익숙해지기 위해 Vim 선택
<img src="https://velog.velcdn.com/images/young-0320/post/e68c1c6c-7db7-4c76-81fe-b20c7ceb516b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/young-0320/post/1fcc99c1-e53b-4dd8-a366-ce27c276f56c/image.png" alt=""></p>
<h3 id="6-branch-이름-설정">6. branch 이름 설정</h3>
<p>branch명을 내가 지정한 main으로 변경
<img src="https://velog.velcdn.com/images/young-0320/post/d1d22a06-16b2-4f4e-abdc-58231ba00f61/image.png" alt=""></p>
<h3 id="7-환경-변수-설정">7. 환경 변수 설정</h3>
<p>두 번째를 선택해야 Git이 PATH에 등록된 경로를 즉각적으로 인식할 수 있음
<img src="https://velog.velcdn.com/images/young-0320/post/7faef48c-000d-4e0b-a8cc-bdb6d32177db/image.png" alt=""></p>
<h3 id="8-기본-제공-sshexe를-사용">8. 기본 제공 ssh.exe를 사용</h3>
<p>암호화 통신 방식에서 굳이 외부 프로그램을 사용할 필요는 없음
<img src="https://velog.velcdn.com/images/young-0320/post/c09d14fb-b08a-4aad-9792-b2550990f22b/image.png" alt=""></p>
<h3 id="9-네트워크-통신-규격-설정">9. 네트워크 통신 규격 설정</h3>
<p>우분투에서 사용되는 것과 동일하게 구성
<img src="https://velog.velcdn.com/images/young-0320/post/6a891a82-1fde-430d-ae4f-f9b1f02ba80a/image.png" alt=""></p>
<h3 id="10-줄바꿈-설정">10. 줄바꿈 설정</h3>
<p>   <strong>a. Checkout Windows-style, commit unix-style line endings.</strong>
     : Git에 커밋할 때는 자동으로 우분투 줄바꿈 방식인 LF로 변경, 체크아웃을 할 때는 자동으로 윈도우 줄바꿈 방식인 CRLF로 변경
   <strong>b. Checkout-as-is, commit Unix-style line encodings.</strong>
    : Git에 커밋할 때는 CRLF, 체크아웃할 때는 어떤 변환도 수행하지 않고 그대로
   <strong>c. Checkout as-is, commit as-is.</strong>
    : Git은  커밋하거나 체크아웃할 때 줄 바꿈 변환을 수행하지 않음
<img src="https://velog.velcdn.com/images/young-0320/post/5baec2cc-4ca1-46da-bfda-39564a21dafa/image.png" alt=""></p>
<h3 id="11-터미널-설정">11. 터미널 설정</h3>
<p>더 나은 가독성과 리눅스 스타일의 터미널 조작을 위해 첫 번째 선택
 <img src="https://velog.velcdn.com/images/young-0320/post/24ac63f9-0e04-40d3-97f9-34fbe16f76cd/image.png" alt=""></p>
<h3 id="12-1-git의-pull-동작-방식-설정">12. 1. Git의 pull 동작 방식 설정</h3>
<p>   <strong>1. Fast-forward or merge</strong> : 원격 저장소의 최신 커밋과 내 로컬 작업물의 충돌이 없다면 단순히 Fast-forward하고, 두 곳에서 작업이 동시에 발생하면 merge commit(병합)함
   <strong>2. Rebase</strong> : 내 로컬 브랜치의 커밋들을 원격에서 새로 가져온 최신 브랜치 끝부분에 &#39;다시 배치(Rebase)&#39;함
   <strong>3. Only ever fast-forward</strong> : 커밋을 그대로 이어 붙일 수 있을 때만 pull을 허용. 이외의 상황에선 에러 발생</p>
<p>→윈도우/우분투 듀얼 부팅 상황에선 rebase가 더 적절하다고 판단.</p>
<p><strong>Rebase</strong> : 원격 작업을 먼저 깔고 로컬 작업을 그 뒤에 붙임 → 원격의 상태는 과거로, 로컬 작업은 최근 상태로 인식. 즉 로컬 작업이 항상 최신 상태로 유지</p>
<p><strong>merge</strong> : 로컬 작업과 원격 내용을 병렬적으로 붙임 </p>
<p>Git에 익숙하지 않은 나는 소스코드의 무결성과 이력이 꼬였을 때 복구하기가 더 용이한 첫 번째 옵션을 선택
<img src="https://velog.velcdn.com/images/young-0320/post/678a8393-cf02-4c9a-a59f-a2276cc04e95/image.png" alt=""></p>
<h3 id="13-자격-증명-manager">13. 자격 증명 manager</h3>
<p>첫 번째 옵션이 더 편리함
<img src="https://velog.velcdn.com/images/young-0320/post/e76f96eb-ef9f-481b-8af9-53776d8dcd2b/image.png" alt=""></p>
<h3 id="14-추가적인-옵션-선택">14. 추가적인 옵션 선택</h3>
<p>첫 번째 옵션 선택 시 상당한 성능 향상 제공
<img src="https://velog.velcdn.com/images/young-0320/post/9d69847e-50a9-4450-b88d-c90982fa213f/image.png" alt=""></p>
<h3 id="15-설치-완료">15. 설치 완료!</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/f565f796-6b62-494b-bf0c-62412a2d4c9c/image.png" alt=""></p>
<h3 id="16-기본적인-명령어-적용">16. 기본적인 명령어 적용</h3>
<p><img src="https://velog.velcdn.com/images/young-0320/post/0c824fa2-b1d4-4f34-9f49-873e82859e8f/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>