inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Thiết kế bộ tăng tốc HW sử dụng FPGA thực tế của Seolgye Dokhak Matbi (Từ điều khiển LED đến thiết kế bộ tăng tốc Fully Connected Layer)

[FPGA chương 15] Thiết kế module BRAM Data Mover bằng FSM - Đánh giá mã nguồn

BRAM의 Read / Write를 다 수행했는지 확인할 때 사용되는 num_cnt / i_num_cnt 관련 질문

106

bhk123

5 câu hỏi đã được viết

1

안녕하십니까 Matbi님

너무 잘 학습하고 있습니다.

 

[의문사항]

image.png

[1번]

Matbi님이 작성하신 코드처럼

 

num_cnt를 reg로 선언하고

always block으로 num_cnt <= i_num_cnt를 하게 되면

 

clk소모에 따른 delay도 발생하고

HW resource도 사용한다는 단점이 있는거라고 생각하는데 맞을까요?

 

[2번]

1번이 맞다면

단점 외에 장점이 있기 때문에 저렇게 작성하신걸까요?

어떤 장점이 있는걸까요?

 

[3번]

아래처럼 기술해도 되는걸까요?

// 기존 코드
assign is_read_done  = o_read  && (addr_cnt_read == num_cnt-1);

// reg와 always 구문 없이
// input wire로 입력되는 i_num_cnt를 그대로 사용하는 경우
assign is_read_done  = o_read  && (addr_cnt_read == i_num_cnt-1);

 

항상 감사합니다!!!

 

fpga 임베디드

Câu trả lời 1

0

semisgdh

안녕하세요!!

추석연휴라서 답변이 조금 밀렸네요 ㅠ

질문 요지는 “왜 i_num_cnt를 바로 쓰지 않고 레지스터 num_cnt에 캡처하느냐”로 이해했습니다. 결론부터 말하면, 비교 기준을 트랜잭션 단위로 고정하고 타이밍을 안정화하려는 의도입니다. 항목별로 답드리겠습니다.

  1. 맞습니다. num_cnt를 레지스터로 두면 플립플롭 자원이 들고, i_run에 캡처되는 시점만큼 한 사이클의 지연이 생깁니다. 다만 이 비용은 보통 폭만큼의 FF(예: AWIDTH비트)라서 매우 작고, 시스템 타이밍 측면에선 이득이 더 큽니다.

  2. 장점은 세 가지가 핵심입니다.

  • 원자성 보장: i_num_cnt가 트랜잭션 도중 바뀌어도, 캡처된 num_cnt는 끝날 때까지 값이 고정됩니다. done 비교 기준이 흔들리지 않습니다.

  • 타이밍/글리치 차단: 상위 로직의 조합 경로가 길거나 글리치가 있어도 FF에서 한번 끊어 주므로 비교 경로가 짧고 깨끗해집니다(타이밍 클로저 유리).

  • 리셋·상태 경계 명확화: 코드처럼 o_done에서 0으로 클리어하면 트랜잭션 경계가 분명해집니다. 차기 트랜잭션 시작 전에 기준값이 남아있어 생기는 스파이크를 예방합니다.

  1. 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_runo_done 사이의 경계에서만 업데이트되도록 한 사이클 더 파이프라이닝하는 것도 좋습니다.

즐공하세요!

UART0, 1 중 선택

1

51

2

datamoverbram모듈질문

1

63

2

vitis 설치엣 alveo kria versal 등 옵션을 끄고 설치를 했습니다.

1

96

2

vitis 설치 관련 질문 있습니다!

1

85

2

FPGA 공식문서 읽는법

1

95

2

보드 추가의 클릭창이 없습니다.

1

71

2

Edit in IP Packager에서 코드 수정 후 IP 수정하면 simulation에서 수정된 코드로 작동이 안됩니다

1

81

2

Vitis 코드 작성

1

130

2

vivado 및 vitis 리눅스 환경 설치 관련 질문드립니다.

1

292

3

[9장 led 점등 시간 제어 불가]

1

81

2

Platform Invalid 오류

1

150

3

WSL 설치 관련 문의드립니다!!

1

96

2

Vivado 툴, 파일 질문드립니다!

1

152

2

9장 LED 점등 안됨

1

110

3

Edit in IP Packager 이후에

1

84

1

Fpga 로직

1

89

2

pmu-fw is not running

1

127

2

Create Project에 대해서 궁금해요

1

89

2

장치관리자 USB 포트

1

98

2

FPGA 7장 AXI_LITE I/F질문

1

89

1

bram mover에서 합성할때

1

77

2

타이밍 위반 질문

1

78

2

rvalid 초기화

1

66

2

테스트 벤치 이슈

1

78

2