1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
module $__XILINX_BLOCKRAM_TDP_ (...);
parameter INIT = 0;
parameter OPTION_MODE = "FULL";
parameter PORT_A_RD_WIDTH = 1;
parameter PORT_A_WR_WIDTH = 1;
parameter PORT_A_WR_EN_WIDTH = 1;
parameter PORT_A_RD_USED = 1;
parameter PORT_A_WR_USED = 1;
parameter PORT_A_OPTION_WRITE_MODE = "NO_CHANGE";
parameter PORT_A_RD_INIT_VALUE = 0;
parameter PORT_A_RD_SRST_VALUE = 0;
parameter PORT_B_RD_WIDTH = 1;
parameter PORT_B_WR_WIDTH = 1;
parameter PORT_B_WR_EN_WIDTH = 1;
parameter PORT_B_RD_USED = 0;
parameter PORT_B_WR_USED = 0;
parameter PORT_B_OPTION_WRITE_MODE = "NO_CHANGE";
parameter PORT_B_RD_INIT_VALUE = 0;
parameter PORT_B_RD_SRST_VALUE = 0;
input PORT_A_CLK;
input PORT_A_CLK_EN;
input [14:0] PORT_A_ADDR;
input [PORT_A_WR_WIDTH-1:0] PORT_A_WR_DATA;
input [PORT_A_WR_EN_WIDTH-1:0] PORT_A_WR_EN;
output [PORT_A_RD_WIDTH-1:0] PORT_A_RD_DATA;
input PORT_A_RD_SRST;
input PORT_B_CLK;
input PORT_B_CLK_EN;
input [14:0] PORT_B_ADDR;
input [PORT_B_WR_WIDTH-1:0] PORT_B_WR_DATA;
input [PORT_B_WR_EN_WIDTH-1:0] PORT_B_WR_EN;
output [PORT_B_RD_WIDTH-1:0] PORT_B_RD_DATA;
input PORT_B_RD_SRST;
`include "brams_defs.vh"
`define PARAMS_COMMON \
.WRITE_MODE_A(PORT_A_OPTION_WRITE_MODE), \
.WRITE_MODE_B(PORT_B_OPTION_WRITE_MODE), \
.READ_WIDTH_A(PORT_A_RD_USED ? PORT_A_RD_WIDTH : 0), \
.READ_WIDTH_B(PORT_B_RD_USED ? PORT_B_RD_WIDTH : 0), \
.WRITE_WIDTH_A(PORT_A_WR_USED ? PORT_A_WR_WIDTH : 0), \
.WRITE_WIDTH_B(PORT_B_WR_USED ? PORT_B_WR_WIDTH : 0), \
.DOA_REG(0), \
.DOB_REG(0), \
.INIT_A(ival(PORT_A_RD_WIDTH, PORT_A_RD_INIT_VALUE)), \
.INIT_B(ival(PORT_B_RD_WIDTH, PORT_B_RD_INIT_VALUE)), \
.SRVAL_A(ival(PORT_A_RD_WIDTH, PORT_A_RD_SRST_VALUE)), \
.SRVAL_B(ival(PORT_B_RD_WIDTH, PORT_B_RD_SRST_VALUE)),
`MAKE_DI(DI_A, DIP_A, PORT_A_WR_DATA)
`MAKE_DI(DI_B, DIP_B, PORT_B_WR_DATA)
`MAKE_DO(DO_A, DOP_A, PORT_A_RD_DATA)
`MAKE_DO(DO_B, DOP_B, PORT_B_RD_DATA)
wire [3:0] WE_A = {4{PORT_A_WR_EN}};
wire [3:0] WE_B = {4{PORT_B_WR_EN}};
generate
if (OPTION_MODE == "FULL") begin
RAMB16 #(
`PARAMS_INIT_18
`PARAMS_INITP_18
`PARAMS_COMMON
.RAM_EXTENSION_A("NONE"),
.RAM_EXTENSION_B("NONE"),
) _TECHMAP_REPLACE_ (
.DOA(DO_A),
.DOPA(DOP_A),
.DIA(DI_A),
.DIPA(DIP_A),
.DOB(DO_B),
.DOPB(DOP_B),
.DIB(DI_B),
.DIPB(DIP_B),
.ADDRA({1'b1, PORT_A_ADDR[13:0]}),
.ADDRB({1'b1, PORT_B_ADDR[13:0]}),
.CLKA(PORT_A_CLK),
.CLKB(PORT_B_CLK),
.ENA(PORT_A_CLK_EN),
.ENB(PORT_B_CLK_EN),
.REGCEA(1'b0),
.REGCEB(1'b0),
.SSRA(PORT_A_RD_SRST),
.SSRB(PORT_B_RD_SRST),
.WEA(WE_A),
.WEB(WE_B),
);
end else begin
wire CAS_A, CAS_B;
RAMB16 #(
`PARAMS_INIT_18
`PARAMS_COMMON
.RAM_EXTENSION_A("LOWER"),
.RAM_EXTENSION_B("LOWER"),
) lower (
.DIA(DI_A),
.DIB(DI_B),
.ADDRA(PORT_A_ADDR),
.ADDRB(PORT_B_ADDR),
.CLKA(PORT_A_CLK),
.CLKB(PORT_B_CLK),
.ENA(PORT_A_CLK_EN),
.ENB(PORT_B_CLK_EN),
.REGCEA(1'b0),
.REGCEB(1'b0),
.SSRA(PORT_A_RD_SRST),
.SSRB(PORT_B_RD_SRST),
.WEA(WE_A),
.WEB(WE_B),
.CASCADEOUTA(CAS_A),
.CASCADEOUTB(CAS_B),
);
RAMB16 #(
`PARAMS_INIT_18_U
`PARAMS_COMMON
.RAM_EXTENSION_A("UPPER"),
.RAM_EXTENSION_B("UPPER"),
) upper (
.DOA(DO_A),
.DIA(DI_A),
.DOB(DO_B),
.DIB(DI_B),
.ADDRA(PORT_A_ADDR),
.ADDRB(PORT_B_ADDR),
.CLKA(PORT_A_CLK),
.CLKB(PORT_B_CLK),
.ENA(PORT_A_CLK_EN),
.ENB(PORT_B_CLK_EN),
.REGCEA(1'b0),
.REGCEB(1'b0),
.SSRA(PORT_A_RD_SRST),
.SSRB(PORT_B_RD_SRST),
.WEA(WE_A),
.WEB(WE_B),
.CASCADEINA(CAS_A),
.CASCADEINB(CAS_B),
);
end
endgenerate
endmodule
|