|
13 | 13 |
|
14 | 14 | `include "VX_platform.vh"
|
15 | 15 |
|
16 |
| -`define RAM_WRITE_WREN for (integer i = 0; i < WRENW; ++i) begin \ |
17 |
| - if (wren[i]) begin \ |
18 |
| - ram[waddr][i * WSELW +: WSELW] <= wdata[i * WSELW +: WSELW]; \ |
19 |
| - end \ |
20 |
| - end |
21 |
| - |
22 | 16 | `define RAM_INITIALIZATION \
|
23 | 17 | if (INIT_ENABLE != 0) begin : g_init \
|
24 | 18 | if (INIT_FILE != "") begin : g_file \
|
|
32 | 26 | end \
|
33 | 27 | end
|
34 | 28 |
|
35 |
| -`define RAM_BYPASS(__d) \ |
36 |
| - reg [DATAW-1:0] bypass_data_r; \ |
37 |
| - reg bypass_valid_r; \ |
| 29 | +`define SYNC_RAM_WF_BLOCK(__d, __re, __we, __ra, __wa) \ |
| 30 | + `RAM_ATTRIBUTES `RW_RAM_CHECK reg [DATAW-1:0] ram [0:SIZE-1]; \ |
| 31 | + `RAM_INITIALIZATION \ |
| 32 | + reg [ADDRW-1:0] raddr_r; \ |
| 33 | + always @(posedge clk) begin \ |
| 34 | + if (__re || __we) begin \ |
| 35 | + if (__we) begin \ |
| 36 | + ram[__wa] <= wdata; \ |
| 37 | + end \ |
| 38 | + raddr_r <= __ra; \ |
| 39 | + end \ |
| 40 | + end \ |
| 41 | + assign __d = ram[raddr_r] |
| 42 | + |
| 43 | +`define SYNC_RAM_WF_WREN_BLOCK(__d, __re, __we, __ra, __wa) \ |
| 44 | + `RAM_ATTRIBUTES `RW_RAM_CHECK reg [DATAW-1:0] ram [0:SIZE-1]; \ |
| 45 | + `RAM_INITIALIZATION \ |
| 46 | + reg [ADDRW-1:0] raddr_r; \ |
38 | 47 | always @(posedge clk) begin \
|
39 |
| - bypass_valid_r <= read_s && write && (raddr_s == waddr); \ |
40 |
| - bypass_data_r <= wdata; \ |
| 48 | + if (__re || __we) begin \ |
| 49 | + if (__we) begin \ |
| 50 | + for (integer i = 0; i < WRENW; ++i) begin \ |
| 51 | + if (wren[i]) begin \ |
| 52 | + ram[__wa][i * WSELW +: WSELW] <= wdata[i * WSELW +: WSELW]; \ |
| 53 | + end \ |
| 54 | + end \ |
| 55 | + end \ |
| 56 | + raddr_r <= __ra; \ |
| 57 | + end \ |
41 | 58 | end \
|
42 |
| - assign __d = bypass_valid_r ? bypass_data_r : rdata_r |
| 59 | + assign __d = ram[raddr_r] |
| 60 | + |
| 61 | +`define SYNC_RAM_RF_BLOCK(__d, __re, __we, __ra, __wa) \ |
| 62 | + `RAM_ATTRIBUTES reg [DATAW-1:0] ram [0:SIZE-1]; \ |
| 63 | + `RAM_INITIALIZATION \ |
| 64 | + reg [DATAW-1:0] rdata_r; \ |
| 65 | + always @(posedge clk) begin \ |
| 66 | + if (__re || __we) begin \ |
| 67 | + if (__we) begin \ |
| 68 | + ram[__wa] <= wdata; \ |
| 69 | + end \ |
| 70 | + rdata_r <= ram[__ra]; \ |
| 71 | + end \ |
| 72 | + end \ |
| 73 | + assign __d = rdata_r |
| 74 | + |
| 75 | +`define SYNC_RAM_RF_WREN_BLOCK(__d, __re, __we, __ra, __wa) \ |
| 76 | + `RAM_ATTRIBUTES reg [DATAW-1:0] ram [0:SIZE-1]; \ |
| 77 | + `RAM_INITIALIZATION \ |
| 78 | + reg [DATAW-1:0] rdata_r; \ |
| 79 | + always @(posedge clk) begin \ |
| 80 | + if (__re || __we) begin \ |
| 81 | + if (__we) begin \ |
| 82 | + for (integer i = 0; i < WRENW; ++i) begin \ |
| 83 | + if (wren[i]) begin \ |
| 84 | + ram[__wa][i * WSELW +: WSELW] <= wdata[i * WSELW +: WSELW]; \ |
| 85 | + end \ |
| 86 | + end \ |
| 87 | + end \ |
| 88 | + rdata_r <= ram[__ra]; \ |
| 89 | + end \ |
| 90 | + end \ |
| 91 | + assign __d = rdata_r |
| 92 | + |
| 93 | +`define ASYNC_RAM_BLOCK(__d, __we, __ra, __wa) \ |
| 94 | + `RAM_ATTRIBUTES reg [DATAW-1:0] ram [0:SIZE-1]; \ |
| 95 | + `RAM_INITIALIZATION \ |
| 96 | + always @(posedge clk) begin \ |
| 97 | + if (__we) begin \ |
| 98 | + ram[__wa] <= wdata; \ |
| 99 | + end \ |
| 100 | + end \ |
| 101 | + assign __d = ram[__ra] |
| 102 | + |
| 103 | +`define ASYNC_RAM_BLOCK_WREN(__d, __we, __ra, __wa) \ |
| 104 | + `RAM_ATTRIBUTES reg [DATAW-1:0] ram [0:SIZE-1]; \ |
| 105 | + `RAM_INITIALIZATION \ |
| 106 | + always @(posedge clk) begin \ |
| 107 | + if (__we) begin \ |
| 108 | + for (integer i = 0; i < WRENW; ++i) begin \ |
| 109 | + if (wren[i]) begin \ |
| 110 | + ram[__wa][i * WSELW +: WSELW] <= wdata[i * WSELW +: WSELW]; \ |
| 111 | + end \ |
| 112 | + end \ |
| 113 | + end \ |
| 114 | + end \ |
| 115 | + assign __d = ram[__ra] |
43 | 116 |
|
44 | 117 | `TRACING_OFF
|
45 | 118 | module VX_async_ram_patch #(
|
46 | 119 | parameter DATAW = 1,
|
47 | 120 | parameter SIZE = 1,
|
48 | 121 | parameter WRENW = 1,
|
49 | 122 | parameter DUAL_PORT = 0,
|
| 123 | + parameter FORCE_BRAM = 0, |
| 124 | + parameter WRITE_FIRST = 0, |
50 | 125 | parameter INIT_ENABLE = 0,
|
51 | 126 | parameter INIT_FILE = "",
|
52 | 127 | parameter [DATAW-1:0] INIT_VALUE = 0,
|
@@ -79,77 +154,102 @@ module VX_async_ram_patch #(
|
79 | 154 | .out ({raddr_s, read_s, is_raddr_reg})
|
80 | 155 | );
|
81 | 156 |
|
82 |
| - // synchroneous ram |
83 |
| - |
84 |
| - wire [DATAW-1:0] rdata_s; |
| 157 | + wire [DATAW-1:0] rdata_s, rdata_a; |
85 | 158 |
|
86 |
| - if (WRENW != 1) begin : g_wren_sync_ram |
87 |
| - `USE_BLOCK_BRAM reg [DATAW-1:0] ram [0:SIZE-1]; |
88 |
| - reg [DATAW-1:0] rdata_r; |
89 |
| - `RAM_INITIALIZATION |
90 |
| - always @(posedge clk) begin |
91 |
| - if (read_s || write) begin |
92 |
| - if (write) begin |
93 |
| - `RAM_WRITE_WREN |
| 159 | + if (1) begin : g_sync_ram |
| 160 | + if (WRENW != 1) begin : g_wren |
| 161 | + if (FORCE_BRAM) begin : g_bram |
| 162 | + if (WRITE_FIRST) begin : g_write_first |
| 163 | + `define RAM_ATTRIBUTES `USE_BLOCK_BRAM |
| 164 | + `SYNC_RAM_WF_WREN_BLOCK(rdata_s, read_s, write, raddr_s, waddr); |
| 165 | + `undef RAM_ATTRIBUTES |
| 166 | + end else begin : g_read_first |
| 167 | + `define RAM_ATTRIBUTES `USE_BLOCK_BRAM |
| 168 | + `SYNC_RAM_RF_WREN_BLOCK(rdata_s, read_s, write, raddr_s, waddr); |
| 169 | + `undef RAM_ATTRIBUTES |
| 170 | + end |
| 171 | + end else begin : g_lutram |
| 172 | + if (WRITE_FIRST) begin : g_write_first |
| 173 | + `define RAM_ATTRIBUTES |
| 174 | + `SYNC_RAM_WF_WREN_BLOCK(rdata_s, read_s, write, raddr_s, waddr); |
| 175 | + `undef RAM_ATTRIBUTES |
| 176 | + end else begin : g_read_first |
| 177 | + `define RAM_ATTRIBUTES |
| 178 | + `SYNC_RAM_RF_WREN_BLOCK(rdata_s, read_s, write, raddr_s, waddr); |
| 179 | + `undef RAM_ATTRIBUTES |
94 | 180 | end
|
95 |
| - rdata_r <= ram[raddr_s]; |
96 | 181 | end
|
97 |
| - end |
98 |
| - `RAM_BYPASS(rdata_s); |
99 |
| - end else begin : g_no_wren_sync_ram |
100 |
| - `USE_BLOCK_BRAM reg [DATAW-1:0] ram [0:SIZE-1]; |
101 |
| - reg [DATAW-1:0] rdata_r; |
102 |
| - `RAM_INITIALIZATION |
103 |
| - `UNUSED_VAR (wren) |
104 |
| - always @(posedge clk) begin |
105 |
| - if (read_s || write) begin |
106 |
| - if (write) begin |
107 |
| - ram[waddr] <= wdata; |
| 182 | + end else begin : g_no_wren |
| 183 | + if (FORCE_BRAM) begin : g_bram |
| 184 | + if (WRITE_FIRST) begin : g_write_first |
| 185 | + `define RAM_ATTRIBUTES `USE_BLOCK_BRAM |
| 186 | + `SYNC_RAM_WF_BLOCK(rdata_s, read_s, write, raddr_s, waddr); |
| 187 | + `undef RAM_ATTRIBUTES |
| 188 | + end else begin : g_read_first |
| 189 | + `define RAM_ATTRIBUTES `USE_BLOCK_BRAM |
| 190 | + `SYNC_RAM_RF_BLOCK(rdata_s, read_s, write, raddr_s, waddr); |
| 191 | + `undef RAM_ATTRIBUTES |
| 192 | + end |
| 193 | + end else begin : g_lutram |
| 194 | + if (WRITE_FIRST) begin : g_write_first |
| 195 | + `define RAM_ATTRIBUTES |
| 196 | + `SYNC_RAM_WF_BLOCK(rdata_s, read_s, write, raddr_s, waddr); |
| 197 | + `undef RAM_ATTRIBUTES |
| 198 | + end else begin : g_read_first |
| 199 | + `define RAM_ATTRIBUTES |
| 200 | + `SYNC_RAM_RF_BLOCK(rdata_s, read_s, write, raddr_s, waddr); |
| 201 | + `undef RAM_ATTRIBUTES |
108 | 202 | end
|
109 |
| - rdata_r <= ram[raddr_s]; |
110 | 203 | end
|
111 | 204 | end
|
112 |
| - `RAM_BYPASS(rdata_s); |
113 | 205 | end
|
114 | 206 |
|
115 |
| - // asynchronous ram (fallback) |
116 |
| - |
117 |
| - wire [DATAW-1:0] rdata_a; |
118 |
| - |
119 |
| - if (DUAL_PORT != 0) begin : g_dp_async_ram |
120 |
| - reg [DATAW-1:0] ram [0:SIZE-1]; |
121 |
| - `RAM_INITIALIZATION |
122 |
| - if (WRENW != 1) begin : g_wren |
123 |
| - always @(posedge clk) begin |
124 |
| - if (write) begin |
125 |
| - `RAM_WRITE_WREN |
| 207 | + if (1) begin : g_async_ram |
| 208 | + if (DUAL_PORT != 0) begin : g_dp |
| 209 | + if (WRENW != 1) begin : g_wren |
| 210 | + if (WRITE_FIRST) begin : g_write_first |
| 211 | + `define RAM_ATTRIBUTES `RW_RAM_CHECK |
| 212 | + `ASYNC_RAM_BLOCK_WREN(rdata_a, write, raddr, waddr); |
| 213 | + `undef RAM_ATTRIBUTES |
| 214 | + end else begin : g_read_first |
| 215 | + `define RAM_ATTRIBUTES `NO_RW_RAM_CHECK |
| 216 | + `ASYNC_RAM_BLOCK_WREN(rdata_a, write, raddr, waddr); |
| 217 | + `undef RAM_ATTRIBUTES |
126 | 218 | end
|
127 |
| - end |
128 |
| - end else begin : g_no_wren |
129 |
| - always @(posedge clk) begin |
130 |
| - if (write) begin |
131 |
| - ram[waddr] <= wdata; |
| 219 | + end else begin : g_no_wren |
| 220 | + if (WRITE_FIRST) begin : g_write_first |
| 221 | + `define RAM_ATTRIBUTES `RW_RAM_CHECK |
| 222 | + `ASYNC_RAM_BLOCK(rdata_a, write, raddr, waddr); |
| 223 | + `undef RAM_ATTRIBUTES |
| 224 | + end else begin : g_read_first |
| 225 | + `define RAM_ATTRIBUTES `NO_RW_RAM_CHECK |
| 226 | + `ASYNC_RAM_BLOCK(rdata_a, write, raddr, waddr); |
| 227 | + `undef RAM_ATTRIBUTES |
132 | 228 | end
|
133 | 229 | end
|
134 |
| - end |
135 |
| - assign rdata_a = ram[raddr]; |
136 |
| - end else begin : g_sp_async_ram |
137 |
| - reg [DATAW-1:0] ram [0:SIZE-1]; |
138 |
| - `RAM_INITIALIZATION |
139 |
| - if (WRENW != 1) begin : g_wren |
140 |
| - always @(posedge clk) begin |
141 |
| - if (write) begin |
142 |
| - `RAM_WRITE_WREN |
| 230 | + end else begin : g_sp |
| 231 | + if (WRENW != 1) begin : g_wren |
| 232 | + if (WRITE_FIRST) begin : g_write_first |
| 233 | + `define RAM_ATTRIBUTES `RW_RAM_CHECK |
| 234 | + `ASYNC_RAM_BLOCK_WREN(rdata_a, write, waddr, waddr); |
| 235 | + `undef RAM_ATTRIBUTES |
| 236 | + end else begin : g_read_first |
| 237 | + `define RAM_ATTRIBUTES `NO_RW_RAM_CHECK |
| 238 | + `ASYNC_RAM_BLOCK_WREN(rdata_a, write, waddr, waddr); |
| 239 | + `undef RAM_ATTRIBUTES |
143 | 240 | end
|
144 |
| - end |
145 |
| - end else begin : g_no_wren |
146 |
| - always @(posedge clk) begin |
147 |
| - if (write) begin |
148 |
| - ram[waddr] <= wdata; |
| 241 | + end else begin : g_no_wren |
| 242 | + if (WRITE_FIRST) begin : g_write_first |
| 243 | + `define RAM_ATTRIBUTES `RW_RAM_CHECK |
| 244 | + `ASYNC_RAM_BLOCK(rdata_a, write, waddr, waddr); |
| 245 | + `undef RAM_ATTRIBUTES |
| 246 | + end else begin : g_read_first |
| 247 | + `define RAM_ATTRIBUTES `NO_RW_RAM_CHECK |
| 248 | + `ASYNC_RAM_BLOCK(rdata_a, write, waddr, waddr); |
| 249 | + `undef RAM_ATTRIBUTES |
149 | 250 | end
|
150 | 251 | end
|
151 | 252 | end
|
152 |
| - assign rdata_a = ram[waddr]; |
153 | 253 | end
|
154 | 254 |
|
155 | 255 | assign rdata = is_raddr_reg ? rdata_s : rdata_a;
|
|
0 commit comments