From 90a5a79a453e72538a4b4de459f920b73039008d Mon Sep 17 00:00:00 2001 From: MicroCoreLabs <54004369+MicroCoreLabs@users.noreply.github.com> Date: Sat, 19 Oct 2019 14:47:42 -0700 Subject: [PATCH] Uploaded 10_19_2019 --- MCLR5/Core/DPROM_8Kx128.v | 80 +++++ MCLR5/Core/MCLR5.v | 491 +++++++++++++++++++++++++++ MCLR5/Core/MCLR5_alu.v | 206 +++++++++++ MCLR5/Movies_Pictures/Quadissue1.JPG | Bin 0 -> 63761 bytes MCLR5/README.md | 12 + 5 files changed, 789 insertions(+) create mode 100644 MCLR5/Core/DPROM_8Kx128.v create mode 100644 MCLR5/Core/MCLR5.v create mode 100644 MCLR5/Core/MCLR5_alu.v create mode 100644 MCLR5/Movies_Pictures/Quadissue1.JPG create mode 100644 MCLR5/README.md diff --git a/MCLR5/Core/DPROM_8Kx128.v b/MCLR5/Core/DPROM_8Kx128.v new file mode 100644 index 0000000..ff2fdd9 --- /dev/null +++ b/MCLR5/Core/DPROM_8Kx128.v @@ -0,0 +1,80 @@ +// +// File Name : DPROM_8Kx128.v +// Used on : +// Author : Ted Fried, MicroCore Labs +// Creation : 8/57/2017 +// Code Type : Behavioral +// +// Description: +// ============ +// Xilinx ROM behavioral model. +// +// + +//------------------------------------------------------------------------ + + +`timescale 1ns/100ps + + + +module DPROM_8Kx128 + ( + input clka, + input[12:0] addra, + output reg[127:0] douta, + + input clkb, + input[12:0] addrb, + output reg[127:0] doutb + + ); + +//------------------------------------------------------------------------ + +integer file, k, l; +reg [127:0] ram_array[0:8191]; + + + +//------------------------------------------------------------------------ + + +initial + begin + + // Zero out the RAM so there are no X's + for (k = 0; k < 8192 ; k = k + 1) + begin + ram_array[k] = 'h0; + end + + + // Load the instructions into the array using ASCII byte file + $readmemh("D:/MCL/MCLR5/Quad_Issue/usercode_rom.hex", ram_array); + //$readmemb("C:/MCL/MCLR5/Quad_Issue/usercode_rom.hex", ram_array); + + end + + + +always @(posedge clka) + begin + + douta <= ram_array[addra]; + doutb <= ram_array[addrb]; + + end + + + + +//------------------------------------------------------------------------ + +endmodule + + +//------------------------------------------------------------------------ + + + diff --git a/MCLR5/Core/MCLR5.v b/MCLR5/Core/MCLR5.v new file mode 100644 index 0000000..25ca134 --- /dev/null +++ b/MCLR5/Core/MCLR5.v @@ -0,0 +1,491 @@ +// +// +// File Name : MCLR5.v +// Author : Ted Fried, MicroCore Labs +// Creation : 4/27/2018 +// Code Type : Synthesizable +// +//------------------------------------------------------------------------ +// +// Description: +// ============ +// +// Quad-issue Superscalar Risc V Processor +// +//------------------------------------------------------------------------ +// +// Copyright (C) 2018 by Ted Fried info@MicroCoreLabs.com +// +// Permission to use, copy, modify, and distribute this software and its +// documentation for any purpose and without fee is hereby granted, provided +// that the above copyright notice appear in all copies and that both that +// copyright notice and this permission notice appear in supporting documentation. +// This software is provided "as is" without express or implied warranty. +// +//------------------------------------------------------------------------ +// +// Modification History: +// ===================== +// +// Revision 1 4/27/18 +// Initial revision +// +// +//------------------------------------------------------------------------ + + +module MCLR5 + ( + input CORE_CLK, + input RST_n, + + output [31:0] LOAD_STORE_ADDRESS, + output [31:0] STORE_DATA, + input [31:0] LOAD_DATA, + output LOAD_REQ, + output STORE_REQ + + ); + +//------------------------------------------------------------------------ + +// Internal Signals + +reg new_pc_stall = 'h0; +reg alu0_load_req_d = 'h0; +reg alu1_load_req_d = 'h0; +reg alu2_load_req_d = 'h0; +reg alu3_load_req_d = 'h0; +reg [31:0] register_1 = 'h0; +reg [31:0] register_2 = 'h0; +reg [31:0] register_3 = 'h0; +reg [31:0] register_4 = 'h0; +reg [3:0] loadstore_stall = 'h0; +reg [31:0] new_pc = 'h0; +wire alu0_load_req; +wire alu1_load_req; +wire alu2_load_req; +wire alu3_load_req; +wire alu0_store_req; +wire alu1_store_req; +wire alu2_store_req; +wire alu3_store_req; +wire [31:0] i_immediate; +wire [255:0] program_rom_data; +wire [31:0] new_pc_plus1; +wire [32:0] alu0_rd; +wire [32:0] alu1_rd; +wire [32:0] alu2_rd; +wire [32:0] alu3_rd; +wire [32:0] alu0_newpc; +wire [32:0] alu1_newpc; +wire [32:0] alu2_newpc; +wire [32:0] alu3_newpc; +wire [31:0] alu0_opcode; +wire [31:0] alu1_opcode; +wire [31:0] alu2_opcode; +wire [31:0] alu3_opcode; +wire [31:0] alu0_pc; +wire [31:0] alu1_pc; +wire [31:0] alu2_pc; +wire [31:0] alu3_pc; +wire [31:0] alu0_rs1; +wire [31:0] alu1_rs1; +wire [31:0] alu2_rs1; +wire [31:0] alu3_rs1; +wire [31:0] alu0_rs2; +wire [31:0] alu1_rs2; +wire [31:0] alu2_rs2; +wire [31:0] alu3_rs2; +wire [31:0] alu0_load_store_address; +wire [31:0] alu0_store_data; +wire [31:0] alu0_load_data; +wire [4:0] alu0_opcode_rs1; +wire [4:0] alu1_opcode_rs1; +wire [4:0] alu2_opcode_rs1; +wire [4:0] alu3_opcode_rs1; +wire [4:0] alu0_opcode_rs2; +wire [4:0] alu1_opcode_rs2; +wire [4:0] alu2_opcode_rs2; +wire [4:0] alu3_opcode_rs2; +wire [4:0] alu0_opcode_rd; +wire [4:0] alu1_opcode_rd; +wire [4:0] alu2_opcode_rd; +wire [4:0] alu3_opcode_rd; + + + + + +/* +// For Xilinx FPGAs +DPROM_8Kx128 code_rom + ( + .clka (CORE_CLK), + .addra (new_pc[14:2]), + .douta (program_rom_data[127:0]), + + .clkb (CORE_CLK), + .addrb (new_pc_plus1[14:2]), + .doutb (program_rom_data[255:128]) + ); + + */ + + DPROM_8Kx128 code_rom ( + .address_a (new_pc[14:2]), // input, width = 13, ram_input.address_a + .address_b (new_pc_plus1[14:2]), // input, width = 13, .address_b + .clock (CORE_CLK), // input, width = 1, .clock + .q_a (program_rom_data[127:0]), // output, width = 128, ram_output.q_a + .q_b (program_rom_data[255:128]) // output, width = 128, .q_b + ); + + + + + + +assign new_pc_plus1 = new_pc + 3'h4; + + +assign alu0_pc = new_pc; +assign alu1_pc = new_pc + 1; +assign alu2_pc = new_pc + 2; +assign alu3_pc = new_pc + 3; + + + +assign alu0_opcode = (new_pc[1:0]==2'h0) ? program_rom_data[31:0] : + (new_pc[1:0]==2'h1) ? program_rom_data[63:32] : + (new_pc[1:0]==2'h2) ? program_rom_data[95:64] : + program_rom_data[127:96] ; + + +assign alu1_opcode = (new_pc[1:0]==2'h0) ? program_rom_data[63:32] : + (new_pc[1:0]==2'h1) ? program_rom_data[95:64] : + (new_pc[1:0]==2'h2) ? program_rom_data[127:96] : + program_rom_data[159:128] ; + +assign alu2_opcode = (new_pc[1:0]==2'h0) ? program_rom_data[95:64] : + (new_pc[1:0]==2'h1) ? program_rom_data[127:96] : + (new_pc[1:0]==2'h2) ? program_rom_data[159:128] : + program_rom_data[191:160] ; + +assign alu3_opcode = (new_pc[1:0]==2'h0) ? program_rom_data[127:96] : + (new_pc[1:0]==2'h1) ? program_rom_data[159:128] : + (new_pc[1:0]==2'h2) ? program_rom_data[191:160] : + program_rom_data[223:192] ; + + + +// Register decodes from the opcode +// +assign alu0_opcode_rs1 = alu0_opcode[19:15]; +assign alu0_opcode_rs2 = alu0_opcode[24:20]; +assign alu0_opcode_rd = alu0_opcode[11:7]; + +assign alu1_opcode_rs1 = alu1_opcode[19:15]; +assign alu1_opcode_rs2 = alu1_opcode[24:20]; +assign alu1_opcode_rd = alu1_opcode[11:7]; + +assign alu2_opcode_rs1 = alu2_opcode[19:15]; +assign alu2_opcode_rs2 = alu2_opcode[24:20]; +assign alu2_opcode_rd = alu2_opcode[11:7]; + +assign alu3_opcode_rs1 = alu3_opcode[19:15]; +assign alu3_opcode_rs2 = alu3_opcode[24:20]; +assign alu3_opcode_rd = alu3_opcode[11:7]; + + +assign LOAD_STORE_ADDRESS = alu0_load_store_address; +assign STORE_DATA = alu0_store_data; +assign alu0_load_data = LOAD_DATA; +assign LOAD_REQ = alu0_load_req; +assign STORE_REQ = alu0_store_req; + + + +// Register read-port routing +// If the previous alu has modified a register that this alu needs, then use this value, +// otherwise take the register from the main register-file. +// + +assign alu0_rs1 = (alu0_opcode_rs1 == 5'h00) ? 32'h0 : + (alu0_opcode_rs1 == 5'h01) ? register_1 : + (alu0_opcode_rs1 == 5'h02) ? register_2 : + (alu0_opcode_rs1 == 5'h03) ? register_3 : + register_4 ; + + + +assign alu0_rs2 = (alu0_opcode_rs2 == 5'h00) ? 32'h0 : + (alu0_opcode_rs2 == 5'h01) ? register_1 : + (alu0_opcode_rs2 == 5'h02) ? register_2 : + (alu0_opcode_rs2 == 5'h03) ? register_3 : + register_4 ; + + +//------------------------------------------------------------------------ + + +assign alu1_rs1 = ( alu0_rd[32]==1'b1 && (alu1_opcode_rs1==alu0_opcode_rd) ) ? alu0_rd[31:0] : + (alu1_opcode_rs1 == 5'h00) ? 32'h0 : + (alu1_opcode_rs1 == 5'h01) ? register_1 : + (alu1_opcode_rs1 == 5'h02) ? register_2 : + (alu1_opcode_rs1 == 5'h03) ? register_3 : + register_4 ; + + + +assign alu1_rs2 = ( alu0_rd[32]==1'b1 && (alu1_opcode_rs2==alu0_opcode_rd) ) ? alu0_rd[31:0] : + (alu1_opcode_rs2 == 5'h00) ? 32'h0 : + (alu1_opcode_rs2 == 5'h01) ? register_1 : + (alu1_opcode_rs2 == 5'h02) ? register_2 : + (alu1_opcode_rs2 == 5'h03) ? register_3 : + register_4 ; + +//------------------------------------------------------------------------ + + +assign alu2_rs1 = ( alu1_rd[32]==1'b1 && (alu2_opcode_rs1==alu1_opcode_rd) ) ? alu1_rd[31:0] : + ( alu0_rd[32]==1'b1 && (alu2_opcode_rs1==alu0_opcode_rd) ) ? alu0_rd[31:0] : + (alu2_opcode_rs1 == 5'h00) ? 32'h0 : + (alu2_opcode_rs1 == 5'h01) ? register_1 : + (alu2_opcode_rs1 == 5'h02) ? register_2 : + (alu2_opcode_rs1 == 5'h03) ? register_3 : + register_4 ; + + + + +assign alu2_rs2 = ( alu1_rd[32]==1'b1 && (alu2_opcode_rs2==alu1_opcode_rd) ) ? alu1_rd[31:0] : + ( alu0_rd[32]==1'b1 && (alu2_opcode_rs2==alu0_opcode_rd) ) ? alu0_rd[31:0] : + (alu2_opcode_rs2 == 5'h00) ? 32'h0 : + (alu2_opcode_rs2 == 5'h01) ? register_1 : + (alu2_opcode_rs2 == 5'h02) ? register_2 : + (alu2_opcode_rs2 == 5'h03) ? register_3 : + register_4 ; + +//------------------------------------------------------------------------ + + +assign alu3_rs1 = ( alu2_rd[32]==1'b1 && (alu3_opcode_rs1==alu2_opcode_rd) ) ? alu2_rd[31:0] : + ( alu1_rd[32]==1'b1 && (alu3_opcode_rs1==alu1_opcode_rd) ) ? alu1_rd[31:0] : + ( alu0_rd[32]==1'b1 && (alu3_opcode_rs1==alu0_opcode_rd) ) ? alu0_rd[31:0] : + (alu3_opcode_rs1 == 5'h00) ? 32'h0 : + (alu3_opcode_rs1 == 5'h01) ? register_1 : + (alu3_opcode_rs1 == 5'h02) ? register_2 : + (alu3_opcode_rs1 == 5'h03) ? register_3 : + register_4 ; + + + + +assign alu3_rs2 = ( alu2_rd[32]==1'b1 && (alu3_opcode_rs2==alu2_opcode_rd) ) ? alu2_rd[31:0] : + ( alu1_rd[32]==1'b1 && (alu3_opcode_rs2==alu1_opcode_rd) ) ? alu1_rd[31:0] : + ( alu0_rd[32]==1'b1 && (alu3_opcode_rs2==alu0_opcode_rd) ) ? alu0_rd[31:0] : + (alu3_opcode_rs2 == 5'h00) ? 32'h0 : + (alu3_opcode_rs2 == 5'h01) ? register_1 : + (alu3_opcode_rs2 == 5'h02) ? register_2 : + (alu3_opcode_rs2 == 5'h03) ? register_3 : + register_4 ; + + + + +//------------------------------------------------------------------------------------------ +// +// Register writebacks +// +//------------------------------------------------------------------------------------------ + +always @(posedge CORE_CLK or negedge RST_n) +begin : REGISTER_WRITEBACKS + + if (RST_n==1'b0) + begin + alu0_load_req_d <= 'h0; + new_pc <= 32'hFFFF_FFFC; + end + +else + begin + + if ( (loadstore_stall == 4'b0000 && (alu0_load_req==1'b1 || alu0_store_req==1'b1) ) || + (loadstore_stall == 4'b0000 && (alu1_load_req==1'b1 || alu1_store_req==1'b1) ) || + (loadstore_stall == 4'b0000 && (alu2_load_req==1'b1 || alu2_store_req==1'b1) ) || + (loadstore_stall == 4'b0000 && (alu3_load_req==1'b1 || alu3_store_req==1'b1) ) ) + begin + loadstore_stall <= 4'b1111; // new_pc_stall for three cycles + end + else + begin + loadstore_stall <= { 1'b0 , loadstore_stall[3:1] }; + end + + + + // Writeback register file + // Only write back registers that have been updated. + // Block register updates if a previous alu is taking a branch + // + if (new_pc_stall==1'b0 && ((loadstore_stall==4'b0001 || alu0_newpc[32]==1'b0) && alu1_newpc[32]==1'b0 && alu2_newpc[32]==1'b0) && alu3_rd[32]==1'b1) + begin + case (alu3_opcode_rd) + 5'h01 : register_1 <= alu3_rd[31:0]; + 5'h02 : register_2 <= alu3_rd[31:0]; + 5'h03 : register_3 <= alu3_rd[31:0]; + 5'h04 : register_4 <= alu3_rd[31:0]; + default: ; + endcase + end + + else if (new_pc_stall==1'b0 && ((loadstore_stall==4'b0001 || alu0_newpc[32]==1'b0) && alu1_newpc[32]==1'b0) && alu2_rd[32]==1'b1) + begin + case (alu2_opcode_rd) + 5'h01 : register_1 <= alu2_rd[31:0]; + 5'h02 : register_2 <= alu2_rd[31:0]; + 5'h03 : register_3 <= alu2_rd[31:0]; + 5'h04 : register_4 <= alu2_rd[31:0]; + default: ; + endcase + end + + else if (new_pc_stall==1'b0 && (loadstore_stall==4'b0001 || alu0_newpc[32]==1'b0) && alu1_rd[32]==1'b1) + begin + case (alu1_opcode_rd) + 5'h01 : register_1 <= alu1_rd[31:0]; + 5'h02 : register_2 <= alu1_rd[31:0]; + 5'h03 : register_3 <= alu1_rd[31:0]; + 5'h04 : register_4 <= alu1_rd[31:0]; + default: ; + endcase + end + + else if (new_pc_stall==1'b0 && alu0_rd[32]==1'b1) + begin + case (alu0_opcode_rd) + 5'h01 : register_1 <= alu0_rd[31:0]; + 5'h02 : register_2 <= alu0_rd[31:0]; + 5'h03 : register_3 <= alu0_rd[31:0]; + 5'h04 : register_4 <= alu0_rd[31:0]; + default: ; + endcase + end + + +//------------------------------------------------------------------------ +// +// Update the PC for branches/jumps +// Otherwise increment the PC by four +// +//------------------------------------------------------------------------ + + if ((new_pc_stall==1'b0 && alu0_newpc[32]==1'b1) && loadstore_stall!=4'b0001) + begin + new_pc_stall <= 1'b1; + new_pc <= alu0_newpc[31:0]; + end + + else if (new_pc_stall==1'b0 && alu1_newpc[32]==1'b1) + begin + new_pc_stall <= 1'b1; + new_pc <= alu1_newpc[31:0]; + end + + else if (new_pc_stall==1'b0 && alu2_newpc[32]==1'b1) + begin + new_pc_stall <= 1'b1; + new_pc <= alu2_newpc[31:0]; + end + + else if (new_pc_stall==1'b0 && alu3_newpc[32]==1'b1) + begin + new_pc_stall <= 1'b1; + new_pc <= alu3_newpc[31:0]; + end + + else + begin + new_pc <= new_pc + 32'h0000_0004; + new_pc_stall <= 1'b0; + end + + end +end // Register writebacks + + + +//------------------------------------------------------------------------ +// +// MCLR5 ALU cores +// +//------------------------------------------------------------------------ + +MCLR5_alu mclr5_alu0 + ( + .OPCODE (alu0_opcode), + .PC (alu0_pc), + .RS1 (alu0_rs1), + .RS2 (alu0_rs2), + .RD (alu0_rd), + .NEWPC (alu0_newpc), + .LOAD_DATA (alu0_load_data), + .STORE_DATA (alu0_store_data), + .LOAD_REQ (alu0_load_req), + .STORE_REQ (alu0_store_req), + .LOAD_STORE_ADDRESS (alu0_load_store_address) + ); + + +MCLR5_alu mclr5_alu1 + ( + .OPCODE (alu1_opcode), + .PC (alu1_pc), + .RS1 (alu1_rs1), + .RS2 (alu1_rs2), + .RD (alu1_rd), + .NEWPC (alu1_newpc), + .LOAD_DATA (), + .STORE_DATA (), + .LOAD_REQ (alu1_load_req), + .STORE_REQ (alu1_store_req), + .LOAD_STORE_ADDRESS () + ); + + +MCLR5_alu mclr5_alu2 + ( + .OPCODE (alu2_opcode), + .PC (alu2_pc), + .RS1 (alu2_rs1), + .RS2 (alu2_rs2), + .RD (alu2_rd), + .NEWPC (alu2_newpc), + .LOAD_DATA (), + .STORE_DATA (), + .LOAD_REQ (alu2_load_req), + .STORE_REQ (alu2_store_req), + .LOAD_STORE_ADDRESS () + ); + + + +MCLR5_alu mclr5_alu3 + ( + .OPCODE (alu3_opcode), + .PC (alu3_pc), + .RS1 (alu3_rs1), + .RS2 (alu3_rs2), + .RD (alu3_rd), + .NEWPC (alu3_newpc), + .LOAD_DATA (), + .STORE_DATA (), + .LOAD_REQ (alu3_load_req), + .STORE_REQ (alu3_store_req), + .LOAD_STORE_ADDRESS () + ); + + + +endmodule // MCLR5.v diff --git a/MCLR5/Core/MCLR5_alu.v b/MCLR5/Core/MCLR5_alu.v new file mode 100644 index 0000000..cbf8c1d --- /dev/null +++ b/MCLR5/Core/MCLR5_alu.v @@ -0,0 +1,206 @@ +// +// +// File Name : MCLR5_alu.v +// Author : Ted Fried, MicroCore Labs +// Creation : 4/21/2018 +// Code Type : Synthesizable +// +//------------------------------------------------------------------------ +// +// Description: +// ============ +// +// Quad-issue Superscalar Risc V Processor ALU core +// +//------------------------------------------------------------------------ +// +// Copyright (C) 2018 by Ted Fried info@MicroCoreLabs.com +// +// Permission to use, copy, modify, and distribute this software and its +// documentation for any purpose and without fee is hereby granted, provided +// that the above copyright notice appear in all copies and that both that +// copyright notice and this permission notice appear in supporting documentation. +// This software is provided "as is" without express or implied warranty. +// +//------------------------------------------------------------------------ +// +// Modification History: +// ===================== +// +// Revision 1 4/21/18 +// Initial revision +// +// +//------------------------------------------------------------------------ + + +module MCLR5_alu + ( + + input [31:0] OPCODE, + input [31:0] PC, + + input [31:0] RS1, + input [31:0] RS2, + output reg [32:0] RD, + output reg [32:0] NEWPC, + input [31:0] LOAD_DATA, + output [31:0] STORE_DATA, + output reg LOAD_REQ, + output reg STORE_REQ, + output reg [31:0] LOAD_STORE_ADDRESS + + ); + +//------------------------------------------------------------------------ + + +// Internal Signals + +wire beq_taken; +wire bne_taken; +wire blt_taken; +wire bge_taken; +wire bltu_taken; +wire bgeu_taken; +wire slti_true; +wire sltiu_true; +wire slt_true; +wire sltu_true; +wire [31:0] i_immediate; +wire [31:0] s_immediate; +wire [31:0] b_immediate; +wire [31:0] u_immediate; +wire [31:0] j_immediate; +wire [31:0] slli_result; +wire [31:0] srli_result; +wire [31:0] srai_result; +wire [31:0] sll_result; +wire [31:0] srl_result; +wire [31:0] sra_result; +wire [31:0] pc_adjusted; + + + +//------------------------------------------------------------------------ +// +// RISC V ALU +// +//------------------------------------------------------------------------ + +assign i_immediate = { {21{OPCODE[31]}} , OPCODE[30:25] , OPCODE[24:21] , OPCODE[20] } ; +assign s_immediate = { {21{OPCODE[31]}} , OPCODE[30:25] , OPCODE[11:8] , OPCODE[7] } ; +assign b_immediate = { {20{OPCODE[31]}} , OPCODE[7] , OPCODE[30:25] , OPCODE[11:8] , 1'b0 } ; +assign u_immediate = { OPCODE[31] , OPCODE[30:20] , OPCODE[19:12] , 12'b0 } ; +assign j_immediate = { {12{OPCODE[31]}} , OPCODE[19:12] , OPCODE[20] , OPCODE[30:25] , OPCODE[24:21] , 1'b0 } ; + + +assign slti_true = ($signed(RS1) < $signed(i_immediate)) ? 32'h0000_0001 : 32'h0000_0000; +assign sltiu_true = (RS1 < i_immediate) ? 32'h0000_0001 : 32'h0000_0000; +assign slt_true = ($signed(RS1) < $signed(RS2)) ? 32'h0000_0001 : 32'h0000_0000; +assign sltu_true = (RS1 < RS2) ? 32'h0000_0001 : 32'h0000_0000; + + +assign slli_result = 32'h0123_4567; +assign srli_result = 32'h0123_4567; +assign srai_result = 32'h0123_4567; +assign sll_result = 32'h0123_4567; +assign srl_result = 32'h0123_4567; +assign sra_result = 32'h0123_4567; + +assign beq_taken = (RS1 == RS1) ? 1'b1 : 1'b0; +assign bne_taken = (RS1 != RS1) ? 1'b1 : 1'b0; +assign blt_taken = ($signed(RS1) < $signed(RS2)) ? 1'b1 : 1'b0; +assign bge_taken = ($signed(RS1) >= $signed(RS2)) ? 1'b1 : 1'b0; +assign bltu_taken = (RS1 < RS2) ? 1'b1 : 1'b0; +assign bgeu_taken = (RS1 >= RS2) ? 1'b1 : 1'b0; + + +assign pc_adjusted = PC - 4'h4; // Subtracts pipelined PC to the true PC + +assign STORE_DATA = RS2; + + +always @* begin + casex (OPCODE) + + 32'b???????_?????_?????_???_?????_01101?? : RD = { 1'b1 , {u_immediate[31:12] , 12'b0 } } ; // LUI + 32'b???????_?????_?????_???_?????_00101?? : RD = { 1'b1 , PC + {u_immediate[31:12] , 12'b0 } } ; // AUIPC + 32'b???????_?????_?????_???_?????_11011?? : RD = { 1'b1 , PC + 3'h4 } ; // JAL + 32'b???????_?????_?????_???_?????_11001?? : RD = { 1'b1 , PC + 3'h4 } ; // JALR + 32'b???????_?????_?????_000_?????_00100?? : RD = { 1'b1 , RS1 + i_immediate } ; // ADDI + 32'b???????_?????_?????_010_?????_00100?? : RD = { 1'b1 , slti_true } ; // SLTI + 32'b???????_?????_?????_011_?????_00100?? : RD = { 1'b1 , sltiu_true } ; // SLTIU + 32'b???????_?????_?????_100_?????_00100?? : RD = { 1'b1 , RS1 ^ i_immediate } ; // XORI + 32'b???????_?????_?????_110_?????_00100?? : RD = { 1'b1 , RS1 | i_immediate } ; // ORI + 32'b???????_?????_?????_111_?????_00100?? : RD = { 1'b1 , RS1 & i_immediate } ; // ANDI + 32'b???????_?????_?????_001_?????_00100?? : RD = { 1'b1 , slli_result } ; // SLLI + 32'b?0?????_?????_?????_101_?????_00100?? : RD = { 1'b1 , srli_result } ; // SRLI + 32'b?1?????_?????_?????_101_?????_00100?? : RD = { 1'b1 , srai_result } ; // SRAI + 32'b?0?????_?????_?????_000_?????_01100?? : RD = { 1'b1 , RS1 + RS2 } ; // ADD + 32'b?1?????_?????_?????_000_?????_01100?? : RD = { 1'b1 , RS1 - RS2 } ; // SUB + 32'b???????_?????_?????_001_?????_01100?? : RD = { 1'b1 , sll_result } ; // SLL + 32'b???????_?????_?????_010_?????_01100?? : RD = { 1'b1 , slt_true } ; // SLT + 32'b???????_?????_?????_011_?????_01100?? : RD = { 1'b1 , sltu_true } ; // SLTU + 32'b???????_?????_?????_100_?????_01100?? : RD = { 1'b1 , RS1 ^ RS2 } ; // XOR + 32'b?0?????_?????_?????_101_?????_01100?? : RD = { 1'b1 , srl_result } ; // SRL + 32'b?1?????_?????_?????_101_?????_01100?? : RD = { 1'b1 , sra_result } ; // SRA + 32'b???????_?????_?????_110_?????_01100?? : RD = { 1'b1 , RS1 | RS2 } ; // OR + 32'b???????_?????_?????_111_?????_01100?? : RD = { 1'b1 , RS1 & RS2 } ; // AND + + 32'b???????_?????_?????_010_?????_00000?? : RD = { 1'b1 , LOAD_DATA } ; // LW + default : RD = { 1'b0 , 32'h0000_0000 } ; + + endcase + + + casex (OPCODE) + + 32'b???????_?????_?????_010_?????_00000?? : LOAD_STORE_ADDRESS = RS1 + i_immediate ; // Loads + 32'b???????_?????_?????_010_?????_01000?? : LOAD_STORE_ADDRESS = RS1 + s_immediate ; // Stores + default : ; + endcase + + + casex (OPCODE) + + 32'b???????_?????_?????_010_?????_00000?? : LOAD_REQ = 1'b1 ; + 32'b???????_?????_?????_010_?????_01000?? : STORE_REQ = 1'b1 ; + default : begin LOAD_REQ = 1'b0 ; STORE_REQ = 1'b0; end + + endcase + + + casex (OPCODE) + + 32'b???????_?????_?????_???_?????_11011?? : NEWPC = { 1'b1 , pc_adjusted + j_immediate } ; // JAL + 32'b???????_?????_?????_000_?????_11001?? : NEWPC = { 1'b1 , ( RS1 + i_immediate) & 32'hFFFF_FFFE } ; // JALR + + 32'b???????_?????_?????_010_?????_00000?? : NEWPC = { 1'b1 , pc_adjusted } ; // LW + 32'b???????_?????_?????_010_?????_01000?? : NEWPC = { 1'b1 , pc_adjusted } ; // SW + + //32'hBBBBBBBB : NEWPC = { 1'b1 , pc_adjusted + 4'h6 } ; // Temp jump code !!!! + + 32'b???????_?????_?????_000_?????_11000?? : if (beq_taken == 1'b1) NEWPC = { 1'b1 , pc_adjusted + b_immediate } ; // BEQ + 32'b???????_?????_?????_001_?????_11000?? : if (bne_taken == 1'b1) NEWPC = { 1'b1 , pc_adjusted + b_immediate } ; // BNE + 32'b???????_?????_?????_100_?????_11000?? : if (blt_taken == 1'b1) NEWPC = { 1'b1 , pc_adjusted + b_immediate } ; // BLT + 32'b???????_?????_?????_101_?????_11000?? : if (bge_taken == 1'b1) NEWPC = { 1'b1 , pc_adjusted + b_immediate } ; // BGE + 32'b???????_?????_?????_110_?????_11000?? : if (bltu_taken == 1'b1) NEWPC = { 1'b1 , pc_adjusted + b_immediate } ; // BLTU + 32'b???????_?????_?????_111_?????_11000?? : if (bgeu_taken == 1'b1) NEWPC = { 1'b1 , pc_adjusted + b_immediate } ; // BGEU + + + default : NEWPC = { 1'b0 , 32'h0000_0000 } ; // No Branch Taken + + endcase + + + + +end + + + + + + +endmodule // MCLR5_alu.v diff --git a/MCLR5/Movies_Pictures/Quadissue1.JPG b/MCLR5/Movies_Pictures/Quadissue1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..0edac9079425f9ea3cc6b2e338ebddf4c88eefe7 GIT binary patch literal 63761 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