WISC-SP22-5-Stage-Pipelined-Processor / verilog / regFile.v
regFile.v
Raw
/*
   CS/ECE 552, Spring '22
   Homework #3, Problem #1
  
   This module creates a 16-bit register.  It has 1 write port, 2 read
   ports, 3 register select inputs, a write enable, a reset, and a clock
   input.  All register state changes occur on the rising edge of the
   clock. 
*/
module regFile (
                // Outputs
                read1Data, read2Data, err,
                // Inputs
                clk, rst, read1RegSel, read2RegSel, writeRegSel, writeData, writeEn
                );
	
   parameter WIDTHSELECT = 16;
   input        clk, rst;
   input [2:0]  read1RegSel;
   input [2:0]  read2RegSel;
   input [2:0]  writeRegSel;
   input [WIDTHSELECT - 1:0] writeData;
   input        writeEn;

   output [WIDTHSELECT - 1:0] read1Data;
   output [WIDTHSELECT - 1:0] read2Data;
   output        err;

   /* YOUR CODE HERE */
    
    wire [WIDTHSELECT - 1:0] register0_read;
    wire [WIDTHSELECT - 1:0] register1_read;
    wire [WIDTHSELECT - 1:0] register2_read;
    wire [WIDTHSELECT - 1:0] register3_read;
    wire [WIDTHSELECT - 1:0] register4_read;
    wire [WIDTHSELECT - 1:0] register5_read;
    wire [WIDTHSELECT - 1:0] register6_read;
    wire [WIDTHSELECT - 1:0] register7_read;
    wire [WIDTHSELECT - 1:0] writeIn0;
    wire [WIDTHSELECT - 1:0] writeIn1;
    wire [WIDTHSELECT - 1:0] writeIn2;
    wire [WIDTHSELECT - 1:0] writeIn3;
    wire [WIDTHSELECT - 1:0] writeIn4;
    wire [WIDTHSELECT - 1:0] writeIn5;
    wire [WIDTHSELECT - 1:0] writeIn6;
    wire [WIDTHSELECT - 1:0] writeIn7;
    wire write_en [7:0];
    wire err_temp1;
    wire err_temp2;
    wire err_temp3;
    
    assign write_en[0] = (~writeRegSel[0] & ~writeRegSel[1] & ~writeRegSel[2]) & writeEn;
    assign write_en[1] = (writeRegSel[0] & ~writeRegSel[1] & ~writeRegSel[2]) & writeEn;
    assign write_en[2] = (~writeRegSel[0] & writeRegSel[1] & ~writeRegSel[2]) & writeEn;
    assign write_en[3] = (writeRegSel[0] & writeRegSel[1] & ~writeRegSel[2]) & writeEn;
    assign write_en[4] = (~writeRegSel[0] & ~writeRegSel[1] & writeRegSel[2]) & writeEn;
    assign write_en[5] = (writeRegSel[0] & ~writeRegSel[1] & writeRegSel[2]) & writeEn;
    assign write_en[6] = (~writeRegSel[0] & writeRegSel[1] & writeRegSel[2]) & writeEn;
    assign write_en[7] = (writeRegSel[0] & writeRegSel[1] & writeRegSel[2]) & writeEn;
    
    assign writeIn0 = write_en[0] ? writeData : register0_read;
    assign writeIn1 = write_en[1] ? writeData : register1_read;
    assign writeIn2 = write_en[2] ? writeData : register2_read;
    assign writeIn3 = write_en[3] ? writeData : register3_read;
    assign writeIn4 = write_en[4] ? writeData : register4_read;
    assign writeIn5 = write_en[5] ? writeData : register5_read;
    assign writeIn6 = write_en[6] ? writeData : register6_read;
    assign writeIn7 = write_en[7] ? writeData : register7_read;

    register iREG0(.clk(clk), .rst(rst), .read(register0_read), .write(writeIn0));
    register iREG1(.clk(clk), .rst(rst), .read(register1_read), .write(writeIn1));
    register iREG2(.clk(clk), .rst(rst), .read(register2_read), .write(writeIn2));
    register iREG3(.clk(clk), .rst(rst), .read(register3_read), .write(writeIn3));
    register iREG4(.clk(clk), .rst(rst), .read(register4_read), .write(writeIn4));
    register iREG5(.clk(clk), .rst(rst), .read(register5_read), .write(writeIn5));
    register iREG6(.clk(clk), .rst(rst), .read(register6_read), .write(writeIn6));
    register iREG7(.clk(clk), .rst(rst), .read(register7_read), .write(writeIn7));
    
    assign read1Data = read1RegSel[2] ? (read1RegSel[1] ? (read1RegSel[0] ? (register7_read) : (register6_read)) : (read1RegSel[0] ? (register5_read) : (register4_read))) : (read1RegSel[1] ? (read1RegSel[0] ? (register3_read) : (register2_read)) : (read1RegSel[0] ? (register1_read) : (register0_read)));
    
    assign read2Data = read2RegSel[2] ? (read2RegSel[1] ? (read2RegSel[0] ? (register7_read) : (register6_read)) : (read2RegSel[0] ? (register5_read) : (register4_read))) : (read2RegSel[1] ? (read2RegSel[0] ? (register3_read) : (register2_read)) : (read2RegSel[0] ? (register1_read) : (register0_read)));
    
    assign err_temp1 = (writeEn === 1'bx) ? 1'b1 : ((writeEn === 1'bz) ? 1'b1 : 1'b0);

    assign err_temp2 = (read1RegSel === 3'bxxx) ? 1'b1 : ((read1RegSel === 3'bzzz) ? 1'b1 : 1'b0);

    assign err_temp3 = (read2RegSel === 3'bxxx) ? 1'b1 : ((read2RegSel === 3'bzzz) ? 1'b1 : 1'b0);

    assign err = err_temp1 | err_temp2 | err_temp3;
    
endmodule