-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
// Copyright 2025 ETH Zurich and University of Bologna. | ||
// Solderpad Hardware License, Version 0.51, see LICENSE for details. | ||
// SPDX-License-Identifier: SHL-0.51 | ||
// | ||
// Andrea Belano <andrea.belano2@unibo.it> | ||
// | ||
|
||
module redmule_x_buffer_scm #( | ||
parameter int unsigned WORD_SIZE = 32, | ||
parameter int unsigned WIDTH = 1 , | ||
parameter int unsigned HEIGHT = 2 , | ||
parameter int unsigned N_OUTPUTS = 1 | ||
Check warning on line 12 in rtl/x_buffer/redmule_x_buffer_scm.sv
|
||
) ( | ||
input logic clk_i , | ||
input logic rst_ni , | ||
input logic write_en_i , | ||
input logic [$clog2(N_OUTPUTS)+$clog2(HEIGHT)-1:0] write_addr_i , | ||
input logic [WIDTH-1:0][WORD_SIZE-1:0] wdata_i , | ||
input logic read_en_i , | ||
input logic [$clog2(N_OUTPUTS)+$clog2(HEIGHT)-1:0] read_addr_i , | ||
Check warning on line 20 in rtl/x_buffer/redmule_x_buffer_scm.sv
|
||
output logic [N_OUTPUTS-1:0][WIDTH-1:0][WORD_SIZE-1:0] rdata_o | ||
Check warning on line 21 in rtl/x_buffer/redmule_x_buffer_scm.sv
|
||
); | ||
logic [HEIGHT-1:0][N_OUTPUTS-1:0][WIDTH-1:0][WORD_SIZE-1:0] buffer_q; | ||
Check warning on line 23 in rtl/x_buffer/redmule_x_buffer_scm.sv
|
||
logic [WIDTH-1:0][WORD_SIZE-1:0] wdata_q; | ||
logic [N_OUTPUTS-1:0][$clog2(HEIGHT)-1:0] read_addr_q; | ||
|
||
logic [$clog2(N_OUTPUTS)-1:0] row_w_addr; | ||
logic [$clog2(HEIGHT)-1:0] slot_w_addr; | ||
|
||
logic [HEIGHT-1:0][N_OUTPUTS-1:0] clk_w; | ||
|
||
for (genvar o = 0; o < N_OUTPUTS; o++) begin : gen_read_addr_registers | ||
always_ff @(posedge clk_i or negedge rst_ni) begin : sample_raddr | ||
if(~rst_ni) begin | ||
read_addr_q[o] <= '0; | ||
end else begin | ||
if (read_en_i && read_addr_i[$clog2(N_OUTPUTS)-1:0] == o) begin | ||
read_addr_q[o] <= read_addr_i[$clog2(N_OUTPUTS)+:$clog2(HEIGHT)]; | ||
end | ||
end | ||
end | ||
end | ||
|
||
for (genvar o = 0; o < N_OUTPUTS; o++) begin : output_assignment | ||
Check warning on line 44 in rtl/x_buffer/redmule_x_buffer_scm.sv
|
||
assign rdata_o[o] = buffer_q[read_addr_q[o]][o]; | ||
end | ||
|
||
always_ff @(posedge clk_i or negedge rst_ni) begin : sample_wdata | ||
if(~rst_ni) begin | ||
wdata_q <= '0; | ||
end else begin | ||
if (write_en_i) begin | ||
wdata_q <= wdata_i; | ||
end | ||
end | ||
end | ||
|
||
assign row_w_addr = write_addr_i[$clog2(N_OUTPUTS)-1:0]; | ||
assign slot_w_addr = write_addr_i[$clog2(N_OUTPUTS)+:$clog2(HEIGHT)]; | ||
|
||
for (genvar h = 0; h < HEIGHT; h++) begin : gen_slots_cg | ||
for (genvar o = 0; o < N_OUTPUTS; o++) begin : gen_rows_cg | ||
tc_clk_gating i_row_cg ( | ||
.clk_i ( clk_i ), | ||
.en_i ( row_w_addr == o && slot_w_addr == h && write_en_i ), | ||
.test_en_i ( '0 ), | ||
.clk_o ( clk_w[h][o] ) | ||
); | ||
end | ||
end | ||
|
||
for (genvar h = 0; h < HEIGHT; h++) begin : gen_slots | ||
for (genvar o = 0; o < N_OUTPUTS; o++) begin : gen_rows | ||
always_latch begin : latch_wdata | ||
if (clk_w[h][o]) begin | ||
buffer_q[h][o] = wdata_q; | ||
end | ||
end | ||
end | ||
end | ||
|
||
endmodule | ||
Check warning on line 82 in rtl/x_buffer/redmule_x_buffer_scm.sv
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
// Copyright 2025 ETH Zurich and University of Bologna. | ||
// Solderpad Hardware License, Version 0.51, see LICENSE for details. | ||
// SPDX-License-Identifier: SHL-0.51 | ||
// | ||
// Andrea Belano <andrea.belano2@unibo.it> | ||
// | ||
|
||
module redmule_x_pad_scm #( | ||
parameter int unsigned WORD_SIZE = 32, | ||
parameter int unsigned ROWS = 1 , | ||
parameter int unsigned COLS = 1 | ||
Check warning on line 11 in rtl/x_buffer/redmule_x_pad_scm.sv
|
||
) ( | ||
input logic clk_i , | ||
input logic rst_ni , | ||
input logic write_en_i , | ||
input logic [$clog2(ROWS)-1:0] write_addr_i , | ||
input logic [COLS-1:0][WORD_SIZE-1:0] wdata_i , | ||
input logic read_en_i , | ||
input logic [$clog2(COLS)-1:0] read_addr_i , | ||
Check warning on line 19 in rtl/x_buffer/redmule_x_pad_scm.sv
|
||
output logic [ROWS-1:0][WORD_SIZE-1:0] rdata_o | ||
Check warning on line 20 in rtl/x_buffer/redmule_x_pad_scm.sv
|
||
); | ||
logic [ROWS-1:0][COLS-1:0][WORD_SIZE-1:0] buffer_q; | ||
Check warning on line 22 in rtl/x_buffer/redmule_x_pad_scm.sv
|
||
logic [COLS-1:0][WORD_SIZE-1:0] wdata_q; | ||
logic [$clog2(COLS)-1:0] read_addr_q; | ||
|
||
logic [ROWS-1:0] clk_w; | ||
|
||
always_ff @(posedge clk_i or negedge rst_ni) begin : sample_raddr | ||
if(~rst_ni) begin | ||
read_addr_q <= '0; | ||
end else begin | ||
if (read_en_i) begin | ||
read_addr_q <= read_addr_i; | ||
end | ||
end | ||
end | ||
|
||
for (genvar r = 0; r < ROWS; r++) begin : output_assignment | ||
Check warning on line 38 in rtl/x_buffer/redmule_x_pad_scm.sv
|
||
assign rdata_o[r] = buffer_q[r][read_addr_q]; | ||
end | ||
|
||
always_ff @(posedge clk_i or negedge rst_ni) begin : sample_wdata | ||
if(~rst_ni) begin | ||
wdata_q <= '0; | ||
end else begin | ||
if (write_en_i) begin | ||
wdata_q <= wdata_i; | ||
end | ||
end | ||
end | ||
|
||
for (genvar r = 0; r < ROWS; r++) begin : gen_write_clock_gates | ||
tc_clk_gating i_rows_cg ( | ||
.clk_i ( clk_i ), | ||
.en_i ( write_addr_i == r && write_en_i ), | ||
.test_en_i ( '0 ), | ||
.clk_o ( clk_w[r] ) | ||
); | ||
end | ||
|
||
for (genvar r = 0; r < ROWS; r++) begin : gen_rows | ||
for (genvar c = 0; c < COLS; c++) begin : gen_cols | ||
always_latch begin : latch_wdata | ||
if (clk_w[r]) begin | ||
buffer_q[r][c] = wdata_q[c]; | ||
end | ||
end | ||
end | ||
end | ||
|
||
endmodule | ||
Check warning on line 71 in rtl/x_buffer/redmule_x_pad_scm.sv
|