BRAMを推論させてみる
#fpga #verilog #vivado #xilinx
Vivado Design Suite ユーザー ガイド( UG901 )のコード例を元に、ブロックRAMが推論されるようなRAMモジュールを作成できるか実験。以下のコードでBRAMを推論することができた。
ユーザーガイドのコードはSystemVerilogじゃなかったのでSystemVerilogで推論してくれるか不安だったんだけど、ちゃんと推論してくれて良かった。
BRAMとして認識されたRAMのコード
シングルポートRAM
code:verilog
module my_block_ram (
input clk, we,
input logic 31:0 addr, din,
output logic 31:0 dout
);
logic 31:0 ram 1023:0;
always_ff @(posedge clk)
begin
if (we)
ramaddr <= din;
dout <= ramaddr;
end
endmodule
デュアルポートRAM
code:verilog
module my_dual_port_ram (
input clk, we,
input 31:0 addr1, addr2, din,
output logic 31:0 dout1, dout2
);
logic 31:0 ram 1023:0;
always_ff @(posedge clk)
begin
if (we)
ramaddr1 <= din;
dout1 <= ramaddr1;
end
always_ff @(posedge clk)
begin
dout2 <= ramaddr2;
end
endmodule
BRAMとして認識されなかったRAMのコード
駄目だった理由(の予想)
assing dout = mem[addr] が非同期メモリ読み込みだから
ブロックRAMはクロック同期のメモリ読み込みにする必要がある
code:dame.sv
module ram(
input clk,
input logic 31:0 addr, din,
input logic we,
output logic 31:0 dout,
output logic 31:0 peek
);
logic 32:0 mem 255:0;
assign dout = memaddr;
assign peek = mem0;
always_ff @(posedge clk) begin
if (we)
memaddr <= din;
end
endmodule
参考
Vivado Design Suite ユーザー ガイド( UG901 )
https://www.xilinx.com/support/documentation/sw_manuals_j/xilinx2018_2/ug901-vivado-synthesis.pdf
RAMのHDLコード記述ガイドライン
P112
シングルポートブロックRAMの例