강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

유승재님의 프로필 이미지
유승재

작성한 질문수

설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)

[FPGA 21장] 프로젝트 Fully Connected Layer 설계 - 코드리뷰편

코드 리뷰 중 질문드립니다.

작성

·

300

1

안녕하세요,

FC core 구현 과정 중  data_mover_bram 코드에서 질문드립니다.

line 203~206 / line 208~211 / line 213~216 / line 218~221은 일정한 규칙을 가지고 비슷한 형태를 가지는 코드입니다.

또한 line 223~237 도 비슷한 형식으로 4개가 있을 것입니다.

 

궁금한 점은 다음과 같습니다.

1. 현재는 4개의 core를 사용하기 때문에 일일히 코드 작성이 부담이 되지 않지만 실제 fc layer는 엄청 많은 node들로 이루어져 있기 때문에 일일히 일정한 규칙에 맞춰서 매 line을 적어주는 일은 비효율적이라고 생각이 드는데 혹시 이 상황에서 쓸 수 있는 문법이 있는지

2. 비슷하게 module instatiation도 동일하게 비슷한 모듈을 엄청 많이 만들어야한다면 사용 가능한 특정 문법이 있는지

3.  위 두 문법이 이 코드에도 적용될 수 있는지

 

궁금합니다.

 

감사합니다.

답변 1

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 :) 

제가 밖에 나와있어서, 내일 혹은 내일 모레쯤 상세하게 답변드리겠습니다.

generate 문법을 사용하시면 됩니다.

즐공하세요 :)

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 :) 

답이 늦었습니다. (연휴라 밖에 있었네요)

generate 문을 쓰면 궁금하신 부분을 해소할 수 있지 않을까 생각합니다.

해당 코드는, AI HW 에서 다룰거라서 조금만 기다려주세요.

이렇게 사용이 가능하다, 정도만 봐주시면 좋을 것 같습니다.

다음은 generate 문법 사용 예이구요.

백문이 불여코드라 코드를 드립니다. 즐공하세요 :)

1. instantiation
wire    [CO-1 : 0]              w_in_valid;
wire    [CO*(ACI_BW)-1 : 0]  	w_ot_ci_acc;
genvar ci_inst;
generate
	for(ci_inst = 0; ci_inst < CO; ci_inst = ci_inst + 1) begin : gen_ci_inst
		wire    [CI*KX*KY*W_BW-1 : 0]  	w_cnn_weight 	= i_cnn_weight[ci_inst*CI*KY*KX*W_BW +: CI*KY*KX*W_BW];
		wire    [CI*KX*KY*I_F_BW-1 : 0] w_in_fmap    	= i_in_fmap[0 +: CI*KY*KX*I_F_BW];
		assign	w_in_valid[ci_inst] = i_in_valid; 
		cnn_acc_ci u_cnn_acc_ci(
	    .clk             (clk         ),
	    .reset_n         (reset_n     ),
	    .i_soft_reset    (i_soft_reset),
	    .i_cnn_weight    (w_cnn_weight),
	    .i_in_valid      (w_in_valid[ci_inst]),
	    .i_in_fmap       (w_in_fmap),
	    .o_ot_valid      (w_ot_valid[ci_inst]),
	    .o_ot_ci_acc     (w_ot_ci_acc[ci_inst*(ACI_BW) +: (ACI_BW)])         
	    );
	end
endgenerate


2. logic
wire      [KY*KX*M_BW-1 : 0]    mul  ;
reg       [KY*KX*M_BW-1 : 0]    r_mul;

genvar mul_idx;
generate
	for(mul_idx = 0; mul_idx < KY*KX; mul_idx = mul_idx + 1) begin : gen_mul
		assign  mul[mul_idx * M_BW +: M_BW]	= i_in_fmap[mul_idx * I_F_BW +: I_F_BW] * i_cnn_weight[mul_idx * W_BW +: W_BW];
	
		always @(posedge clk or negedge reset_n) begin
		    if(!reset_n) begin
		        r_mul[mul_idx * M_BW +: M_BW] <= {M_BW{1'b0}};
		    end else if(i_soft_reset) begin
		        r_mul[mul_idx * M_BW +: M_BW] <= {M_BW{1'b0}};
		    end else if(i_in_valid)begin
		        r_mul[mul_idx * M_BW +: M_BW] <= mul[mul_idx * M_BW +: M_BW];
		    end
		end
	end
endgenerate
유승재님의 프로필 이미지
유승재

작성한 질문수

질문하기