<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>yztech</title>
    <link>https://yztech.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 23 Jun 2026 12:07:18 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yztech</managingEditor>
    <image>
      <title>yztech</title>
      <url>https://tistory1.daumcdn.net/tistory/4729236/attach/d3c41fb7c8a0485a9097de5a23dd96ec</url>
      <link>https://yztech.tistory.com</link>
    </image>
    <item>
      <title>Python으로 pdf를 jpg로 변환하기</title>
      <link>https://yztech.tistory.com/151</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Python 으로 PDF를 JPG로 변환하려면, 아래 순서대로 따라 하시면 됩니다. 완전 초보여도 문제없어요  &lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. Python 설치 (한 번만 하면 됨)&lt;/span&gt;&lt;/h2&gt;
&lt;h3 contenteditable=&quot;true&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  이미 설치돼 있다면 이 단계는 건너뛰세요!&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;a href=&quot;https://www.python.org/downloads/&quot;&gt;https://www.python.org/downloads/&lt;/a&gt;&lt;/span&gt;&lt;span&gt; 에서 Python 3.x 다운로드 후 설치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;설치 중 &lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;ldquo;Add Python to PATH&amp;rdquo;&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 꼭 체크하세요 ✅&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;설치 확인:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;python --version&lt;/code&gt;&lt;/pre&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. 필요한 라이브러리 설치&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;터미널(cmd, PowerShell, Terminal 등)에서 아래 명령 실행:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install pdf2image pillow&lt;/code&gt;&lt;/pre&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. Poppler 설치 (Windows만 해당)&lt;/span&gt;&lt;/h2&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;pdf2image&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;는 내부적으로 Poppler라는 도구를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 contenteditable=&quot;true&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  설치 방법:&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;여기서 다운로드   &lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://github.com/oschwartz10612/poppler-windows/releases&quot;&gt;https://github.com/oschwartz10612/poppler-windows/releases&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;ZIP 파일 다운로드 후 압축 해제&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;예를 들어 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;C:\poppler-xx\Library\bin&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 경로를 &lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;환경 변수(Path)에 추가&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 contenteditable=&quot;true&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4. Python 코드 실행&lt;/span&gt;&lt;/h2&gt;
&lt;h3 contenteditable=&quot;true&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  예제 코드 저장&lt;/span&gt;&lt;/h3&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;메모장이나 VSCode 등에 아래 코드 붙여넣고 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;pdf_to_jpg.py&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;로 저장:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from pdf2image import convert_from_path

images = convert_from_path(&quot;sample.pdf&quot;)  # 여기에 변환할 PDF 이름
for i, img in enumerate(images):
    img.save(f&quot;page_{i + 1}.jpg&quot;, &quot;JPEG&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;  PDF 파일(&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;sample.pdf&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)은 &lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;이 Python 파일과 같은 폴더&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt;에 두세요.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 contenteditable=&quot;true&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  실행하기&lt;/span&gt;&lt;/h3&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;터미널(cmd) 열고 해당 파일이 있는 폴더로 이동 후:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;python pdf_to_jpg.py&lt;/code&gt;&lt;/pre&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;성공하면 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;page_1.jpg&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;page_2.jpg&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 등의 이미지가 생성됩니다!&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;</description>
      <category>SW 설계/파이썬</category>
      <category>jpg</category>
      <category>jpg변환</category>
      <category>PDF</category>
      <category>pdf2jpg</category>
      <category>pdf변환</category>
      <category>python</category>
      <category>python 설치</category>
      <category>무료pdf변환</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/151</guid>
      <comments>https://yztech.tistory.com/151#entry151comment</comments>
      <pubDate>Wed, 9 Apr 2025 06:38:36 +0900</pubDate>
    </item>
    <item>
      <title>git 에서 ^M 차이나는 경우</title>
      <link>https://yztech.tistory.com/150</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Git 저장소에 있는 파일을 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;git clone&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 하거나 작업하면서, 파일 내용 중에 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;^M&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 문자가 생기는 경우&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;또는 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;^M&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 차이가 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;git diff&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;에 나타나는 경우&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이건 주로 &lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;줄바꿈(LF/CRLF)&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 문제 때문입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 contenteditable=&quot;true&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;^M&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 문자의 정체는?&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;^M&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;은 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;CR&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (Carriage Return, ASCII 13, &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;\r&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;) 문자를 뜻합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Windows는 줄 끝을 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;CRLF&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;\r\n&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)로 저장하지만,&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Linux/macOS는 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;LF&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;\n&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)만 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그래서 파일을 Windows에서 만들고 Git을 통해 Linux/macOS에서 열거나 반대의 경우, &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;^M&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 문자가 보일 수 있어요.&lt;/span&gt;&lt;/p&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 contenteditable=&quot;true&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;✅ 해결 방법&lt;/span&gt;&lt;/h3&gt;
&lt;h4 contenteditable=&quot;true&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;1. &lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;Git의 자동 줄바꿈 설정 확인하기&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;git config --global core.autocrlf&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-mark=&quot;-&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;true&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: 체크아웃 시 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;LF&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;CRLF&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;, 커밋 시 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;CRLF&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;LF&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;input&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: 체크아웃 시 아무것도 안 하고, 커밋 시 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;CRLF&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;LF&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;false&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: 변환하지 않음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;권장 설정 (Linux/macOS 사용 시):&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;git config --global core.autocrlf input&lt;/code&gt;&lt;/pre&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;Windows 사용 시:&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;git config --global core.autocrlf true&lt;/code&gt;&lt;/pre&gt;
&lt;h4 contenteditable=&quot;true&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;2. &lt;/span&gt;&lt;span&gt;&lt;span&gt;**&lt;/span&gt;&lt;b&gt;&lt;span&gt;파일에서 직접 ^M 제거하기&lt;/span&gt;&lt;/b&gt;&lt;span&gt;**&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;# macOS/Linux에서
sed -i 's/\r//' filename&lt;/code&gt;&lt;/pre&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 contenteditable=&quot;true&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;git diff&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;에서 ^M만 차이나는 경우?&lt;/span&gt;&lt;/h3&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;그럼 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;git diff&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt;가 줄 끝 문자 차이를 보여주는 거예요. 아래처럼 diff를 무시하게 할 수 있어요:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;git diff --ignore-space-at-eol&lt;/code&gt;&lt;/pre&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;또는 &lt;/span&gt;&lt;span&gt;&lt;span&gt;`&lt;/span&gt;.gitattributes&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span&gt; 파일에 아래 설정을 추가해 강제로 LF만 쓰도록 할 수도 있어요:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;*.txt text eol=lf
*.sh text eol=lf&lt;/code&gt;&lt;/pre&gt;
&lt;div contenteditable=&quot;false&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;p contenteditable=&quot;true&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>작업 tools/git</category>
      <category>autocrlf</category>
      <category>core.autocrlf</category>
      <category>CRLF</category>
      <category>git diff</category>
      <category>\n</category>
      <category>\r</category>
      <category>^m</category>
      <category>줄바꾸기</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/150</guid>
      <comments>https://yztech.tistory.com/150#entry150comment</comments>
      <pubDate>Tue, 8 Apr 2025 07:47:51 +0900</pubDate>
    </item>
    <item>
      <title>Glitch free selection in Clock Mux</title>
      <link>https://yztech.tistory.com/148</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Clock Mux의 &lt;code&gt;sel&lt;/code&gt; 신호에 Glitch 발생 시 문제점 및 해결 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Clock Mux(&lt;code&gt;clk_mux&lt;/code&gt;)는 두 개 이상의 클럭 신호 중 하나를 선택하는 역할을 합니다. 그러나 &lt;code&gt;sel&lt;/code&gt; 신호에 글리치(Glitch)가 발생하면 &lt;b&gt;예기치 않은 클럭 전환&lt;/b&gt;, &lt;b&gt;메타스테빌리티&lt;/b&gt;, &lt;b&gt;타이밍 위반&lt;/b&gt; 등의 문제가 발생할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문제점 (Issues)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Glitch로 인한 짧은 Clock Pulse 발생&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;sel&lt;/code&gt; 신호가 글리치로 인해 빠르게 변하면, Clock Mux의 출력이 순간적으로 잘못된 클럭을 선택할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이로 인해 &lt;b&gt;짧은 클럭 펄스&lt;/b&gt;(Glitch Clock Pulse)가 생성되어, 플립플롭(FF)이 비정상적인 동작을 하거나 &lt;b&gt;타이밍 위반&lt;/b&gt;을 유발할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Metastability (메타스테빌리티)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;sel&lt;/code&gt; 신호가 비동기적으로 전환되면, Mux 내부에서 클럭이 &lt;b&gt;비정확한 타이밍&lt;/b&gt;에 바뀔 수 있습니다.&lt;/li&gt;
&lt;li&gt;결과적으로 일부 레지스터가 새로운 클럭에서 &lt;b&gt;setup/hold violation&lt;/b&gt;을 일으켜 불안정한 동작을 초래할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Clock Domain Crossing (CDC) 문제&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;sel&lt;/code&gt; 신호가 &lt;b&gt;다른 클럭 도메인에서 오면&lt;/b&gt; 동기화 없이 사용할 경우, Clock Mux가 &lt;b&gt;비정상적으로 전환&lt;/b&gt;되면서 데이터 손실이 발생할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결 방법 (Solutions)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. &lt;code&gt;sel&lt;/code&gt; 신호를 동기화(Synchronization)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;sel&lt;/code&gt; 신호가 다른 클럭 도메인에서 오는 경우, 반드시 &lt;b&gt;플립플롭을 이용한 동기화 회로&lt;/b&gt;를 사용해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예제: 2단계 동기화 회로&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;  module sync_sel (
      input logic clk,
      input logic async_sel,
      output logic sync_sel
  );
      logic sel_ff1;
      always @(posedge clk) begin
          sel_ff1  &amp;lt;= async_sel;
          sync_sel &amp;lt;= sel_ff1;
      end
  endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;async_sel&lt;/code&gt;을 두 개의 플립플롭(FF) 단계를 거쳐 &lt;code&gt;sync_sel&lt;/code&gt;로 변환하여 &lt;b&gt;메타스테빌리티 및 글리치 방지&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Glitch-Free Mux 설계&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;글리치 없는 클럭 전환을 위해 &lt;b&gt;래치(Latch) 기반 Mux&lt;/b&gt; 또는 &lt;b&gt;Clock Switch Cell&lt;/b&gt;을 사용.&lt;/li&gt;
&lt;li&gt;예제: &lt;b&gt;래치 기반 Clock Mux&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;  module glitch_free_clock_mux (
      input logic clk1, clk2, 
      input logic sel, 
      output logic clk_out
  );
      logic sel_latch;

      always @(clk1 or clk2 or sel) begin
          if (!clk1 &amp;amp;&amp;amp; !clk2) sel_latch = sel; // 클럭이 LOW일 때만 변경
      end

      assign clk_out = sel_latch ? clk2 : clk1;
  endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클럭이 &lt;b&gt;LOW일 때만&lt;/b&gt; &lt;code&gt;sel&lt;/code&gt; 신호를 업데이트하여 글리치를 방지.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Clock Gating을 활용한 안전한 전환&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ASIC 설계에서는 &lt;b&gt;전용 Clock Gating Cell&lt;/b&gt;을 사용하여 안전하게 클럭을 전환해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Clock Gating 기반 안전한 전환 예제&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;  module safe_clock_mux (
      input logic clk1, clk2,
      input logic sel, 
      output logic clk_out
  );
      logic gated_clk1, gated_clk2;

      assign gated_clk1 = clk1 &amp;amp; ~sel;
      assign gated_clk2 = clk2 &amp;amp; sel;

      assign clk_out = gated_clk1 | gated_clk2;
  endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 클럭을 &lt;b&gt;AND 게이팅 후 OR 연산&lt;/b&gt;하여 안전하게 전환.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;요약 (Summary)&lt;/b&gt;&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;문제&lt;/th&gt;
&lt;th&gt;영향&lt;/th&gt;
&lt;th&gt;해결 방법&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sel&lt;/code&gt; 신호의 글리치&lt;/td&gt;
&lt;td&gt;짧은 클럭 펄스 발생&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sel&lt;/code&gt; 신호를 클럭 도메인에 동기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비동기 &lt;code&gt;sel&lt;/code&gt; 전환&lt;/td&gt;
&lt;td&gt;메타스테빌리티, 타이밍 위반&lt;/td&gt;
&lt;td&gt;2단계 동기화 플립플롭 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDC 문제&lt;/td&gt;
&lt;td&gt;예측 불가능한 동작&lt;/td&gt;
&lt;td&gt;래치 기반 또는 Clock Switch Cell 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;잘못된 Clock Mux 설계&lt;/td&gt;
&lt;td&gt;데이터 손실 및 전력 문제&lt;/td&gt;
&lt;td&gt;전용 Clock Gating Cell 또는 안전한 전환 기법 활용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;sel&lt;/code&gt; 신호에 글리치가 발생하면 &lt;b&gt;잘못된 클럭 선택 및 짧은 펄스 생성&lt;/b&gt; 문제가 발생할 수 있습니다.&lt;/li&gt;
&lt;li&gt;이를 방지하기 위해:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;sel&lt;/code&gt; 신호를 동기화&lt;/b&gt;하고,&lt;/li&gt;
&lt;li&gt;&lt;b&gt;글리치 프리 Mux 설계&lt;/b&gt;(래치 기반) 또는 &lt;b&gt;전용 Clock Gating Cell을 사용&lt;/b&gt;해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;특히 ASIC/FPGA 설계에서는 &lt;b&gt;Clock Gating을 활용한 안전한 전환 방식&lt;/b&gt;을 고려하는 것이 중요합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SoC 설계/Verilog, SystemVerilog</category>
      <category>clock gating</category>
      <category>clock gating cell</category>
      <category>clock mux</category>
      <category>clock switch cell</category>
      <category>glitch free</category>
      <category>metastability</category>
      <category>timing violation</category>
      <category>verilog</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/148</guid>
      <comments>https://yztech.tistory.com/148#entry148comment</comments>
      <pubDate>Sat, 1 Feb 2025 08:41:02 +0900</pubDate>
    </item>
    <item>
      <title>Glitch free enable for clock gating</title>
      <link>https://yztech.tistory.com/147</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Clock Gating Cell의 Enable이 Glitch하면 발생하는 문제점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Clock Gating Cell의 &lt;code&gt;enable&lt;/code&gt; 신호에 글리치(Glitch)가 발생하면 심각한 타이밍 문제와 기능적 오류가 발생할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;주요 문제점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Clock Glitch (잘못된 클럭 펄스)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;enable&lt;/code&gt; 신호가 글리치가 발생하면, &lt;b&gt;의도하지 않은 짧은 클럭 펄스&lt;/b&gt;가 생성될 수 있습니다.&lt;/li&gt;
&lt;li&gt;이러한 펄스가 플립플롭(FF)으로 전달되면, &lt;b&gt;데이터 손실&lt;/b&gt; 또는 &lt;b&gt;타이밍 위반&lt;/b&gt;을 유발할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Metastability &amp;amp; Setup/Hold Time Violation&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;enable&lt;/code&gt; 신호가 &lt;b&gt;비동기 신호&lt;/b&gt;이거나 클럭 엣지와 정확히 정렬되지 않으면, 클럭 게이팅 셀 내부의 래치가 메타스테이블(Metastable) 상태에 빠질 수 있습니다.&lt;/li&gt;
&lt;li&gt;결과적으로 &lt;b&gt;예측 불가능한 동작&lt;/b&gt;을 초래하고 타이밍 위반을 발생시킬 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Power Consumption 문제&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클럭이 예상보다 더 많은 펄스를 생성하면 &lt;b&gt;불필요한 스위칭 활동(Switching Activity)&lt;/b&gt; 이 증가하여 전력 소모가 늘어납니다.&lt;/li&gt;
&lt;li&gt;특히 &lt;b&gt;동적 전력(Dynamic Power)&lt;/b&gt; 이 크게 증가할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;해결 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Enable 신호를 동기화하기 (Synchronize Enable Signal)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;enable&lt;/code&gt; 신호가 클럭 도메인과 다를 경우, 반드시 &lt;b&gt;플립플롭을 사용하여 동기화&lt;/b&gt;해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예제: 2단계 동기화 회로&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;async_enable&lt;/code&gt;을 두 개의 FF을 거쳐 &lt;code&gt;sync_enable&lt;/code&gt;로 변환하여 글리치를 방지함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;module sync_enable ( input logic clk, input logic async_enable, output logic sync_enable ); logic enable_ff1; always @(posedge clk) begin enable_ff1 &amp;lt;= async_enable; sync_enable &amp;lt;= enable_ff1; end endmodule&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Glitch-Free Latch 기반 Clock Gating Cell 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클럭 게이팅 셀은 내부적으로 &lt;b&gt;래치(Latch)&lt;/b&gt; 를 사용하여 enable 신호를 &lt;b&gt;안정화&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li&gt;예제: Glitch-Free Clock Gating 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;  module clock_gating (
      input logic clk,
      input logic enable,
      output logic gated_clk
  );
      logic latch_out;

      always @(clk or enable) begin
          if (!clk) latch_out = enable; // 클럭이 LOW일 때 enable을 래치
      end

      assign gated_clk = clk &amp;amp; latch_out;
  endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클럭이 LOW일 때&lt;/b&gt; enable 값을 래치하여, HIGH일 때 변경되지 않도록 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. ASIC/FPGA에서 공식 Clock Gating Cell 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FPGA 또는 ASIC 설계에서는 &lt;b&gt;전용 Clock Gating Cell&lt;/b&gt;을 사용해야 합니다.&lt;/li&gt;
&lt;li&gt;예를 들어, Synopsys 라이브러리의 &lt;code&gt;CLKGATE&lt;/code&gt; 셀을 활용하면 내부적으로 글리치를 방지하는 래치가 포함되어 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Clock Gating을 최소화하고 Enable Logic 사용&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클럭 게이팅보다 &lt;b&gt;Enable Logic&lt;/b&gt; (&lt;code&gt;if(enable)&lt;/code&gt;)을 선호하는 것이 더 안전할 수 있습니다.&lt;/li&gt;
&lt;li&gt;예제:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;  always @(posedge clk) begin
      if (enable)
          data_out &amp;lt;= data_in;
  end&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;요약&lt;/b&gt;&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;문제&lt;/th&gt;
&lt;th&gt;영향&lt;/th&gt;
&lt;th&gt;해결 방법&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enable&lt;/code&gt; 신호의 글리치&lt;/td&gt;
&lt;td&gt;잘못된 클럭 펄스 발생&lt;/td&gt;
&lt;td&gt;Enable 신호를 클럭 도메인에 동기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enable&lt;/code&gt;이 비동기 신호일 경우&lt;/td&gt;
&lt;td&gt;메타스테빌리티, 타이밍 위반&lt;/td&gt;
&lt;td&gt;2단계 동기화 플립플롭 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;잘못된 클럭 게이팅&lt;/td&gt;
&lt;td&gt;예상치 못한 동작, 높은 전력 소모&lt;/td&gt;
&lt;td&gt;글리치 방지 래치 기반 Clock Gating Cell 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;enable&lt;/code&gt; 신호의 글리치는 &lt;b&gt;잘못된 클럭 펄스&lt;/b&gt;와 &lt;b&gt;예측 불가능한 동작&lt;/b&gt;을 유발하므로 반드시 동기화해야 합니다.&lt;/li&gt;
&lt;li&gt;전용 &lt;b&gt;Clock Gating Cell&lt;/b&gt;을 사용하고, &lt;b&gt;비동기 신호는 동기화 회로를 추가&lt;/b&gt;하여 안정적인 동작을 보장해야 합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SoC 설계/Verilog, SystemVerilog</category>
      <category>clock gating</category>
      <category>clock gating cell</category>
      <category>glitch free</category>
      <category>metastability</category>
      <category>timing violation</category>
      <category>verilog</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/147</guid>
      <comments>https://yztech.tistory.com/147#entry147comment</comments>
      <pubDate>Sat, 1 Feb 2025 08:37:31 +0900</pubDate>
    </item>
    <item>
      <title>Combinational Logic in Clock path</title>
      <link>https://yztech.tistory.com/146</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Issues with Combinational Logic in Clock Paths&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Using combinational logic in clock signals (also known as &quot;gated clocks&quot;) can lead to various issues in digital design. Below are the key problems and best practices.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  Issues with Combinational Logic in Clocks&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Clock Skew &amp;amp; Timing Violations&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Combinational logic delays the propagation of the clock signal.&lt;/li&gt;
&lt;li&gt;Different parts of the circuit might receive the clock at different times, leading to &lt;b&gt;hold and setup timing violations&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Glitches &amp;amp; Metastability&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;If the combinational logic changes asynchronously, it can cause &lt;b&gt;glitches&lt;/b&gt; in the clock.&lt;/li&gt;
&lt;li&gt;A glitchy clock can lead to metastability, making the design unpredictable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Clock Gating Issues&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Using combinational logic for clock gating (instead of a proper clock-gating cell) can cause:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Unintended &lt;b&gt;clock pulses&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Unbalanced clock tree&lt;/b&gt;, leading to power and timing issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Increased Power Consumption&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Combinational logic in the clock path prevents the synthesis tool from optimizing the clock tree properly.&lt;/li&gt;
&lt;li&gt;This results in unnecessary power consumption due to unintended switching.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Best Practices&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Use Clock Enable Instead of Gated Clocks&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Instead of modifying the clock, use &lt;b&gt;clock enable signals&lt;/b&gt; inside the flip-flop.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;always @(posedge clk) begin
    if (enable)
        data_out &amp;lt;= data_in;
end&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Use Synchronous Clock Gating&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;If clock gating is needed, use &lt;b&gt;clock gating cells&lt;/b&gt; provided in standard cell libraries.&lt;/li&gt;
&lt;li&gt;Example of a recommended clock gating approach:
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;module gated_clock (
    input  logic clk,
    input  logic enable,
    output logic gated_clk
);
    assign gated_clk = clk &amp;amp; enable;  // Not recommended for synthesis
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;This should be replaced with a proper &lt;b&gt;clock gating cell&lt;/b&gt; in real ASIC/FPGA designs.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Keep Clocks in a Dedicated Clock Tree&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Always route clocks through a &lt;b&gt;dedicated clock distribution network&lt;/b&gt; rather than logic.&lt;/li&gt;
&lt;li&gt;Use synthesis constraints to prevent logic in the clock path.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Summary&lt;/b&gt;&lt;/h2&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;b&gt;Issue&lt;/b&gt;&lt;/th&gt;
&lt;th&gt;&lt;b&gt;Impact&lt;/b&gt;&lt;/th&gt;
&lt;th&gt;&lt;b&gt;Solution&lt;/b&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Clock Skew&lt;/td&gt;
&lt;td&gt;Setup/Hold violations&lt;/td&gt;
&lt;td&gt;Use dedicated clock routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Glitches&lt;/td&gt;
&lt;td&gt;Unstable clock pulses&lt;/td&gt;
&lt;td&gt;Avoid combinational logic in the clock path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clock Gating Issues&lt;/td&gt;
&lt;td&gt;Extra power consumption, timing issues&lt;/td&gt;
&lt;td&gt;Use clock enable signals or proper clock gating&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increased Power Consumption&lt;/td&gt;
&lt;td&gt;More switching activity&lt;/td&gt;
&lt;td&gt;Optimize with proper clock gating techniques&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Using combinational logic in clock paths is generally &lt;b&gt;not recommended&lt;/b&gt; due to these risks. Instead, use &lt;b&gt;clock enables, synchronous logic, and dedicated clock gating cells&lt;/b&gt; for a robust and reliable design.&lt;/p&gt;</description>
      <category>SoC 설계/Verilog, SystemVerilog</category>
      <category>clock gating</category>
      <category>clock network</category>
      <category>clock skew</category>
      <category>Clock Tree</category>
      <category>Glitch</category>
      <category>glitch free clock gating</category>
      <category>metastability</category>
      <category>timing violation</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/146</guid>
      <comments>https://yztech.tistory.com/146#entry146comment</comments>
      <pubDate>Sat, 1 Feb 2025 08:30:42 +0900</pubDate>
    </item>
    <item>
      <title>특정 커밋 되돌리기</title>
      <link>https://yztech.tistory.com/145</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Git에서 특정 커밋만 되돌리는 방법은 &lt;code&gt;git revert&lt;/code&gt; 명령어를 사용하면 됩니다. 이 방법은 되돌리고 싶은 커밋의 변경 사항을 무효화하는 새로운 커밋을 생성하므로, 기존의 Git 기록은 유지되고, 협업 중인 동료들에게도 변경 사항이 명확히 전달됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법 1: 특정 커밋 되돌리기 (Revert)&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;커밋 로그 확인&lt;/b&gt;예:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a1b2c3d Fix bug in login logic
f4e5d6c Add new feature
789abcd Update README&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;git log --oneline&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;되돌리고 싶은 커밋의 해시 값 확인&lt;/b&gt;&lt;br /&gt;위 로그에서 되돌리고 싶은 커밋의 해시 값을 복사합니다. 예: &lt;code&gt;f4e5d6c&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;git revert&lt;/code&gt; 명령 실행&lt;/b&gt;예:이 명령은 해당 커밋의 변경 사항을 되돌리는 새로운 커밋을 생성합니다.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;git revert f4e5d6c&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;git revert &amp;lt;커밋 해시&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;수정 사항 확인 후 커밋 완료&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Git이 자동으로 커밋 메시지를 생성합니다.&lt;/li&gt;
&lt;li&gt;편집기를 통해 커밋 메시지를 수정하거나, 그대로 저장 후 종료하면 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법 2: 여러 커밋 되돌리기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 커밋을 한 번에 되돌리고 싶다면, 여러 해시를 &lt;code&gt;git revert&lt;/code&gt;에 순차적으로 적용할 수 있습니다.&lt;br /&gt;예:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;git revert &amp;lt;커밋 해시1&amp;gt; &amp;lt;커밋 해시2&amp;gt; ...&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;방법 3: 특정 파일의 변경만 되돌리기&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;특정 커밋에서 특정 파일의 변경만 되돌리려면:예:&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout f4e5d6c -- src/main.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;git checkout &amp;lt;커밋 해시&amp;gt; -- &amp;lt;파일 경로&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;되돌린 파일을 스테이징하고 커밋합니다.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;git add src/main.js
git commit -m &quot;Revert changes from f4e5d6c for src/main.js&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주의사항&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;git revert&lt;/code&gt;는 되돌린 내용을 새로운 커밋으로 추가하기 때문에, 협업 환경에서 변경 사항이 명확히 보이는 장점이 있습니다.&lt;/li&gt;
&lt;li&gt;원격 저장소에 이미 푸시된 커밋을 되돌릴 때는 &lt;code&gt;git reset&lt;/code&gt; 대신 &lt;code&gt;git revert&lt;/code&gt;를 사용하는 것이 안전합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>작업 tools/git</category>
      <category>commit</category>
      <category>Git</category>
      <category>revert</category>
      <category>되돌리기</category>
      <category>특정</category>
      <category>특정 commit 되돌리기</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/145</guid>
      <comments>https://yztech.tistory.com/145#entry145comment</comments>
      <pubDate>Thu, 16 Jan 2025 03:22:00 +0900</pubDate>
    </item>
    <item>
      <title>Verilog/Systemverilog에서 real 과 integer 간 형변환</title>
      <link>https://yztech.tistory.com/144</link>
      <description>&lt;h1&gt;Verilog에서 real과 integer 형 변환&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Verilog는 SystemVerilog와 달리 형 변환 연산자가 없기 때문에, Verilog에서 &lt;code&gt;real&lt;/code&gt; 타입과 &lt;code&gt;integer&lt;/code&gt; 타입 간 변환은 명시적 할당을 통해 수행됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;&lt;code&gt;real&lt;/code&gt; to &lt;code&gt;integer&lt;/code&gt; 변환&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;real&lt;/code&gt; 값을 &lt;code&gt;integer&lt;/code&gt;로 변환할 때 소수점 이하 값이 잘립니다(버림).&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;module real_to_integer;
    real real_value;
    integer int_value;

    initial begin
        real_value = 1.23;
        int_value = real_value; // 암시적 변환
        $display(&quot;Real to Integer: %f -&amp;gt; %d&quot;, real_value, int_value);
    end
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 사항:&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;real&lt;/code&gt; 타입을 &lt;code&gt;integer&lt;/code&gt;에 할당하면 암시적으로 변환됩니다.&lt;/li&gt;
&lt;li&gt;소수점 이하는 자동으로 잘립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;&lt;code&gt;integer&lt;/code&gt; to &lt;code&gt;real&lt;/code&gt; 변환&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;integer&lt;/code&gt; 값을 &lt;code&gt;real&lt;/code&gt;로 변환할 때는 암시적 할당을 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;module integer_to_real;
    integer int_value;
    real real_value;

    initial begin
        int_value = 42;
        real_value = int_value; // 암시적 변환
        $display(&quot;Integer to Real: %d -&amp;gt; %f&quot;, int_value, real_value);
    end
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 사항:&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;integer&lt;/code&gt;를 &lt;code&gt;real&lt;/code&gt;에 할당하면 암시적으로 변환됩니다.&lt;/li&gt;
&lt;li&gt;정수 값이 실수 값으로 변환되며 소수점 아래는 &lt;code&gt;0.0&lt;/code&gt;으로 채워집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;&lt;code&gt;real&lt;/code&gt;과 &lt;code&gt;integer&lt;/code&gt; 변환 예제&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 두 변환을 포함하는 예제입니다.&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;module test_real_integer_conversion;
    real real_value;
    integer int_value;

    initial begin
        // Real to Integer
        real_value = 1.23;
        int_value = real_value;
        $display(&quot;Real to Integer: %f -&amp;gt; %d&quot;, real_value, int_value);

        // Integer to Real
        int_value = 123;
        real_value = int_value;
        $display(&quot;Integer to Real: %d -&amp;gt; %f&quot;, int_value, real_value);

        $finish;
    end
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주의사항&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;정확도 손실&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;real&lt;/code&gt;에서 &lt;code&gt;integer&lt;/code&gt;로 변환할 때 소수점 이하 데이터가 손실됩니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;real&lt;/code&gt;은 부동소수점 형식이므로, 큰 정수 값의 변환 시 정확도가 떨어질 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;암시적 변환&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Verilog는 명시적 형 변환 연산자가 없으므로 암시적 할당을 통해 변환합니다.&lt;/li&gt;
&lt;li&gt;이로 인해 변환 과정이 코드에 명확히 드러나지 않을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Verilog &lt;code&gt;real&lt;/code&gt; 사용 제한&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Verilog에서는 &lt;code&gt;real&lt;/code&gt; 타입을 레지스터처럼 사용하거나 합성 도구로 구현할 수 없으므로, 변환은 주로 시뮬레이션에서만 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Systemverilog에서 real 과 integer 형 변환&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SystemVerilog에서 &lt;code&gt;real&lt;/code&gt; 타입과 &lt;code&gt;integer&lt;/code&gt; 타입 간 변환은 다음과 같은 방식으로 &lt;b&gt;명시적&lt;/b&gt;으로 수행할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;&lt;code&gt;real&lt;/code&gt; to &lt;code&gt;integer&lt;/code&gt; 변환&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;real&lt;/code&gt; 값을 &lt;code&gt;integer&lt;/code&gt;로 변환할 때 소수점 이하 값은 버려집니다(즉, 내림이 아닌 잘림(truncation)이 발생).&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;real real_value = 3.14;
integer int_value;

// 변환
int_value = int'(real_value);
$display(&quot;Real to Integer: %f -&amp;gt; %d&quot;, real_value, int_value);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 사항:&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;int'()&lt;/code&gt;를 사용하여 명시적으로 형 변환합니다.&lt;/li&gt;
&lt;li&gt;잘림(truncation) 방식을 사용하여 정수로 변환합니다. (3.14 -&amp;gt; 3)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;&lt;code&gt;integer&lt;/code&gt; to &lt;code&gt;real&lt;/code&gt; 변환&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;integer&lt;/code&gt; 값을 &lt;code&gt;real&lt;/code&gt;로 변환할 때 정수 값은 실수로 변환됩니다.&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;integer int_value = 5;
real real_value;

// 변환
real_value = real'(int_value);
$display(&quot;Integer to Real: %d -&amp;gt; %f&quot;, int_value, real_value);&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 사항:&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;real'()&lt;/code&gt;를 사용하여 명시적으로 형 변환합니다.&lt;/li&gt;
&lt;li&gt;정수 값이 실수로 변환되며, 소수점 아래는 0으로 표시됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예제: &lt;code&gt;real&lt;/code&gt;과 &lt;code&gt;integer&lt;/code&gt; 변환&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 위의 변환을 포함한 간단한 테스트 예제입니다.&lt;/p&gt;
&lt;pre class=&quot;verilog&quot;&gt;&lt;code&gt;module test_real_integer_conversion;
    real real_value;
    integer int_value;

    initial begin
        // Real to Integer
        real_value = 1.23;
        int_value = int'(real_value);
        $display(&quot;Real to Integer: %f -&amp;gt; %d&quot;, real_value, int_value);

        // Integer to Real
        int_value = 123;
        real_value = real'(int_value);
        $display(&quot;Integer to Real: %d -&amp;gt; %f&quot;, int_value, real_value);

        // End of simulation
        $finish;
    end
endmodule&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주의사항&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;정확도 손실
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;real&lt;/code&gt;은 IEEE 754 부동소수점 형식을 사용하므로 큰 값을 정수로 변환하거나, 반대로 변환할 때 정확도가 손실될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;:&lt;/li&gt;
&lt;li&gt;명시적 형 변환 권장
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;암시적 변환보다는 명시적 변환(&lt;code&gt;int'()&lt;/code&gt; 또는 &lt;code&gt;real'()&lt;/code&gt;)을 사용하여 코드의 명확성을 유지하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;:&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>SoC 설계/Verilog, SystemVerilog</category>
      <category>ieee754</category>
      <category>integer</category>
      <category>Real</category>
      <category>SystemVerilog</category>
      <category>verilog</category>
      <category>명시적 변환</category>
      <category>부동소수점</category>
      <category>소수점</category>
      <category>암시적 변환</category>
      <category>형변환</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/144</guid>
      <comments>https://yztech.tistory.com/144#entry144comment</comments>
      <pubDate>Fri, 10 Jan 2025 16:40:29 +0900</pubDate>
    </item>
    <item>
      <title>git 특정 파일 커밋 로그 출력 방법</title>
      <link>https://yztech.tistory.com/143</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Git에서 특정 파일의 커밋 로그를 출력하려면 다음 명령을 사용합니다:&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;git log -- &amp;lt;파일경로&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 기본 파일 로그 출력&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;git log -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령은 &lt;code&gt;test.txt&lt;/code&gt; 파일의 변경 이력을 보여줍니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 로그 출력 옵션&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git 로그 출력에는 다양한 옵션을 추가하여 결과를 더 세부적으로 확인할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;커밋 이력 간략히 보기&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;git log --oneline -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 커밋을 한 줄로 간단히 출력.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;변경 내용 함께 보기&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;git log -p -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일의 각 커밋에서의 변경 내용을 함께 출력.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특정 기간 동안의 로그&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;git log --since=&quot;2024-01-01&quot; --until=&quot;2024-12-31&quot; -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 기간 동안 파일 변경 이력을 출력.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;파일 이름 변경 추적&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;git log --follow -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 이름이 변경된 경우에도 변경 이력을 추적.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;포맷 지정&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;code&gt;git log --pretty=format:&quot;%h - %an, %ar : %s&quot; -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그를 사용자 지정 형식으로 출력:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;%h&lt;/code&gt;: 커밋 해시&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%an&lt;/code&gt;: 작성자 이름&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%ar&lt;/code&gt;: 작성 날짜(상대적)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;%s&lt;/code&gt;: 커밋 메시지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 특정 커밋에서 파일 상태 확인&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;파일 변경 내용 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;git show &amp;lt;커밋해시&amp;gt; -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 커밋에서 파일의 변경 내용을 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특정 커밋의 파일 내용 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;git checkout &amp;lt;커밋해시&amp;gt; -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 커밋 시점의 파일 내용을 워킹 디렉토리로 가져옴.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 파일이 특정 커밋에 포함되었는지 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;git log --diff-filter=A -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일이 처음 추가된 커밋을 확인(&lt;code&gt;A&lt;/code&gt;는 파일 추가를 의미).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;실제 예시&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;brainfuck&quot;&gt;&lt;code&gt;git log --oneline --follow -- test.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령은 파일의 이름이 바뀐 경우를 포함하여 변경 이력을 한 줄 요약으로 출력합니다.&lt;/p&gt;</description>
      <category>작업 tools/git</category>
      <category>follow</category>
      <category>Git</category>
      <category>git log</category>
      <category>로그</category>
      <category>변경 사항</category>
      <category>변경사항 출력</category>
      <category>파일</category>
      <category>파일 변경 사항</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/143</guid>
      <comments>https://yztech.tistory.com/143#entry143comment</comments>
      <pubDate>Thu, 9 Jan 2025 08:12:34 +0900</pubDate>
    </item>
    <item>
      <title>git commit 병합하기</title>
      <link>https://yztech.tistory.com/142</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;git&lt;/code&gt;에서 여러 개의 커밋을 합치는 방법은 &lt;b&gt;squash&lt;/b&gt; 또는 &lt;b&gt;rebase&lt;/b&gt;를 사용하는 것입니다. 아래는 구체적인 단계별 방법입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;방법 1: Merge Commit&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합치고자 하는 커밋들이 다른 브랜치에 있을 때는, 병합 커밋 (Merge Commit)을 사용할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;git merge --squash &amp;lt;branch_name&amp;gt;
git commit -m &quot;Combined commit from branch&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;방법 2: Git Interactive Rebase (&lt;code&gt;git rebase -i&lt;/code&gt;)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합치고자 하는 커밋이 현재 브랜치에 있을때는 &lt;b&gt;rebase&lt;/b&gt; 와 &lt;b&gt;squash&lt;/b&gt; 을 사용할 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;기준 커밋 선택&lt;/b&gt;&lt;br /&gt;변경하려는 커밋 범위에서 &lt;b&gt;기준 커밋&lt;/b&gt;을 선택합니다. 예를 들어, 마지막 3개의 커밋을 합치려면:&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;git rebase -i HEAD~3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Interactive Rebase 편집&lt;/b&gt;&lt;br /&gt;실행하면 다음과 같은 편집 화면이 나타납니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 커밋(&lt;code&gt;pick 123abc&lt;/code&gt;)은 그대로 두고, 나머지 커밋을 &lt;b&gt;squash&lt;/b&gt;로 변경합니다:
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;pick 123abc First commit
squash 456def Second commit
squash 789ghi Third commit&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-plaintext&quot;&gt;pick 123abc First commit
pick 456def Second commit
pick 789ghi Third commit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;커밋 메시지 수정&lt;/b&gt;&lt;br /&gt;squash가 설정된 커밋들의 메시지를 합치거나 수정하는 화면이 나타납니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원하는 메시지로 변경 후 저장하고 종료.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-plaintext&quot;&gt;# This is a combination of 3 commits.
# The first commit's message is:
First commit

# The following commit messages will also be included:
Second commit
Third commit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Rebase 완료&lt;/b&gt;&lt;br /&gt;Git이 커밋을 합친 후 적용합니다. 충돌이 발생하면 수정 후 아래 명령을 실행하세요:&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;git rebase --continue&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;주의사항&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;충돌이 발생하면 적절히 해결하고 &lt;code&gt;git rebase --continue&lt;/code&gt;를 실행하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;</description>
      <category>작업 tools/git</category>
      <category>commit</category>
      <category>Git</category>
      <category>Pick</category>
      <category>rebase</category>
      <category>squash</category>
      <category>병합</category>
      <category>합치기</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/142</guid>
      <comments>https://yztech.tistory.com/142#entry142comment</comments>
      <pubDate>Wed, 8 Jan 2025 03:04:29 +0900</pubDate>
    </item>
    <item>
      <title>매직라인과 쉐뱅</title>
      <link>https://yztech.tistory.com/141</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;#!/usr/bin/env python3&lt;/code&gt; 과 같이 &lt;code&gt;#!&lt;/code&gt;로 시작하는 magic line 혹은 shebang은 스크립트 파일의 첫 번째 줄에 표시하여, 스크립트를 실행할 때 어떤 인터프리터를 사용할지 명시하는 역할을 합니다. 매직 라인을 사용하면 코드의 이식성을 크게 높일 수 있는 장점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;#!/usr/bin/env python3&lt;/code&gt; 를 예로 들어서 자세히 설명하겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 매직 라인 (Magic Line) or 쉐뱅(Shebang)의 역할&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉐뱅은 스크립트 파일의 첫 번째 줄에 나타나며, 파일을 실행할 때 사용할 &lt;b&gt;인터프리터&lt;/b&gt;를 지정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형식:&lt;/p&gt;
&lt;pre class=&quot;d&quot;&gt;&lt;code&gt;#!/경로/인터프리터&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;#&lt;/code&gt;와 &lt;code&gt;!&lt;/code&gt;로 시작하며, 이를 쉐뱅(shebang) 또는 매직 라인 (magic line)이라고 부릅니다.&lt;/li&gt;
&lt;li&gt;쉐뱅 라인이 없으면 파일을 실행할 때 사용자가 명시적으로 인터프리터를 지정해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. &lt;code&gt;/usr/bin/env&lt;/code&gt;의 역할&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;/usr/bin/env&lt;/code&gt;는 환경 변수에 설정된 경로를 기반으로 적절한 실행 파일을 찾아줍니다.&lt;/p&gt;
&lt;pre class=&quot;d&quot;&gt;&lt;code&gt;#!/usr/bin/env python3&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;유연한 인터프리터 탐색&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스크립트가 실행되는 환경마다 Python 3의 경로가 다를 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;env&lt;/code&gt;는 환경 변수 &lt;code&gt;$PATH&lt;/code&gt;를 기준으로 &lt;code&gt;python3&lt;/code&gt;의 경로를 찾아 실행합니다.&lt;/li&gt;
&lt;li&gt;예를 들어, &lt;code&gt;python3&lt;/code&gt;이 &lt;code&gt;/usr/local/bin/python3&lt;/code&gt;에 설치된 경우에도 동작합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이식성&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다양한 환경(예: Linux, macOS, BSD 등)에서 스크립트를 동일하게 실행할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 직접 지정하는 대체 방식과 환경 변수 설정의 차이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉐뱅에서 직접 Python 경로를 지정할 수도 있습니다:&lt;/p&gt;
&lt;pre class=&quot;d&quot;&gt;&lt;code&gt;#!/usr/bin/python3&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;비교&lt;/b&gt;&lt;/h4&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;방식&lt;/th&gt;
&lt;th&gt;장점&lt;/th&gt;
&lt;th&gt;단점&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;#!/usr/bin/env python3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;유연성: 다양한 환경에서 Python 경로를 자동 탐색.&lt;/td&gt;
&lt;td&gt;환경 변수에 따라 의도치 않은 Python 버전 실행 가능.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;#!/usr/bin/python3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;특정 Python 버전을 명확히 지정 가능.&lt;/td&gt;
&lt;td&gt;환경마다 Python 경로가 다를 수 있어 비이식적.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. 사용 예시&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;스크립트 작성&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-python&quot;&gt;#!/usr/bin/env python3

print(&quot;Hello, World!&quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실행 권한 부여&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;chmod +x script.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스크립트 실행&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-bash&quot;&gt;./script.py&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 요약&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;code&gt;#!/usr/bin/env python3&lt;/code&gt;는 Python 3 인터프리터를 환경 변수 &lt;code&gt;$PATH&lt;/code&gt;에서 찾아 실행합니다.&lt;/li&gt;
&lt;li&gt;유연성과 이식성을 제공하여 다양한 운영 체제 및 환경에서 스크립트를 쉽게 실행할 수 있습니다.&lt;/li&gt;
&lt;li&gt;직접 경로 지정(&lt;code&gt;#!/usr/bin/python3&lt;/code&gt;)보다 일반적으로 더 권장됩니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>리눅스</category>
      <category>#!</category>
      <category>/usr/bin/env</category>
      <category>bash</category>
      <category>magic line</category>
      <category>python3</category>
      <category>shebang</category>
      <category>리눅스</category>
      <category>매직라인</category>
      <category>쉐뱅</category>
      <category>스크립트</category>
      <author>yztech</author>
      <guid isPermaLink="true">https://yztech.tistory.com/141</guid>
      <comments>https://yztech.tistory.com/141#entry141comment</comments>
      <pubDate>Sat, 21 Dec 2024 03:54:16 +0900</pubDate>
    </item>
  </channel>
</rss>