AYAKA_Transformer/rtl/Memory.v

137 lines
5.7 KiB
Verilog

module top_module_mem #(
parameter ROWS1 = 16, // Matrix 1: 16x12
parameter COLS1 = 12,
parameter ROWS2 = 12, // Matrix 2: 12x12
parameter COLS2 = 12,
parameter ROWS3 = 16, // Matrix 3: 16x32
parameter COLS3 = 32,
parameter DATA_WIDTH = 16,
parameter COLS_USED = 4
)(
input clk,
// Address Inputs
input [$clog2(ROWS1)-1:0] row_addr_1,
input [$clog2(COLS1)-1:0] col_addr_1,
input [$clog2(ROWS2)-1:0] row_addr_2,
input [$clog2(COLS2)-1:0] col_addr_2,
input [$clog2(ROWS3)-1:0] row_addr_3,
input [$clog2(COLS3)-1:0] col_addr_3,
// Control Signals
input write_enable_1, write_enable_2, write_enable_3,
input read_enable_1, read_enable_2, read_enable_3,
input read_full_row_1, read_full_row_2, read_full_row_3, // NEW signals
input write_full_row_1, write_full_row_2, write_full_row_3, // NEW signals
input read_full_row_or_col1, read_full_row_or_col2, read_full_row_or_col3, //0 to read row wise & 1 to read col wise
// Data Inputs
input [DATA_WIDTH-1:0] data_input_1, data_input_2, data_input_3,
input [DATA_WIDTH*((ROWS1>COLS1)?ROWS1-1:COLS1-1):0] full_row_input_1,
input [DATA_WIDTH*((ROWS2>COLS2)?ROWS2-1:COLS2-1):0] full_row_input_2,
input [DATA_WIDTH*((ROWS3>COLS3)?ROWS3-1:COLS3-1):0] full_row_input_3,
input [$clog2(COLS1)-1:0] no_cols_used1, // in row wise reading or writing
input [$clog2(COLS2)-1:0] no_cols_used2, // in row wise reading or writing
input [$clog2(COLS3)-1:0] no_cols_used3, // in row wise reading or writing
input [$clog2(ROWS1)-1:0] no_rows_used1, // in col wise reading or writing
input [$clog2(ROWS2)-1:0] no_rows_used2, // in col wise reading or writing
input [$clog2(ROWS3)-1:0] no_rows_used3, // in col wise reading or writing
input write_back_to_file_enable,
// Data Outputs
output [DATA_WIDTH-1:0] data_output_1, data_output_2, data_output_3,
output [DATA_WIDTH*((ROWS1>COLS1)?ROWS1-1:COLS1-1):0] full_row_output_1, // For full row reads //COLS1
output [DATA_WIDTH*((ROWS2>COLS2)?ROWS2-1:COLS2-1):0] full_row_output_2, // (optional) for Matrix 2 //COLS2
output [DATA_WIDTH*((ROWS3>COLS3)?ROWS3-1:COLS3-1):0] full_row_output_3, // (optional) for Matrix 3 //COLS3
output done_writing_to_file,
// Valid outputs
output valid_1, valid_2, valid_3
);
// === Memory Block 1: Matrix 1 (A Matrix, Input) ===
matrix_memory_flexible #(
.MEM_ROWS(ROWS1),
.MEM_COLS(COLS1),
.INIT_FILE("D:/Project_verilog_item/project_files/hdl_verilog/phase5/matrix_data_temp_20_X_100_column_wise.hex"),
.DATA_WIDTH(DATA_WIDTH),
.COLS_USED(COLS_USED),
.OUTPUT_FILE("D:/Project_verilog_item/project_files/hdl_verilog/phase5/file_dump/mem1.hex")
) u_matrix_mem_1 (
.clk(clk),
.write_enable(write_enable_1),
.write_full_row(write_full_row_1),
.full_row_in(full_row_input_1),
.read_enable(read_enable_1),
.read_full_row(read_full_row_1),
.row(row_addr_1),
.col(col_addr_1),
.read_full_row_or_col(read_full_row_or_col1),
.no_cols_used(no_cols_used1),
.no_rows_used(no_rows_used1),
.data_in(data_input_1),
.write_back_to_file_enable(write_back_to_file_enable),
.data_out(data_output_1),
.full_row_out(full_row_output_1),
.valid(valid_1),
.done_writing_to_file(done_writing_to_file)
);
// === Memory Block 2: Matrix 2 (Weights) ===
matrix_memory_flexible #(
.MEM_ROWS(ROWS2),
.MEM_COLS(COLS2),
.INIT_FILE("D:/Project_verilog_item/project_files/hdl_verilog/phase5/matrix_data_temp_20_X_100_column_wise.hex"),
.DATA_WIDTH(DATA_WIDTH),
.COLS_USED(COLS_USED),
.OUTPUT_FILE("D:/Project_verilog_item/project_files/hdl_verilog/phase5/file_dump/mem2.hex")
) u_matrix_mem_2 (
.clk(clk),
.write_enable(write_enable_2),
.read_enable(read_enable_2),
.write_full_row(write_full_row_2),
.full_row_in(full_row_input_2),
.read_full_row(read_full_row_2),
.row(row_addr_2),
.col(col_addr_2),
.read_full_row_or_col(read_full_row_or_col2),
.no_cols_used(no_cols_used2),
.no_rows_used(no_rows_used2),
.data_in(data_input_2),
.write_back_to_file_enable(write_back_to_file_enable),
.data_out(data_output_2),
.full_row_out(full_row_output_2),
.valid(valid_2),
.done_writing_to_file(done_writing_to_file)
);
// === Memory Block 3: Matrix 3 (Temporary / Output Buffer) ===
matrix_memory_flexible #(
.MEM_ROWS(ROWS3),
.MEM_COLS(COLS3),
.INIT_FILE("D:/Project_verilog_item/project_files/hdl_verilog/phase5/matrix_data_temp_20_X_100_ones.hex"),
.DATA_WIDTH(DATA_WIDTH),
.COLS_USED(COLS_USED),
.OUTPUT_FILE("D:/Project_verilog_item/project_files/hdl_verilog/phase5/file_dump/mem3.hex")
) u_matrix_mem_3 (
.clk(clk),
.write_enable(write_enable_3),
.read_enable(read_enable_3),
.write_full_row(write_full_row_3),
.full_row_in(full_row_input_3),
.read_full_row(read_full_row_3),
.row(row_addr_3),
.col(col_addr_3),
.read_full_row_or_col(read_full_row_or_col3),
.no_cols_used(no_cols_used3),
.no_rows_used(no_rows_used3),
.data_in(data_input_3),
.write_back_to_file_enable(write_back_to_file_enable),
.data_out(data_output_3),
.full_row_out(full_row_output_3),
.valid(valid_3),
.done_writing_to_file(done_writing_to_file)
);
endmodule