`include "defines.vh" module reg_file_interface_unit #( parameter INSTR_WIDTH = 16, // instructions are 16 bits in width parameter DATA_WIDTH = 8, // registers are 8 bits in width parameter R_ADDR_WIDTH = 5 // 32 registers )( input wire [`OPCODE_COUNT-1:0] opcode_type, input wire [DATA_WIDTH-1:0] writeback_value, input wire [R_ADDR_WIDTH-1:0] opcode_rd, input wire [R_ADDR_WIDTH-1:0] opcode_rr, input wire [`SIGNAL_COUNT-1:0] signals, output wire [R_ADDR_WIDTH-1:0] rr_addr, output wire [R_ADDR_WIDTH-1:0] rd_addr, inout wire [DATA_WIDTH-1:0] rr_data, inout wire [DATA_WIDTH-1:0] rd_data, output wire rr_cs, output wire rd_cs, output wire rr_we, output wire rd_we, output wire rr_oe, output wire rd_oe ); /* Toate asignarile de mai jos presupun ca instructiunea * curenta (instruction) este de tipul: * [opcode] Rd Rr, * caz in care va accesa de doua ori register file-ul: * o data in starea de instruction decode/register fetch, * pentru a citi valorile ambelor registre, si a doua oara * in write-back, pentru a depune rezultatul (alu_out) in * registrul Rd. * Evident, nu toate instructiunile sunt de acest tip. * In laburi ulterioare vom modifica aici. */ /* TODO : Modificati flag-urile de lucru cu registrele generale astfel incat noile instructiuni sa se execute corect. */ wire [R_ADDR_WIDTH-1:0] internal_rr_addr; wire [R_ADDR_WIDTH-1:0] internal_rd_addr; /* Internal */ assign internal_rd_addr = signals[`CONTROL_REG_RD_READ] ? (opcode_type == `TYPE_LD_X || opcode_type == `TYPE_ST_X) ? `XL : (opcode_type == `TYPE_LD_Y || opcode_type == `TYPE_ST_Y) ? `YL : (opcode_type == `TYPE_LD_Z || opcode_type == `TYPE_ST_Z) ? `ZL : opcode_rd : signals[`CONTROL_REG_RD_WRITE] ? opcode_rd : {R_ADDR_WIDTH{1'bx}}; assign internal_rr_addr = signals[`CONTROL_REG_RR_READ] ? (opcode_type == `TYPE_LD_X || opcode_type == `TYPE_ST_X) ? `XH : (opcode_type == `TYPE_LD_Y || opcode_type == `TYPE_ST_Y) ? `YH : (opcode_type == `TYPE_LD_Z || opcode_type == `TYPE_ST_Z) ? `ZH : opcode_rr : {R_ADDR_WIDTH{1'bx}}; assign rd_data = signals[`CONTROL_REG_RD_WRITE] ? writeback_value : {DATA_WIDTH{1'bz}}; assign rr_data = {DATA_WIDTH{1'bz}}; assign rd_we = signals[`CONTROL_REG_RD_READ] ? 1'b0 : signals[`CONTROL_REG_RD_WRITE] ? 1'b1 : 1'bx; assign rr_we = signals[`CONTROL_REG_RR_READ] ? 1'b0 : 1'bx; assign rd_oe = signals[`CONTROL_REG_RD_READ] ? 1'b1 : 1'bx; assign rr_oe = signals[`CONTROL_REG_RR_READ] ? 1'b1 : 1'bx; assign rd_cs = signals[`CONTROL_REG_RD_READ] || signals[`CONTROL_REG_RD_WRITE]; assign rr_cs = signals[`CONTROL_REG_RR_READ]; assign rd_addr = (rd_cs) ? internal_rd_addr : {R_ADDR_WIDTH{1'bx}}; assign rr_addr = (rr_cs) ? internal_rr_addr : {R_ADDR_WIDTH{1'bx}}; endmodule