3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-06-09 23:53:26 +00:00

Create a single-port URAM mapping to support memories 2048 x 144b

This commit is contained in:
Adrien Prost-Boucle 2025-05-09 14:16:03 +02:00
parent f60bbe64ac
commit c4a49f0c55
2 changed files with 161 additions and 0 deletions

View file

@ -35,3 +35,26 @@ ram huge $__XILINX_URAM_ {
wrbe_separate; wrbe_separate;
} }
} }
ram huge $__XILINX_URAM_SP_ {
abits 11;
width 144;
cost 1024;
option "BYTEWIDTH" 8 byte 8;
option "BYTEWIDTH" 9 byte 9;
init zero;
port srsw "A" {
clock anyedge "C";
clken;
rdwr no_change;
rdinit zero;
portoption "RST_MODE" "SYNC" {
rdsrst zero ungated;
}
portoption "RST_MODE" "ASYNC" {
rdarst zero;
}
wrtrans all new;
wrbe_separate;
}
}

View file

@ -150,3 +150,141 @@ module $__XILINX_URAM_ (...);
.SLEEP(1'b0) .SLEEP(1'b0)
); );
endmodule endmodule
module $__XILINX_URAM_SP_ (...);
parameter OPTION_BYTEWIDTH = 8;
localparam WR_BE_WIDTH = 144 / OPTION_BYTEWIDTH;
parameter CLK_C_POL = 1;
parameter PORT_A_CLK_POL = 1;
parameter PORT_A_OPTION_RST_MODE = "SYNC";
input CLK_C;
input PORT_A_CLK;
input PORT_A_CLK_EN;
input PORT_A_RD_SRST;
input PORT_A_RD_ARST;
input PORT_A_WR_EN;
input [WR_BE_WIDTH-1:0] PORT_A_WR_BE;
input [10:0] PORT_A_ADDR;
input [143:0] PORT_A_WR_DATA;
output [143:0] PORT_A_RD_DATA;
wire [71:0] DIN_A, DIN_B, DOUT_A, DOUT_B;
generate
if (OPTION_BYTEWIDTH == 8) begin
assign DIN_A = PORT_A_WR_DATA[71:0];
assign DIN_B = PORT_A_WR_DATA[143:72];
assign PORT_A_RD_DATA = {DOUT_B, DOUT_A};
end else begin
assign DIN_A = {
PORT_A_WR_DATA[71],
PORT_A_WR_DATA[62],
PORT_A_WR_DATA[53],
PORT_A_WR_DATA[44],
PORT_A_WR_DATA[35],
PORT_A_WR_DATA[26],
PORT_A_WR_DATA[17],
PORT_A_WR_DATA[8],
PORT_A_WR_DATA[70:63],
PORT_A_WR_DATA[61:54],
PORT_A_WR_DATA[52:45],
PORT_A_WR_DATA[43:36],
PORT_A_WR_DATA[34:27],
PORT_A_WR_DATA[25:18],
PORT_A_WR_DATA[16:9],
PORT_A_WR_DATA[7:0]
};
assign DIN_B = {
PORT_A_WR_DATA[72+71],
PORT_A_WR_DATA[72+62],
PORT_A_WR_DATA[72+53],
PORT_A_WR_DATA[72+44],
PORT_A_WR_DATA[72+35],
PORT_A_WR_DATA[72+26],
PORT_A_WR_DATA[72+17],
PORT_A_WR_DATA[72+8],
PORT_A_WR_DATA[72+70:72+63],
PORT_A_WR_DATA[72+61:72+54],
PORT_A_WR_DATA[72+52:72+45],
PORT_A_WR_DATA[72+43:72+36],
PORT_A_WR_DATA[72+34:72+27],
PORT_A_WR_DATA[72+25:72+18],
PORT_A_WR_DATA[72+16:72+ 9],
PORT_A_WR_DATA[72+ 7:72+ 0]
};
assign PORT_A_RD_DATA = {
DOUT_B[71],
DOUT_B[63:56],
DOUT_B[70],
DOUT_B[55:48],
DOUT_B[69],
DOUT_B[47:40],
DOUT_B[68],
DOUT_B[39:32],
DOUT_B[67],
DOUT_B[31:24],
DOUT_B[66],
DOUT_B[23:16],
DOUT_B[65],
DOUT_B[15:8],
DOUT_B[64],
DOUT_B[7:0],
DOUT_A[71],
DOUT_A[63:56],
DOUT_A[70],
DOUT_A[55:48],
DOUT_A[69],
DOUT_A[47:40],
DOUT_A[68],
DOUT_A[39:32],
DOUT_A[67],
DOUT_A[31:24],
DOUT_A[66],
DOUT_A[23:16],
DOUT_A[65],
DOUT_A[15:8],
DOUT_A[64],
DOUT_A[7:0]
};
end
endgenerate
URAM288 #(
.BWE_MODE_A(OPTION_BYTEWIDTH == 8 ? "PARITY_INDEPENDENT" : "PARITY_INTERLEAVED"),
.BWE_MODE_B(OPTION_BYTEWIDTH == 8 ? "PARITY_INDEPENDENT" : "PARITY_INTERLEAVED"),
.EN_AUTO_SLEEP_MODE("FALSE"),
.IREG_PRE_A("FALSE"),
.IREG_PRE_B("FALSE"),
.IS_CLK_INVERTED(!CLK_C_POL),
.OREG_A("FALSE"),
.OREG_B("FALSE"),
.RST_MODE_A(PORT_A_OPTION_RST_MODE),
.RST_MODE_B(PORT_A_OPTION_RST_MODE),
) _TECHMAP_REPLACE_ (
.ADDR_A({10'b0, PORT_A_ADDR, 1'b0}),
.BWE_A(PORT_A_WR_BE[WR_BE_WIDTH/2-1:0]),
.EN_A(PORT_A_CLK_EN),
.RDB_WR_A(PORT_A_WR_EN),
.INJECT_DBITERR_A(1'b0),
.INJECT_SBITERR_A(1'b0),
.RST_A(PORT_A_OPTION_RST_MODE == "SYNC" ? PORT_A_RD_SRST : PORT_A_RD_ARST),
.DIN_A(DIN_A),
.DOUT_A(DOUT_A),
.ADDR_B({10'b0, PORT_A_ADDR, 1'b1}),
.BWE_B(PORT_A_WR_BE[WR_BE_WIDTH-1:WR_BE_WIDTH]/2),
.EN_B(PORT_A_CLK_EN),
.RDB_WR_B(PORT_A_WR_EN),
.INJECT_DBITERR_B(1'b0),
.INJECT_SBITERR_B(1'b0),
.RST_B(PORT_A_OPTION_RST_MODE == "SYNC" ? PORT_A_RD_SRST : PORT_A_RD_ARST),
.DIN_B(DIN_B),
.DOUT_B(DOUT_B),
.CLK(CLK_C),
.SLEEP(1'b0)
);
endmodule