안녕하세요. 설계독학의 맛비입니다.
현) Global Top5 Fabless기업에서 HW IP 설계하고 있습니다.
세상에 없던 그리고 여러분들의 현업 생활에 도움이 되는, "진짜 반도체 설계 실무 강의"를 만들고 있습니다.
설계독학과 함께할 수 있는 링크입니다. 함께 즐공하고 성장해요!
講義
受講レビュー
- 設計独学맛비's 実戦 Verilog HDL Season 1 (クロックから内部メモリまで)
- 設計独学のVerilogマスター Season 1 (実戦コーディングTest問題で完成するデジタル設計エンジニアのキャリア飛躍)
- 設計独学味比の実戦FPGAを用いたHWアクセラレータ設計(LED制御からFully Connected Layerアクセラレータ設計まで)
投稿
Q&A
BRAM의 Read / Write를 다 수행했는지 확인할 때 사용되는 num_cnt / i_num_cnt 관련 질문
안녕하세요!!추석연휴라서 답변이 조금 밀렸네요 ㅠ질문 요지는 “왜 i_num_cnt를 바로 쓰지 않고 레지스터 num_cnt에 캡처하느냐”로 이해했습니다. 결론부터 말하면, 비교 기준을 트랜잭션 단위로 고정하고 타이밍을 안정화하려는 의도입니다. 항목별로 답드리겠습니다.맞습니다. num_cnt를 레지스터로 두면 플립플롭 자원이 들고, i_run에 캡처되는 시점만큼 한 사이클의 지연이 생깁니다. 다만 이 비용은 보통 폭만큼의 FF(예: AWIDTH비트)라서 매우 작고, 시스템 타이밍 측면에선 이득이 더 큽니다.장점은 세 가지가 핵심입니다.원자성 보장: i_num_cnt가 트랜잭션 도중 바뀌어도, 캡처된 num_cnt는 끝날 때까지 값이 고정됩니다. done 비교 기준이 흔들리지 않습니다.타이밍/글리치 차단: 상위 로직의 조합 경로가 길거나 글리치가 있어도 FF에서 한번 끊어 주므로 비교 경로가 짧고 깨끗해집니다(타이밍 클로저 유리).리셋·상태 경계 명확화: 코드처럼 o_done에서 0으로 클리어하면 트랜잭션 경계가 분명해집니다. 차기 트랜잭션 시작 전에 기준값이 남아있어 생기는 스파이크를 예방합니다.addr_cnt_read == i_num_cnt-1로 바로 비교해도 합성은 됩니다. 다만 권하지 않습니다. 이유는트랜잭션 중 i_num_cnt가 변하면 완료 펄스가 앞당겨지거나 사라질 수 있습니다.상위에서 오는 조합경로가 길어지면 크리티컬 패스가 그쪽으로 누수됩니다.i_num_cnt==0일 때 i_num_cnt-1은 언더플로로 전비트 1이 되어 오동작 위험이 큽니다(레지스터도 마찬가지라서 보통 i_num_cnt>0 전제·assert나 가드 로직을 둡니다).정리하면, num_cnt를 레지스터로 캡처하는 건 “리소스 소모 대비 안정성/재현성/타이밍 이득”이 확실합니다. 실무에선 입력을 그대로 쓰기보다 트랜잭션 시작에 캡처해서 쓰는 패턴을 기본으로 가져가시면 안전합니다. 필요하면 i_run과 o_done 사이의 경계에서만 업데이트되도록 한 사이클 더 파이프라이닝하는 것도 좋습니다.즐공하세요!
- 1
- 1
- 18
Q&A
Vitis 코드 작성
안녕하세요 :)Vitis에서 header file은 말씀하신 것처럼 툴이 자동으로 만들어주는데, 그 안에 있는 함수들은 결국 Xilinx에서 제공하는 드라이버 API들이라서, 제가 직접 따로 구현한 건 아닙니다. 제가 한 일은 그 함수들의 역할을 이해하고, 제 main.c 코드 안에서 적절히 불러다 쓰는 것이죠.그럼 그 함수들의 기능은 어디서 배우느냐 하면, 기본적으로는 Xilinx 공식 문서를 참고했습니다. 예를 들어 각 IP별로 xparameters.h, xil_io.h, 그리고 x.h 같은 헤더가 생성되는데, 거기에 대응되는 드라이버 설명이 Vitis Document나 Xilinx Wiki에 잘 정리되어 있습니다. https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841745/Baremetal+Drivers+and+Libraries 처음엔 데이터시트와 드라이버 예제 코드를 그대로 따라 해보고, 함수 이름과 동작을 연결하면서 자연스럽게 익히게 됐습니다.즉, 의 cin, cout을 배우듯이, Xilinx에서 제공하는 예제 코드와 API 문서를 보면서 함수의 역할을 익혔다고 보시면 됩니다. 직접 다 외우기보다는 필요한 기능이 있을 때 예제를 찾아보고, 반복해서 사용하면서 몸에 익히는 식으로 공부했습니다.즐공하세요!
- 1
- 2
- 16
Q&A
Ubuntu 에서 옆에 라인 수 보는 방법
안녕하세요 🙂vim editor의 라인 넘버는 vim 내부 키워드로 확인할 수 있습니다.vim editor 사용방법은 별도로 책이 나올 정도로 방대하긴 한데요. 저도 자주 쓰는것만 알아요. 하핫 일반적으로 :set number 명령어를 입력하면 왼쪽에 줄 번호가 표시되고, :set nonumber로 다시 끌 수 있습니다. 만약 상대적인 라인 번호가 필요하다면 :set relativenumber를 쓰면 현재 커서를 기준으로 위아래 줄의 상대적 위치가 표시됩니다. 이 두 옵션은 같이 쓸 수도 있어서, 절대 번호와 상대 번호를 동시에 확인하는 것도 가능합니다. 자주 쓰신다면 .vimrc에 set number를 추가해두면 vim을 열 때마다 기본으로 라인 넘버가 켜지게 됩니다. 즐공하세요!
- 1
- 1
- 39
Q&A
o_done만 reg type으로 선언한 이유
안녕하세요 🙂코딩 스타일의 차이 이고요.여러가지 코딩 스타일을 보여드리려고 했어요. 유사 질문이 있어서 남겨드려요.즐공하세요!(사진)
- 1
- 2
- 35
Q&A
vivado 및 vitis 리눅스 환경 설치 관련 질문드립니다.
안녕하세요 🙂FPGA 를 리눅스에서 사용하시지 않으실꺼라면, vivado 만 있으셔도 됩니다. 그리고 리눅스 용으로 설치하시면 됩니다. 리눅스 상에서는 Vivado sim 을 위주로 사용해요. 다만 Xilinx 에서 설치 파일을 Vitis 를 super set 으로 제공하고 있어서 vitis 를 설치했습니다. (나중에 확장성이 있을 수 있고요) 리눅스 환경에 적응하시는 것을 적극 추천드릴께요. 추가질문의 답은FPGA 강의를 제작할 당시에 WSL 에서 진행하면 좋았으나, 설치시 드라이버 이슈로 인하여 Windows 를 선택하였습니다. 이런 상황에서 WSL 에서 드라이버 이슈를 해결하고 FPGA 강의를 진행하신 분도 계시는데요. 필요하시면 다음링크 확인해보시면 좋을 것 같아요. https://inf.run/zC27f 즐공하세요 🙂
- 1
- 3
- 78
Q&A
21강의 DUT 질문 있습니다.
안녕하세요 🙂그림에서 보시면, (사진)캡쳐해주신 코드는 Combinational Logic 파트입니다. (파란색 부분)코드에서 1 cycle 변경 부분은, 다음 그림에서 빨간색 부분이 되겠습니다.빨간색 박스 내의 코드를 보시면, clk edge 에 맞추서, c_state 이것이 1 cycle delay 를 만들어 냅니다.따라서 "S_DONE일 경우 n_state를 S_IDLE 로 바꾸는데요" 이 반영된 내용은 1 cycle 뒤에 c_state 로 반영됩니다. 따라서 질문주신"wave form에서는 바로 바뀌지 않고, 1cycle 정도 후에 바뀌나요?"이것은 코드에서 의도한 동작입니다.즐공하세요 🙂
- 1
- 1
- 30
Q&A
파일 제거 방법
안녕하세요 🙂AI 가 답변을 잘 달아준 것 같아요. Tool 이 설치되어 있는 폴더를rm -rf 으로 지우시면 되겠습니다.즐공하세요!
- 1
- 2
- 53
Q&A
[AI HW Lab2] CNN Verilog HDL Practice 1 (Simulation) - 문제설명편 ppt
안녕하세요.강의자료에 있는 주어진 변수값을 먼저 확인해보겠습니다.ACI_BW 는 22 bit 이고, bias 는 8bit 입니다. AB_BW = ACI_BW + bias 입니다. 질문은 왜 AB_BW 가 23 bit 이냐였고, 최대값 만을 놓고 23 bit 이면 충분한지 계산해 보겠습니다. "2 의 23 승" 은 "2의 22승 더하기 2의 8승" 값 보다 큽니다.즉, 22 bit + 8 bit 에서 overflow 를 방지하는 bit width 는 23 bit 이면 충분합니다.따라서 AB_BW 를 23 bit 정하였고, overflow 는 발생하지 않을 것으로 예상됩니다.즐공하세요.
- 1
- 2
- 43
Q&A
[AI HW Lab1] CNN Core C 코딩 (Golden Model 만들기)
안녕하세요.차근차근 순서대로 살펴보겠습니다.위 그림, 아래 그림, 이렇게 불러보겠습니다.위 그림의 KX, KY 는 kernel 2-D 의 size 이고, 아래 그림의 S 와 R 에 해당됩니다.위 그림의 CI, CO 는 아래그림의 C 와 M 에 맵핑됩니다.위 그림, 아래그림의 차이라고 한다면,위 그림은 순서가, Input feature map * Weight 순이었다면,아래 그림은 순서가, Weight * Input feature map 순 입니다.제가 생각하기로는 위, 아래 그림의 Input feature map 과 Weight 의 곱하기 순서만 바뀌었을 뿐, 두개의 그림은 같은 연산을 설명하는 것으로 이해됩니다.(사진)
- 1
- 2
- 36
Q&A
14장 실습코드에서 valid 신호에 대해
안녕하세요 🙂의외로, AI 가 답변을 제대로 적어준 것 같은데요.휴먼의 입장에서 적어보겠습니다. 해당 코드는 1bit 의 F/F 3 개가 cascade 로 연결되어 있는 구조로 회로가 완성이 되는 코드입니다. 즉 3 bit shift register 로 합성이 됩니다.그림으로 그려보면 이런 느낌? (사진) (사진) Verilog 문법을 알고계시다면 이 말이 어떤 뜻인줄 아실 것 같으신데요.reg [2:0] r_valid;r_valid r_valid [2:0] 이것은 input i_valid 를 매 사이클 마다 1 bit 씩 shift 하는 내용을 기술한 것입니다.즐공하세요!
- 1
- 2
- 38