├── .editorconfig ├── .gitignore ├── README.md ├── resources └── isa.jpg ├── sources ├── modules │ ├── ALU.v │ ├── Alu_Control.v │ ├── BufferRegister.v │ ├── Control_Unit.v │ ├── InstructionMemoryModule.v │ ├── MainMemory.v │ ├── ProgramCounter.v │ ├── Register_File.v │ ├── cpu.v │ ├── mux2x1.v │ ├── regmux2x1.v │ └── signExtension.v └── testbench │ ├── ALU_tb.v │ ├── Register_File_tb.v │ └── cpu_tb.v └── utils ├── ISA.md ├── assembler.py ├── test_code └── test_code.bin /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | [*] 3 | 4 | end_of_line = lf 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | 8 | [*.v] 9 | charset = utf-8 10 | indent_style = space 11 | indent_size = 4 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## RISC Processor 2 | 3 | - A 32-bit RISC processor to with a self designed Instruction Set Architecture. 4 | 5 | ### ISA 6 | 7 | ![ISA](./resources/isa.jpg) 8 | -------------------------------------------------------------------------------- /resources/isa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pandeykartikey/RISCY-Processor/c476822b8c9853060e863092f10df8f04c620bff/resources/isa.jpg -------------------------------------------------------------------------------- /sources/modules/ALU.v: -------------------------------------------------------------------------------- 1 | `timescale 1ns / 1ps 2 | 3 | module ALU(clk,a, b, alufn, otp, zero, overflow); 4 | input wire clk; 5 | input wire [31:0] a; 6 | input wire [31:0] b; 7 | input wire [5:0] alufn; // choosing 6 bit op code 8 | output reg [31:0] otp; 9 | output reg zero; // set if the output of the alu is 0 10 | output reg overflow; 11 | wire [31:0] tempAuRes; 12 | wire [31:0] tempLuRes; 13 | wire [31:0] tempSuRes; 14 | wire tempAuZero,tempAuOverflow; 15 | wire tempLuZero,tempLuOverflow; 16 | wire tempSuZero,tempSuOverflow; 17 | 18 | 19 | // ArithmeticUnit arith_inst_0(.a(a),.b(b),.alufn(alufn[1:0]),.otp(tempAuRes),.zero(tempAuZero),.overflow(tempAuOverflow)); 20 | // LogicalUnit logic_inst_0(.a(a),.b(b),.alufn(alufn[1:0]),.otp(tempLuRes),.zero(tempLuZero),.overflow(tempLuOverflow)); 21 | // ShiftUnit shift_inst_0(.a(a),.b(b),.alufn(alufn[1:0]),.otp(tempSuRes),.zero(tempSuZero),.overflow(tempSuOverflow)); 22 | 23 | always @(a or b or alufn) 24 | begin 25 | // $display("a%h - b%h",a,b); 26 | // $display("tempAuRes- %h",tempAuRes); 27 | casex(alufn) 28 | 6'b0000xx: begin 29 | if(alufn[1:0] == 2'b00) 30 | begin //ADD 31 | otp = a + b; 32 | zero = (otp==0)?1:0; 33 | if ((a >= 0 && b >= 0 && otp < 0) || (a < 0 && b < 0 && otp >= 0)) 34 | overflow = 1; 35 | else 36 | overflow = 0; 37 | $display("a%h - b%h - otp %h",a,b,otp); 38 | end 39 | else if(alufn[1:0] == 2'b01) //SUB 40 | begin 41 | otp = a-b; 42 | zero = (otp==0)?1:0; 43 | if ((a >= 0 && b < 0 && otp < 0) || (a < 0 && b >= 0 && otp > 0)) 44 | overflow = 1; 45 | else 46 | overflow = 0; 47 | end 48 | else if (alufn[1:0] == 2'b10) //MUL 49 | begin 50 | otp = a*b; 51 | zero = (otp==0)?1:0; 52 | overflow = 0; 53 | end 54 | end 55 | 6'b0001xx: begin 56 | case (alufn[1:0]) 57 | 2'b00: //AND 58 | begin 59 | otp = a & b; 60 | overflow = 0; 61 | zero = (otp==0)?1:0; 62 | end 63 | 2'b01: //OR 64 | begin 65 | otp = a | b; 66 | overflow = 0; 67 | zero = (otp==0)?1:0; 68 | end 69 | 2'b10: //XOR 70 | begin 71 | otp = a ^ b; 72 | overflow = 0; 73 | zero = (otp==0)?1:0; 74 | end 75 | endcase 76 | end 77 | 6'b0010xx: begin 78 | case(alufn[1:0]) 79 | 2'b00: //SHIFTLEFT 80 | begin 81 | otp = a<>b; 88 | zero = (otp == 0)?1:0; 89 | overflow = 0; 90 | end 91 | 2'b11: //slt 92 | begin 93 | otp = (a= 0 && b >= 0 && otp < 0) || (a < 0 && b < 0 && otp >= 0)) 125 | overflow = 1; 126 | else 127 | overflow = 0; 128 | $display("a%h - b%h - otp %h",a,b,otp); 129 | end 130 | else if(alufn == 2'b01) //SUB 131 | begin 132 | otp = a-b; 133 | zero = (otp==0)?1:0; 134 | if ((a >= 0 && b < 0 && otp < 0) || (a < 0 && b >= 0 && otp > 0)) 135 | overflow = 1; 136 | else 137 | overflow = 0; 138 | end 139 | else if (alufn == 2'b10) //MUL 140 | begin 141 | otp = a*b; 142 | zero = (otp==0)?1:0; 143 | overflow = 0; 144 | end 145 | end 146 | endmodule 147 | 148 | module LogicalUnit(a,b,otp,alufn,zero,overflow); 149 | input wire [31:0] a; 150 | input wire [31:0] b; 151 | input wire [1:0] alufn; 152 | output reg zero; 153 | output reg overflow; 154 | output reg [31:0] otp; 155 | 156 | always @(a,b,alufn) 157 | begin 158 | case (alufn) 159 | 2'b00: //AND 160 | begin 161 | otp = a & b; 162 | overflow = 0; 163 | zero = (otp==0)?1:0; 164 | end 165 | 2'b01: //OR 166 | begin 167 | otp = a | b; 168 | overflow = 0; 169 | zero = (otp==0)?1:0; 170 | end 171 | 2'b10: //XOR 172 | begin 173 | otp = a ^ b; 174 | overflow = 0; 175 | zero = (otp==0)?1:0; 176 | end 177 | endcase 178 | end 179 | endmodule 180 | 181 | module ShiftUnit(a,b,otp,alufn,zero,overflow); 182 | input wire [31:0] a; 183 | input wire [31:0] b; 184 | input wire [1:0] alufn; 185 | output reg zero; 186 | output reg overflow; 187 | output reg [31:0] otp; 188 | 189 | always @(a,b,alufn) 190 | begin 191 | case(alufn) 192 | 2'b00: //SHIFTLEFT 193 | begin 194 | otp = a<>b; 201 | zero = (otp == 0)?1:0; 202 | overflow = 0; 203 | end 204 | 2'b11: //slt 205 | begin 206 | otp = (a