<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bjunverse_.log</title>
        <link>https://velog.io/</link>
        <description>전기공학/학사/회로설계</description>
        <lastBuildDate>Tue, 31 Mar 2026 11:59:27 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bjunverse_.log</title>
            <url>https://velog.velcdn.com/images/bjunverse_/profile/3338bd23-1a3b-481f-a738-d0171151b61b/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bjunverse_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bjunverse_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[SRAM PUF 설계] 배경 이론과 새로운 구조]]></title>
            <link>https://velog.io/@bjunverse_/SRAM-PUF-%EC%84%A4%EA%B3%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%EA%B2%BD-%EC%9D%B4%EB%A1%A0%EA%B3%BC-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@bjunverse_/SRAM-PUF-%EC%84%A4%EA%B3%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B0%B0%EA%B2%BD-%EC%9D%B4%EB%A1%A0%EA%B3%BC-%EC%83%88%EB%A1%9C%EC%9A%B4-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Tue, 31 Mar 2026 11:59:27 GMT</pubDate>
            <description><![CDATA[<h2 id="1-프로젝트-소개">1. 프로젝트 소개</h2>
<blockquote>
<p>이번 프로젝트에서는 반도체 공정 편차를 이용해 고유한 응답을 생성하는 <strong>8T SRAM PUF</strong>를 설계하였다.</p>
</blockquote>
<p>설계는 <strong>0.5um Analog CMOS 2P3M 5V 공정의 MPW</strong>를 기반으로 진행했으며, 회로 설계 및 시뮬레이션은 <strong>Cadence Virtuoso</strong> 환경에서 수행하였다.</p>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/018aeb85-bbbc-4674-98c8-0f7b90577413/image.png" alt=""></p>
<p>본 프로젝트에서는 단순히 SRAM PUF 셀만 설계한 것이 아니라, <strong>Precharge Circuit, Decoder, Write Driver, Sense Amplifier</strong> 등 SRAM 동작에 필요한 주변 회로를 포함한 <strong>통합적인 16×16 Array 구조</strong>를 설계하였다.</p>
<p>또한 회로 수준의 설계에 그치지 않고, 실제 구현 가능성을 고려하여 <strong>레이아웃 설계까지 진행</strong>하였다.</p>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/abecbd57-ad27-412a-9c46-9015d9112f5b/image.png" alt=""></p>
<p>프로젝트의 핵심 목표는 기존 <strong>6T SRAM PUF</strong>에서 발생할 수 있는 <strong>bit flip 문제를 줄이고</strong>, 보다 안정적인 PUF 응답 특성을 갖는 새로운 셀 구조를 설계하는 것이었다.</p>
<p>나아가 PUF의 3대 성능지표인 <strong>Reliability</strong>, <strong>Randomness</strong>, <strong>Uniqueness</strong>를 고려하였으며, 0.5um(500 nm) 공정을 감안해 각각 <strong>97%, 40%, 45%</strong> 수준을 목표로 설정하였다.</p>
<p>마지막으로 설계한 <strong>16×16 chip</strong>은 레이아웃까지 완료한 뒤, <strong>2026년 3월 7일 MPW 측에 GDS로 제출</strong>하였다.</p>
<hr>
<h2 id="2-puf-physical-unclonable-function">2. PUF (Physical Unclonable Function)</h2>
<blockquote>
<p><strong>PUF</strong>는 반도체 제조 과정에서 자연스럽게 발생하는 <strong>공정 편차(process variation)</strong> 를 이용하여, 각 칩마다 고유한 응답을 생성하는 하드웨어 보안 기법이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/422bc8a5-b118-4909-b981-d18afed5d553/image.png" alt=""></p>
<p>동일한 구조의 회로를 동일한 공정으로 제작하더라도, 내부 소자의 미세한 차이로 인해 각 칩은 서로 다른 응답 특성을 가지게 된다. 이러한 특성 덕분에 PUF는 복제가 매우 어려운 <strong>하드웨어 기반 고유 식별자</strong>로 활용될 수 있다.</p>
<p>이러한 차이는 소자의 <strong>문턱전압(Vt)</strong>, <strong>이동도(mobility)</strong>, <strong>채널 길이 및 폭</strong>, <strong>배선 및 소자 mismatch</strong> 등의 미세한 공정 편차에서 비롯된다. 동일한 회로를 동일한 공정으로 제작하더라도 이러한 물리적 특성이 완전히 같을 수는 없기 때문에, 각 칩은 물리적으로 복제하기 어려운 고유성을 갖게 된다.</p>
<blockquote>
<p>즉, PUF는 별도의 비밀 키를 저장하지 않고도 칩 자체의 물리적 특성을 바탕으로 <strong>device authentication</strong>, <strong>key generation</strong> 등에 활용될 수 있다.</p>
</blockquote>
<hr>
<h2 id="3-sram-puf">3. SRAM PUF</h2>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/7a7beac6-09ab-4b8d-9580-f3978ac7238b/image.png" alt=""></p>
<blockquote>
<p><strong>SRAM PUF</strong>는 SRAM 셀의 <strong>power-up 초기 상태</strong>를 이용하는 대표적인 PUF 구조이다.</p>
</blockquote>
<p>SRAM 셀은 전원이 인가되는 순간 내부 소자의 미세한 공정 편차에 의해 특정한 한쪽 상태로 수렴하게 된다. 이때 형성되는 초기값은 셀마다 다르게 나타나며, 여러 셀의 초기값을 모으면 칩 고유의 <strong>bit pattern</strong>을 얻을 수 있다.</p>
<p>이러한 특성 덕분에 SRAM PUF는 별도의 복잡한 회로 없이도 구현할 수 있으며, 기존 SRAM 구조를 그대로 활용할 수 있다는 점에서 하드웨어 보안 분야에서 널리 연구되어 왔다.</p>
<p>다만 실제 SRAM PUF에서는 모든 셀이 항상 안정적인 초기값을 보장하지는 않으며, 이러한 안정성 문제는 곧 PUF의 <strong>reliability</strong>와 직접적으로 연결된다.</p>
<hr>
<h2 id="4-6t-sram-cell과-제안한-8t-sram-cell">4. 6T SRAM Cell과 제안한 8T SRAM Cell</h2>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/298e9e91-646b-43eb-8379-e435b6c5ba34/image.png" alt=""></p>
<blockquote>
<p>Conventional <strong>6T SRAM cell</strong>은 두 개의 <strong>cross-coupled inverter</strong>와 두 개의 <strong>access transistor</strong>로 이루어진 가장 기본적인 SRAM 구조이다.</p>
</blockquote>
<p>일반적인 메모리 용도로는 면적 효율이 높고 구현이 단순하다는 장점이 있지만, PUF 관점에서는 <strong>power-up 시 초기 상태가 얼마나 안정적으로 결정되는지</strong>가 매우 중요하다.</p>
<p>특히 셀 내부의 mismatch가 충분하지 않은 경우에는 전원 인가 시 특정 상태로 강하게 수렴하지 못하고, 외란이나 조건 변화에 따라 초기값이 달라질 수 있다. 이러한 현상은 반복 동작 시 <strong>bit flip</strong>으로 나타나며, 결국 PUF의 <strong>reliability</strong>를 저하시키는 원인이 된다.</p>
<p>따라서 본 프로젝트에서는 기존 6T SRAM cell의 안정성을 정량적으로 확인하기 위해 <strong>SNM(Static Noise Margin)</strong> 을 기준으로 분석을 진행하였다.</p>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/62739fba-44e0-4f88-8b95-a2ef34707b73/image.png" alt=""></p>
<p>이를 위해 Virtuoso 환경에서 <strong>graphical technique</strong>을 적용할 수 있도록 <strong>transformation 회로</strong>를 구성하였고, 이를 바탕으로 <strong>Abs. SNM</strong>과 <strong>Diff. SNM</strong>을 측정하였다.</p>
<p>구체적으로는 곡선을 <strong>45도 회전</strong>시킨 뒤, SNM 사각형의 대각선 길이를 측정하고 이를 <strong>√2로 나누는 방식</strong>으로 값을 계산하였다.</p>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/79165fb9-5c76-41b7-b0b1-14fc7b7478e0/image.png" alt=""></p>
<p>기존 6T 구조를 분석한 뒤, PUF 응답의 안정성을 높이기 위한 새로운 <strong>8T SRAM PUF 구조</strong>를 설계하였다. 새로 설계한 구조는 아래와 같다.</p>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/d267a55e-3bfe-448d-be14-fa4e95c4490f/image.png" alt=""></p>
<p>제안한 8T 구조는 기존 6T SRAM에 <strong>항상 ON 상태의 PMOS 2개</strong>를 추가한 형태이다. 이 PMOS의 on-resistance에 의해 내부 <strong>Q/QB 노드의 전압 강하</strong>가 유도되고, 그 결과 <strong>SNM의 상대적 불균형</strong>이 커지도록 설계하였다. 이를 통해 power-up 시 초기값의 결정성을 높이고자 하였다.</p>
<p>제안한 구조의 핵심은 <strong>Diff. SNM을 증가시켜 power-up 초기값의 결정성을 높이고</strong>, 동시에 <strong>Abs. SNM은 read 동작이 가능한 수준으로 유지하는 것</strong>이다.</p>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/3e68731d-ea6a-4ab2-825e-d0149e2f35ea/image.png" alt=""></p>
<blockquote>
<p>결과적으로, 0.5um 5V 공정 PDK에서 <strong>기존 6T SRAM</strong>의 <strong>Abs. SNM / Diff. SNM</strong>은 각각 <strong>549.3 mV / 34.62 mV</strong>였고, 제안한 <strong>8T SRAM</strong>에서는 <strong>502.7 mV / 59.62 mV</strong>로 측정되었다. 
즉, <strong>Abs. SNM은 일부 감소했지만 Diff. SNM은 약 1.7배 향상</strong>되어 PUF 안정성 개선 가능성을 확인하였다.</p>
</blockquote>
<hr>
<h2 id="5-마무리">5. 마무리</h2>
<p>이번 프로젝트에서는 기존 <strong>6T SRAM PUF</strong>의 한계로 지적될 수 있는 <strong>bit flip 문제</strong>에 주목하여, 보다 안정적인 응답 특성을 갖는 <strong>8T SRAM PUF 구조</strong>를 설계하였다.</p>
<p>또한 셀 단위 설계에 머무르지 않고, <strong>16×16 array와 주변 회로를 포함한 통합 매크로 설계</strong>, <strong>SNM 기반 안정성 분석</strong>, <strong>레이아웃 구현</strong>, 그리고 <strong>MPW용 GDS 제출</strong>까지 수행하였다.</p>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/93652557-9cdd-40dd-9de3-3849ae47db5a/image.png" alt=""></p>
<p>향후 칩이 수령되면 <strong>28-pin SOP 패키지</strong>를 장착할 수 있는 <strong>PCB</strong>를 설계하고, <strong>FPGA</strong>를 활용하여 실제 칩 구동 및 응답 수집을 진행할 예정이다. 이를 통해 <strong>randomness</strong>, <strong>uniqueness</strong>, <strong>reliability</strong>와 같은 PUF의 핵심 성능 지표를 추가적으로 검증하고자 한다.</p>
<blockquote>
<p>결과적으로 본 프로젝트는 <strong>셀 구조 제안</strong>, <strong>주변 회로를 포함한 매크로 설계</strong>, <strong>안정성 분석</strong>, <strong>레이아웃 구현</strong>, 그리고 <strong>MPW 제출</strong>까지 완료한 통합적인 SRAM PUF 설계 프로젝트라고 할 수 있다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AMBA AXI4] AXI4-Lite Interface 실습 ]]></title>
            <link>https://velog.io/@bjunverse_/AXI4-Lite-Interface-%EC%8B%A4%EC%8A%B5</link>
            <guid>https://velog.io/@bjunverse_/AXI4-Lite-Interface-%EC%8B%A4%EC%8A%B5</guid>
            <pubDate>Tue, 03 Mar 2026 06:27:44 GMT</pubDate>
            <description><![CDATA[<h2 id="1-write-transaction">1. Write Transaction</h2>
<blockquote>
<p><strong>AXI4-Lite</strong>에서 CPU(Master)가 주변 장치(Slave)의 레지스터에 데이터를 쓰는 과정은 세 개의 독립적인 채널을 통해 이루어진다.
각 채널에서 전송은 <code>VALID</code>와 <code>READY</code>가 동시에 1이 되는 클럭 사이클에 성립한다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/a0d8cccd-eacb-4e92-bc9a-60dd897dddef/image.png" alt=""></p>
<h4 id="stage-1-write-address-channel-aw">STAGE 1: Write Address Channel (AW)</h4>
<ul>
<li>이 채널을 통해 전달되는 정보는 쓰기 주소 <code>AWADDR[31:0]</code>이다. 핸드셰이크 신호로는 <code>AWVALID</code>와 <code>AWREADY</code>가 있다.</li>
</ul>
<h4 id="stage-2--write-data-channel-w">STAGE 2 : Write Data Channel (W)</h4>
<ul>
<li>이 채널을 통해 전달되는 정보는 쓰기 데이터 <code>WDATA[31:0]</code>와 바이트 선택 마스크 <code>WSTRB[3:0]</code>이다. 핸드셰이크 신호로는 <code>WVALID</code>와 <code>WREADY</code>가 있다.</li>
</ul>
<h4 id="stage-3--write-response-channel-b">STAGE 3 : Write Response Channel (B)</h4>
<ul>
<li>이 채널을 통해 전달되는 정보는 응답 코드 <code>BRESP[1:0]</code>이다. 핸드셰이크 신호로는 <code>BVALID</code>와 <code>BREADY</code>가 있다.</li>
</ul>
<blockquote>
<p>여기서 중요한 점은 세 채널이 <strong>핸드셰이크 관점에서는 서로 독립적</strong>으로 동작한다는 것이다. 즉, Write Address Channel과 Write Data Channel은 서로 다른 시점에 핸드셰이크가 성립할 수 있다.</p>
</blockquote>
<blockquote>
<p>다만 Slave는 주소와 데이터를 모두 정상적으로 수신한 뒤에야 Write Response를 반환할 수 있으므로, <strong>전체적인 처리 순서는 논리적으로 유지</strong>된다.</p>
</blockquote>
<h3 id="--write-address-channel-상세-분석">- Write Address Channel 상세 분석</h3>
<ul>
<li><p><code>AWADDR[31:0]</code> - Write Address</p>
</li>
<li><p>*[31:10]** : Reserved(예약됨, 사용하지 않음). AXI-Lite는 최대 1024비트까지만 주소 공간을 사용하는 경우가 많다. 이보다 큰 주소 공간이 필요하면 AXI-Full을 사용한다.</p>
</li>
<li><p>*[9:2]** : 레지스터 인덱스(8비트). 이 비트들은 실제로 어느 레지스터를 선택할지를 결정한다.</p>
</li>
<li><p>*[1:0]** : 항상 <code>2&#39;b00</code>(바이트 오프셋).</p>
</li>
<li><p><code>AWVALID</code> - Address Valid</p>
</li>
<li><p><code>AWREADY</code> - Address Ready</p>
</li>
</ul>
<h3 id="--write-data-channel-상세-분석">- Write Data Channel 상세 분석</h3>
<ul>
<li><p><code>WDATA[31:0]</code> - Write Data
실제로 레지스터에 쓸 32비트 데이터이다. Master가 이 값을 Slave에게 전달하면, Slave는 이 값을 레지스터에 저장한다.</p>
</li>
<li><p><code>WSTRB[3:0]</code> - Write Strobe
32비트의 데이터 중에서 어느 바이트를 실제로 쓸 것인지 선택할 수 있다.
예를 들어 <code>WSTRB = 4&#39;b1111</code>이면 4바이트 전체를 쓰고, <code>WSTRB = 4&#39;b0011</code>이면 하위 2바이트만 갱신할 수 있다.</p>
</li>
<li><p><code>WVALID</code> - Data Valid</p>
</li>
<li><p><code>WREADY</code> - Data Ready</p>
</li>
</ul>
<h3 id="--write-response-channel-상세-분석">- Write Response Channel 상세 분석</h3>
<ul>
<li><p><code>BRESP[1:0]</code> - Write Response Code
쓰기 동작의 결과를 나타내는 응답 코드이다. AXI4-Lite에서는 보통 <code>OKAY</code>, <code>SLVERR</code>, <code>DECERR</code>를 사용한다. (OKAY, SLVERR, DECERR, <del>EXOKAY</del>)</p>
</li>
<li><p><code>BVALID</code> - Response Valid</p>
</li>
<li><p><code>BREADY</code> - Response Ready</p>
</li>
</ul>
<blockquote>
<p>즉, AXI4-Lite의 write transaction은 <strong>Address handshake</strong>, <strong>Data handshake</strong>, 그리고 <strong>Write Response handshake</strong>가 모두 완료되어야 최종적으로 끝난다.</p>
</blockquote>
<hr>
<h2 id="2-read-transaction">2. Read Transaction</h2>
<blockquote>
<p>Write transaction이 3개의 채널로 구성되는 반면, <strong>Read transaction</strong>은 2개의 채널만으로 처리된다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/6288b145-8452-457e-8abd-2a92c143ec78/image.png" alt=""></p>
<h4 id="stage-1--read-address-channel-ar">STAGE 1 : Read Address Channel (AR)</h4>
<ul>
<li>이 채널의 신호로는 <code>ARADDR[31:0]</code>, <code>ARVALID</code>, <code>ARREADY</code>가 있다.</li>
</ul>
<h4 id="stage-2--read-data-channel-r">STAGE 2 : Read Data Channel (R)</h4>
<ul>
<li>이 채널의 신호로는 <code>RDATA[31:0]</code>, <code>RRESP[1:0]</code>, <code>RVALID</code>, <code>RREADY</code>가 있다.</li>
</ul>
<h3 id="--read-address-channel-상세-분석">- Read Address Channel 상세 분석</h3>
<ul>
<li><p><code>ARADDR[31:0]</code> - Read Address
읽기를 수행할 레지스터의 주소를 나타낸다. <code>AWADDR</code>와 마찬가지로 비트 필드 구조를 가진다.</p>
</li>
<li><p><code>ARVALID</code> - Address Valid</p>
</li>
<li><p><code>ARREADY</code> - Address Ready</p>
</li>
</ul>
<h3 id="--read-data-channel-상세-분석">- Read Data Channel 상세 분석</h3>
<ul>
<li><p><code>RDATA[31:0]</code> - Read Data
Slave가 내부 레지스터에서 읽어 반환하는 32비트 데이터이다. Master는 이 값을 받아 CPU 레지스터나 메모리에 저장하게 된다.</p>
</li>
<li><p><code>RRESP[1:0]</code> - Read Response
읽기 동작의 결과를 나타낸다. 기본적으로 Write의 BRESP와 동일한 코드를 사용한다.</p>
</li>
<li><p><code>RVALID</code> - Read Valid</p>
</li>
<li><p><code>RREADY</code> - Read Ready</p>
</li>
</ul>
<blockquote>
<p>즉, AXI4-Lite의 read transaction은 <strong>Read Address handshake</strong> 이후, Slave가 <strong>Read Data와 Response</strong>를 반환하고 이에 대한 handshake가 완료되면 끝난다.</p>
</blockquote>
<hr>
<h2 id="3-register-type">3. Register Type</h2>
<blockquote>
<p>AXI4-Lite Slave를 설계할 때, 주소로 선택되는 각 레지스터는 보통 접근 방식에 따라 <strong>R/W(Register)</strong> 와 <strong>RO(Register)</strong> 로 구분된다.<br>이 구분은 단순한 속성 차이가 아니라, <strong>write/read transaction이 실제 하드웨어에서 어떻게 처리되는지</strong>를 결정한다.</p>
</blockquote>
<h3 id="--rw-readwrite-register">- R/W (Read/Write) Register</h3>
<ul>
<li><p>CPU가 읽고 쓸 수 있는 레지스터이다.</p>
</li>
<li><p>보통 Control, Config, Data register처럼 소프트웨어가 값을 설정해야 하는 항목들이 여기에 해당한다.  </p>
</li>
<li><p>Write transaction이 성공하면 해당 주소의 내부 플립플롭 값이 갱신되고, Read transaction에서는 현재 저장된 값이 그대로 반환된다.</p>
</li>
</ul>
<h3 id="--ro-read-only-register">- RO (Read-Only) Register</h3>
<ul>
<li><p>CPU가 읽을 수만 있고 직접 쓸 수는 없는 레지스터이다.  </p>
</li>
<li><p>보통 Status, Error, Version register처럼 하드웨어 상태를 소프트웨어에 알려 주기 위한 용도로 사용된다.  </p>
</li>
<li><p>이 레지스터의 값은 내부 하드웨어 로직이 실시간으로 갱신하며, CPU가 write를 시도하더라도 무시하거나 에러 응답으로 처리할 수 있다.</p>
</li>
</ul>
<blockquote>
<p>결국 AXI4-Lite 인터페이스의 핵심은 <strong>주소 채널로 어떤 레지스터를 선택</strong>하고, <strong>데이터 채널로 그 레지스터를 읽거나 쓰는 구조</strong>라고 볼 수 있다.</p>
</blockquote>
<hr>
<h2 id="4-summary">4. Summary</h2>
<p>지금까지 AXI4-Lite의 Write / Read Transaction 구조와, 이를 통해 접근되는 레지스터의 종류(R/W, RO)를 살펴보았다.  </p>
<p>AXI4-Lite는 burst transfer를 지원하지 않는 대신, 비교적 단순한 구조로 제어 레지스터 접근에 적합한 인터페이스이다.
따라서 <strong>주변 장치의 제어/상태 레지스터를 설계할 때 가장 널리 사용되는 방식 중 하나</strong>이다.</p>
<p>아래 저장소에는 이러한 구조를 바탕으로 작성한 AXI4-Lite 설계가 정리되어 있다.</p>
<ul>
<li>Github : <code>https://github.com/bjunverse26/AXI4_Lite</code></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[AMBA AXI4] Bus부터 AXI Protocol까지]]></title>
            <link>https://velog.io/@bjunverse_/Bus-and-AMBA-AXI4</link>
            <guid>https://velog.io/@bjunverse_/Bus-and-AMBA-AXI4</guid>
            <pubDate>Tue, 03 Mar 2026 04:49:12 GMT</pubDate>
            <description><![CDATA[<h2 id="1-what-is-bus">1. What is Bus</h2>
<blockquote>
<p>디지털 시스템에서는 여러 하드웨어 블록이 서로 데이터를 주고받아야 한다. 이 때 이들 사이의 공통 통신 경로 역할을 하는 것이 <strong>Bus</strong>이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/6d93be22-1bde-46d5-82ed-ef61bb75b42e/image.png" alt=""></p>
<p>Bus는 여러 블록이 데이터를 주고받기 위해 사용하는 공통 통신 경로이며, 전통적으로는 공유 신호선 형태로 구현된다.</p>
<p>이 과정에서 전송을 시작하는 주체를 <strong>Master</strong>, 요청에 응답하는 주체를 <strong>Slave</strong>라고 한다. 예를 들어 어떤 장치가 특정 주소로 읽기 또는 쓰기 요청을 보내면 그 장치는 <strong>Master</strong>가 되고, 그 요청을 받아 데이터를 저장하거나 반환하는 장치는 <strong>Slave</strong>가 된다.</p>
<h3 id="--address-decoding">- Address Decoding</h3>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/c020a7f8-9d9d-4ae3-aeb5-a8dbdc6111e3/image.png" alt=""></p>
<p>시스템에서는 보통 여러 개의 Slave가 연결되어 있으므로, 어떤 장치가 응답해야 하는지는 <strong>주소(Address)</strong>를 기준으로 결정된다. 즉, <strong>Address Decoder</strong>가 전달된 주소를 해석하여 해당 주소 공간을 담당하는 Slave를 선택하게 된다. </p>
<h3 id="--arbitration">- Arbitration</h3>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/0b5af5e8-731f-4409-b387-7251beba2ab2/image.png" alt=""></p>
<p>또한, 시스템에서는 한 번에 여러 Master가 존재할 수 있다. 이 경우 어떤 Master의 요청을 먼저 처리할지를 정하는 과정이 필요한데, 이를 <strong>Arbitration</strong>이라고 한다. Arbiter는 여러 요청 가운데 하나를 선택하여 Bus 자원을 사용할 수 있도록 한다.</p>
<blockquote>
<p>즉, Address Decoder는 <strong>어느 Slave를 선택할지</strong> 결정하고, Arbiter는 <strong>어느 Master의 요청을 먼저 처리할지</strong> 결정한다.</p>
</blockquote>
<hr>
<h2 id="2-about-the-axi-protocol">2. About the AXI protocol</h2>
<blockquote>
<p>현대 <strong>SoC(System on Chip)</strong> 설계에서 CPU와 주변 장치 간의 통신은 필수적이다. 모든 시스템은 CPU가 메모리에 데이터를 읽고 쓰듯이 주변 장치의 레지스터에 접근할 수 있어야 한다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/30d151ac-0e20-46fa-a6bb-fd2d87b2e637/image.png" alt=""></p>
<p>이때 가장 널리 사용되는 표준 인터페이스가 바로 <strong>AXI(Advanced eXtensible Interface)</strong> 프로토콜이다.</p>
<p>AXI는 단순한 “공유 버스”보다는, 보통 <strong>AXI Interconnect</strong> 위에서 여러 Master와 Slave 간 트래픽을 중재하며 동작하는 <strong>SoC 내부 표준 인터페이스</strong>로 이해하는 것이 더 정확하다.</p>
<p>AXI의 특징으로는 <strong>높은 대역폭, 낮은 지연 시간, 유연성 및 호환성, Burst 기반 연속 접근</strong> 등이 있다.</p>
<blockquote>
<p>ARM社의 AMBA(Advanced Microcontroller Bus Architecture) 규격에는 서로 다른 용도에 최적화된 세 가지 AXI 계열 인터페이스가 존재한다.</p>
</blockquote>
<p> <img src="https://velog.velcdn.com/images/bjunverse_/post/9cccfbae-c7f5-4c5b-a791-867fa7145eca/image.png" alt=""></p>
<h3 id="--axi4-lite">- AXI4-Lite</h3>
<ul>
<li><p><strong>간단한 레지스터 접근</strong>에 특화되어 있다.</p>
</li>
<li><p>CPU나 DMA 컨트롤러가 주변 장치의 제어 레지스터를 읽거나 쓸 때 주로 사용된다.</p>
</li>
<li><p><strong>Burst 전송을 지원하지 않는</strong> 단순한 memory-mapped I/O 형태이며, 데이터량이 많지 않은 제어 경로에 적합하다.</p>
</li>
</ul>
<h3 id="--axi4">- AXI4</h3>
<ul>
<li><p><strong>대용량 데이터의 고속 전송</strong>에 특화되어 있다.</p>
</li>
<li><p><strong>Burst 전송</strong>을 통해 주소 오버헤드를 줄이고, 연속적인 데이터 beat 전송으로 <strong>DRAM/메모리 컨트롤러가 선호하는 접근 패턴</strong>을 만들기 쉽다.</p>
</li>
<li><p>메모리 컨트롤러, DMA 엔진, 고속 I/O 인터페이스처럼 많은 양의 데이터를 빠르게 전송해야 하는 곳에 사용된다.</p>
</li>
</ul>
<h3 id="--axi4-stream">- AXI4-Stream</h3>
<ul>
<li><p><strong>연속적인 데이터 스트림 전송</strong>에 특화되어 있다.</p>
</li>
<li><p><strong>주소 개념이 없고</strong>, 데이터가 계속 흘러가는 파이프라인 구조이다.</p>
</li>
<li><p>영상/오디오/네트워크 패킷/신호처리(DSP)처럼 <strong>데이터 흐름 자체</strong>가 중요한 경로에 많이 사용된다.</p>
</li>
</ul>
<blockquote>
<p><strong>정리</strong>: CPU 중심 시스템의 전형적인 구성으로는, CPU가 <strong>AXI4</strong>로 메모리 컨트롤러에 연결되어 DRAM에 고속으로 접근하고, 
동시에 CPU는 <strong>AXI4-Lite</strong>로 여러 주변 장치의 제어 레지스터에 연결되어 설정을 변경하고 상태를 읽는다. 
또한 주변 장치들은 <strong>AXI4-Stream</strong>으로 서로 연결되어 연속 데이터를 처리한다.</p>
</blockquote>
<hr>
<h2 id="3-axi-channel-structure">3. AXI Channel Structure</h2>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/b9a68897-06a0-473f-83e8-a3bcd4843425/image.png" alt=""></p>
<p>위 5채널(AW/W/B/AR/R) 구조는 AXI4/AXI4-Lite 같은 Memory-Mapped AXI 기준이며, AXI4-Stream은 주소 채널이 없는 별도의 스트리밍 인터페이스이다.</p>
<p>이러한 채널 분리는 주소, 데이터, 응답 경로를 서로 독립적으로 처리할 수 있게 하여, 단일 버스 구조보다 <strong>더 높은 처리량과 유연한 파이프라이닝</strong>을 가능하게 한다.</p>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/a7c8afcb-a2b2-46bb-91a8-34b74c2797be/image.png" alt=""></p>
<blockquote>
<p>각 채널은 <strong>VALID/READY 핸드셰이크</strong>를 사용하여, 상대가 느릴 때 전송을 잠시 멈추는 <strong>backpressure</strong>를 자연스럽게 지원한다.
이때 송신 측이 READY를 기다렸다가 VALID를 올리면, 상대도 VALID를 기다리는 경우 <strong>deadlock</strong>이 발생할 수 있다.</p>
</blockquote>
<h4 id="axi는-총-5개의-채널로-transaction을-처리한다">AXI는 총 5개의 채널로 Transaction을 처리한다.</h4>
<ul>
<li>Write request, which has signal names beginning with <strong>AW</strong></li>
<li>Write data, which has signal names beginning with <strong>W</strong></li>
<li>Write response, which has signal names beginning with <strong>B</strong></li>
<li>Read request, which has signal names beginning with <strong>AR</strong></li>
<li>Read data, which has signal names beginning with <strong>R</strong></li>
</ul>
<h3 id="--axi의-5개-채널과-각-역할">- AXI의 5개 채널과 각 역할</h3>
<p><img src="https://velog.velcdn.com/images/bjunverse_/post/60b2b76f-253a-42e6-8f32-3073b1518dfd/image.png" alt=""></p>
<ul>
<li><p><strong>Write and read request channels</strong> : 전송될 데이터의 주소 및 제어 정보를 전달하며, 이를 Request라고 부른다. 쓰기 요청과 읽기 요청을 위한 채널이 각각 별도로 존재한다.</p>
</li>
<li><p><strong>Write data channel</strong> : Master에서 Slave로 실제 데이터를 전송한다. 데이터 폭은 최대 1024비트까지 가능하며, 8비트마다 유효한 바이트를 나타내는 <strong>Byte lane strobe</strong> 신호를 포함한다.</p>
</li>
<li><p><strong>Write response channel</strong> : Slave가 Master에게 쓰기 작업이 정상적으로 완료되었음을 알린다. 이 응답은 개별 데이터 전송마다 발생하는 것이 아니라, 전체 write transaction이 끝난 뒤 한 번 전달된다.</p>
</li>
<li><p><strong>Read data channel</strong> : Slave에서 Master로 데이터를 전송한다. 이 채널은 읽기 데이터와 함께 해당 transaction의 응답 정보도 함께 전달한다.</p>
</li>
</ul>
<hr>
<h2 id="4-summary">4. Summary</h2>
<p>이번 글에서는 Bus의 기본 개념부터 AXI 프로토콜의 전체 구조, 그리고 AXI의 채널 구성까지 정리해보았다.</p>
<blockquote>
<p><strong>AXI</strong>는 주소, 데이터, 응답을 독립적인 채널로 분리함으로써 높은 성능과 유연성을 제공한다.</p>
</blockquote>
<p>이후 글에서는 <strong>AXI4-Lite</strong>와 <strong>AXI4</strong> 인터페이스를 직접 설계하고, handshake와 read/write transaction이 실제 RTL에서 어떻게 구현되는지 살펴볼 예정이다.</p>
]]></description>
        </item>
    </channel>
</rss>