작성
·
1.2K
1
안녕하세요 맛비님. 항상 좋은 강의 감사드립니다.
오늘 배운 BRAM 사용법을 활용하여 어떤 코드를 작성하고, 그 코드를 실제 FPGA상에서 실행시켰을때, FPGA 보드가 제공하는 BRAM의 area중 현재 몇퍼센트를 사용중인지 vivado tool에서 확인해볼수 있는 방법이 따로 있을까요?
답변 2
1
맛비님이 제공해주신 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으로 나오는데 뭐가 잘못된걸 까요?ㅠ
찾았습니다 :)
맞춰보실래요...?!!
정답은..?!
Mem_depth 가 384 인데, address 를 717 에 접근하셨어요. (정상 동작이 아니죠?)
다음과 같이 한줄만 수정했어요.
즐공하세요 :)
0
안녕하세요 :)
해당 내용은 FPGA 강의 내용안에 있긴한데요, 강매가 될 수 있으니.
다음 문서 참고해보세요. 직접 올리고 확인하는게 가장 좋겠죠?
https://www.xilinx.com/support/documentation/sw_manuals/xilinx2020_2/ug888-vivado-design-flows-overview-tutorial.pdf
즐공하세요 :)
답변감사합니다!! 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 할때 사용합니다.
즐공하세요 :)
어 답이 늦었습니다.
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