mirror of https://github.com/VLSIDA/OpenRAM.git
190 lines
4.6 KiB
Verilog
190 lines
4.6 KiB
Verilog
|
|
module {{ module_name }} (
|
|
`ifdef USE_POWER_PINS
|
|
{{ vdd }},
|
|
{{ gnd }},
|
|
`endif
|
|
{% for port in rw_ports %}
|
|
clk{{ port }},
|
|
addr{{ port }},
|
|
din{{ port }},
|
|
csb{{ port }},
|
|
{% if num_wmask > 1 %}
|
|
wmask{{ port }},
|
|
{% endif %}
|
|
web{{ port }},
|
|
dout{{ port }},
|
|
{% endfor %}
|
|
{% for port in r_ports %}
|
|
clk{{ port }},
|
|
addr{{ port }},
|
|
csb{{ port }},
|
|
dout{{ port }},
|
|
{% endfor %}
|
|
{% for port in w_ports %}
|
|
clk{{ port }},
|
|
addr{{ port }},
|
|
din{{ port }},
|
|
csb{{ port }},
|
|
{% if num_wmask > 1 %}
|
|
wmask{{ port }},
|
|
{% endif %}
|
|
web{{ port }},
|
|
{% endfor %}
|
|
);
|
|
|
|
parameter DATA_WIDTH = {{ data_width }};
|
|
parameter ADDR_WIDTH= {{ addr_width }};
|
|
|
|
parameter BANK_SEL = {{ bank_sel }};
|
|
parameter NUM_WMASK = {{ num_wmask }};
|
|
|
|
`ifdef USE_POWER_PINS
|
|
inout {{ vdd }};
|
|
inout {{ gnd }};
|
|
`endif
|
|
{% for port in rw_ports %}
|
|
input clk{{ port }};
|
|
input [ADDR_WIDTH - 1 : 0] addr{{ port }};
|
|
input [DATA_WIDTH - 1: 0] din{{ port }};
|
|
input csb{{ port }};
|
|
input web{{ port }};
|
|
{% if num_wmask > 1 %}
|
|
input [NUM_WMASK - 1 : 0] wmask{{ port }};
|
|
{% endif %}
|
|
output reg [DATA_WIDTH - 1 : 0] dout{{ port }};
|
|
{% endfor %}
|
|
{% for port in r_ports %}
|
|
input clk{{ port }};
|
|
input [ADDR_WIDTH - 1 : 0] addr{{ port }};
|
|
input csb{{ port }};
|
|
output reg [DATA_WIDTH - 1 : 0] dout{{ port }};
|
|
{% endfor %}
|
|
{% for port in w_ports %}
|
|
input clk{{ port }};
|
|
input [ADDR_WIDTH - 1 : 0] addr{{ port }};
|
|
input [DATA_WIDTH - 1: 0] din{{ port }};
|
|
input csb{{ port }};
|
|
input web{{ port }};
|
|
{% if num_wmask > 1 %}
|
|
input [NUM_WMASK - 1 : 0] wmask{{ port }};
|
|
{% endif %}
|
|
{% endfor %}
|
|
|
|
{% for port in ports %}
|
|
reg [BANK_SEL - 1 : 0] addr{{ port }}_reg;
|
|
|
|
{% for bank in banks %}
|
|
wire [DATA_WIDTH - 1 : 0] dout{{ port }}_bank{{ bank }};
|
|
|
|
reg web{{ port }}_bank{{ bank }};
|
|
|
|
reg csb{{ port }}_bank{{ bank }};
|
|
|
|
{% endfor %}
|
|
{% endfor %}
|
|
|
|
{% for bank in banks %}
|
|
{{ bank_module_name }} bank{{ bank }} (
|
|
`ifdef USE_POWER_PINS
|
|
.{{ vdd }}({{ vdd }}),
|
|
.{{ gnd }}({{ gnd }}),
|
|
`endif
|
|
{% for port in rw_ports %}
|
|
.clk{{ port }}(clk{{ port }}),
|
|
.addr{{ port }}(addr{{ port }}[ADDR_WIDTH - BANK_SEL - 1 : 0]),
|
|
.din{{ port }}(din{{ port }}),
|
|
.csb{{ port }}(csb{{ port }}_bank{{ bank }}),
|
|
.web{{ port }}(web{{ port }}_bank{{ bank }}),
|
|
{% if num_wmask > 1 %}
|
|
.wmask{{ port }}(wmask{{ port }}),
|
|
{% endif %}
|
|
.dout{{ port }}(dout{{ port }}_bank{{ bank }}),
|
|
{% endfor %}
|
|
{% for port in r_ports %}
|
|
.clk{{ port }}(clk{{ port }}),
|
|
.addr{{ port }}(addr{{ port }}[ADDR_WIDTH - BANK_SEL - 1 : 0]),
|
|
.csb{{ port }}(csb{{ port }}_bank{{ bank }}),
|
|
.dout{{ port }}(dout{{ port }}_bank{{ bank }}),
|
|
{% endfor %}
|
|
{% for port in w_ports %}
|
|
.clk{{ port }}(clk{{ port }}),
|
|
.addr{{ port }}(addr{{ port }}[ADDR_WIDTH - BANK_SEL - 1 : 0]),
|
|
.din{{ port }}(din{{ port }}),
|
|
.csb{{ port }}(csb{{ port }}_bank{{ bank }}),
|
|
{% if num_wmask > 1 %}
|
|
.wmask{{ port }}(wmask{{ port }}),
|
|
{% endif %}
|
|
.web{{ port }}(web{{ port }}_bank{{ bank }}),
|
|
{% endfor %}
|
|
);
|
|
{% endfor %}
|
|
|
|
{% for port in ports %}
|
|
always @(posedge clk{{ port }}) begin
|
|
addr{{ port }}_reg <= addr{{ port }}[ADDR_WIDTH - 1 : ADDR_WIDTH - BANK_SEL];
|
|
end
|
|
{% endfor %}
|
|
|
|
{% for port in ports %}
|
|
always @(*) begin
|
|
case (addr{{ port }}_reg)
|
|
{% for bank in banks %}
|
|
{{ bank }}: begin
|
|
dout{{ port }} = dout{{ port }}_bank{{ bank }};
|
|
end
|
|
{% endfor %}
|
|
endcase
|
|
end
|
|
{% endfor %}
|
|
|
|
{% for port in rw_ports %}
|
|
always @(*) begin
|
|
{% for bank in banks %}
|
|
csb{{ port }}_bank{{ bank }} = 1'b1;
|
|
web{{ port }}_bank{{ bank }} = 1'b1;
|
|
{% endfor %}
|
|
case (addr{{ port }}[ADDR_WIDTH - 1 : ADDR_WIDTH - BANK_SEL])
|
|
{% for bank in banks %}
|
|
{{ bank }}: begin
|
|
web{{ port }}_bank{{ bank }} = web{{ port }};
|
|
csb{{ port }}_bank{{ bank }} = csb{{ port }};
|
|
end
|
|
{% endfor %}
|
|
endcase
|
|
end
|
|
{% endfor %}
|
|
|
|
{% for port in w_ports %}
|
|
always @(*) begin
|
|
{% for bank in banks %}
|
|
csb{{ port }}_bank{{ bank }} = 1'b1;
|
|
web{{ port }}_bank{{ bank }} = 1'b1;
|
|
{% endfor %}
|
|
case (addr{{ port }}[ADDR_WIDTH - 1 : ADDR_WIDTH - BANK_SEL])
|
|
{% for bank in banks %}
|
|
{{ bank }}: begin
|
|
web{{ port }}_bank{{ bank }} = web{{ port }};
|
|
csb{{ port }}_bank{{ bank }} = csb{{ port }};
|
|
end
|
|
{% endfor %}
|
|
endcase
|
|
end
|
|
{% endfor %}
|
|
|
|
{% for port in r_ports %}
|
|
always @(*) begin
|
|
{% for bank in banks %}
|
|
csb{{ port }}_bank{{ bank }} = 1'b1;
|
|
{% endfor %}
|
|
case (addr{{ port }}[ADDR_WIDTH - 1 : ADDR_WIDTH - BANK_SEL])
|
|
{% for bank in banks %}
|
|
{{ bank }}: begin
|
|
csb{{ port }}_bank{{ bank }} = csb{{ port }};
|
|
end
|
|
{% endfor %}
|
|
endcase
|
|
end
|
|
{% endfor %}
|
|
endmodule
|