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

psh2018314072님의 프로필 이미지
psh2018314072

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

[HDL 20장] Internal Memory Interface 에 대해 이해해보자 (FPGA 의 BRAM 을 이해하기 - 실습편)

실제 fpga상에서 BRAM을 사용했을때

작성

·

1.2K

1

안녕하세요 맛비님. 항상 좋은 강의 감사드립니다.

오늘 배운 BRAM 사용법을 활용하여 어떤 코드를 작성하고, 그 코드를 실제 FPGA상에서 실행시켰을때, FPGA 보드가 제공하는 BRAM의 area중 현재 몇퍼센트를 사용중인지 vivado tool에서 확인해볼수 있는 방법이 따로 있을까요?

답변 2

1

psh2018314072님의 프로필 이미지
psh2018314072
질문자

맛비님이 제공해주신 true_dpbram.v을 테스트해보고 싶어서 다음과 같은 테스트벤치를 만들어봤습니다.

`define ADDR_WIDTH 12

`define DATA_WIDTH 16

`define MEM_DEPTH 384

module tb_true_dpbram();

reg clk;

reg addr0;

reg ce0;

reg we0;

wire q0;

reg d0;

 

true_dpbram 

#( .DWIDTH   (`DATA_WIDTH), 

.AWIDTH   (`ADDR_WIDTH), 

.MEM_SIZE (`MEM_DEPTH)) 

u_TDPBRAM(

.clk (clk), 

 

.addr0 (addr0), 

.ce0 (ce0), 

.we0 (we0), 

.q0 (q0), 

.d0 (d0), 

 

// no use port B.

.addr1 (0), 

.ce1 (0), 

.we1 (0),

.q1 (), 

.d1 (0)

);

 

initial clk = 0; always #5 clk = ~clk;

initial begin

#0 addr0 = 12'b0; ce0 = 0; we0 = 0; d0 = 16'b0; 

#10 addr0 = 12'b0010_1100_1101; ce0 = 1; we0 = 1; d0 = 16'b0000_0000_0001;

#10 addr0 = 12'b0010_1100_1101; ce0 = 1; we0 = 1; d0 = 16'b0000_0000_0001;

#10 addr0 = 12'b0010_1100_1101; ce0 = 1; we0 = 0; d0 = 16'b0;

 

end

endmodule

그런데 q0값이 계속 unknown으로 나오는데 뭐가 잘못된걸 까요?ㅠ

 

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

어 답이 늦었습니다.

bram 의 초기값은 unknown 이구요.

initial begin

#0 addr0 = 12'b0; ce0 = 0; we0 = 0; d0 = 16'b0;   // addr 0 번에 read. 당연히 unknown 이 읽히죠.

#10 addr0 = 12'b0010_1100_1101; ce0 = 1; we0 = 1; d0 = 16'b0000_0000_0001; // write

#10 addr0 = 12'b0010_1100_1101; ce0 = 1; we0 = 1; d0 = 16'b0000_0000_0001; // write 

#10 addr0 = 12'b0010_1100_1101; ce0 = 1; we0 = 0; d0 = 16'b0; // read,  여기서는 unknown 이 아닌 16'b0000_0000_0001 이 읽혀야 할 것 같은데, waveform 올려주시겠어요?

end

 

 



psh2018314072님의 프로필 이미지
psh2018314072
질문자

q0값이 계속 unknown이 나오네요..ㅠㅠ

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

보자마자 위화감이 드는데, 다음 그림 참고부탁드려요. (하나씩 해결해 보시죠)

psh2018314072님의 프로필 이미지
psh2018314072
질문자

앗...죄송합니다..근데 바꿔도 똑같네요..ㅠㅠ

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

찾았습니다 :)

맞춰보실래요...?!!

 

정답은..?! 

Mem_depth 가 384 인데, address 를 717 에 접근하셨어요. (정상 동작이 아니죠?)

다음과 같이 한줄만 수정했어요.

 

즐공하세요 :)

 

psh2018314072님의 프로필 이미지
psh2018314072
질문자

아...정말 멍청하게 실수했네요..ㅠㅠ 끝까지 답변해주셔서 정말 감사합니다 맛비님!

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

그럴수도 있죠 ㅎ

즐공하세요 :)

0

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

안녕하세요 :)

해당 내용은 FPGA 강의 내용안에 있긴한데요, 강매가 될 수 있으니.

다음 문서 참고해보세요. 직접 올리고 확인하는게 가장 좋겠죠?

https://www.xilinx.com/support/documentation/sw_manuals/xilinx2020_2/ug888-vivado-design-flows-overview-tutorial.pdf

즐공하세요 :)

psh2018314072님의 프로필 이미지
psh2018314072
질문자

답변감사합니다!! Fpga강의도 기대하고있습니다!

추가적으로 하나만 더 여쭤봐도 될까요?

Verilog 문법을 공부하다가, $readmemh 라는 문법을 본적이있는데, 이것또한 메모리에 접근하는 문법이라고 알고있습니다. 그렇다면 이 문법과, 오늘 배운 bram을 컨트롤하는 모듈은 차이가있는건가요?

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

$readmemh 는 data 파일의 내용을 메모리로 읽을 때 사용하구요.

Testbench 에서도 사용 가능하고, 합성 가능한 RTL 에서도 사용가능합니다.

Testbench 에서는 자유롭게, data file 을 읽고 싶을 때 사용가능하구요. (Test 용이니까, 회로가 아니라는 뜻입니다.)

다만 합성 가능한 RTL 에서 사용 할때는 memory 의 초기값 (initial value) 을 정할때 사용합니다.

실제 회로에 초기값이 fix 되어 있습니다. (Testbench 하고는 그 의미가 다릅니다.)

 

Verilog 문법을 공부하다가, $readmemh 라는 문법을 본적이있는데, 이것또한 메모리에 접근하는 문법이라고 알고있습니다. 그렇다면 이 문법과, 오늘 배운 bram을 컨트롤하는 모듈은 차이가있는건가요?

다음과 같은 차이가 있다 라고 생각해요 :)

저랑 같이 배우신 BRAM Control 모듈은, Cycle 을 소모 (시간을 소모하는 실제 동작) 하여 BRAM 을 Read 하였습니다.

Testbench 에서의 $readmemh 는, cycle 을 소모하지 않고 read 합니다.

합성 가능한 RTL 에서의 $readmemh 는 회로상의 초기값으로 fix 할때 사용합니다.

 

즐공하세요 :)

psh2018314072님의 프로필 이미지
psh2018314072
질문자

좋은 답변 감사합니다!!!!

psh2018314072님의 프로필 이미지
psh2018314072

작성한 질문수

질문하기