Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
0f4130a
Added imem.sv
pharquissandas Nov 14, 2025
ce442c5
Added PC.sv
minimish1 Nov 14, 2025
2cf432a
Merge branch 'main' of https://github.com/pharquissandas/RISC-V-Team19
minimish1 Nov 14, 2025
46f87e4
Added control.sv
pharquissandas Nov 14, 2025
86d5abf
Merge branch 'main' of https://github.com/pharquissandas/RISC-V-Team19
pharquissandas Nov 14, 2025
cd24c26
Added signext.sv
pharquissandas Nov 14, 2025
c4c799f
Added PC.sv
minimish1 Nov 14, 2025
1f45afc
Added PC.sv
minimish1 Nov 14, 2025
a2ee2cb
Ignore macOS .DS_Store files
ojas-parikh Nov 19, 2025
369768a
alu/regfileetc
ojas-parikh Nov 19, 2025
fb7bc78
Verify Fixed
Sicovo Nov 20, 2025
afc4b80
data_unit fixed
ojas-parikh Nov 20, 2025
f05d78b
Merge branch 'main' of https://github.com/pharquissandas/RISC-V-Team19
ojas-parikh Nov 20, 2025
f66e534
Added top.sv
minimish1 Nov 20, 2025
ce76eb7
reg_alu_top.sv
minimish1 Nov 20, 2025
fe422cd
Fixed all modules
minimish1 Nov 20, 2025
130cba1
Warnings fixed
minimish1 Nov 21, 2025
65c432e
Added mian decoder
minimish1 Nov 21, 2025
6c4948c
Fixed reg_file.sv
minimish1 Nov 21, 2025
feb764c
F1 light implementation task 4 added to repo
pharquissandas Nov 21, 2025
5bbebbf
Comments added & reg alu top removed
pharquissandas Nov 21, 2025
cae624b
F1 starting light
Sicovo Nov 21, 2025
3f50982
Added new testbench folder to repo with f1.s file
pharquissandas Nov 21, 2025
f501737
Added new testbench folder
pharquissandas Nov 21, 2025
2ac9bc4
Added f1.s
pharquissandas Nov 21, 2025
61362c8
Fixed imem.sv
minimish1 Nov 23, 2025
e7efb7e
Merge branch 'main' of https://github.com/pharquissandas/RISC-V-Team19
minimish1 Nov 23, 2025
b5735ec
Added opcode instructions and updated data_unit with data_mem
minimish1 Nov 23, 2025
5c671e0
Fully explained f1.s with comments
pharquissandas Nov 23, 2025
14ce198
ALU Decoder
Sicovo Nov 24, 2025
a0c766b
Unify ALUOp naming
Sicovo Nov 24, 2025
039bd08
ALU Updated (3bits ALUControl)
Sicovo Nov 24, 2025
1f2e8b2
Added top.sv
pharquissandas Nov 24, 2025
d3b8e18
Fixed control.sv
pharquissandas Nov 24, 2025
7af5d4d
Fixed signext, top, control, decoders
pharquissandas Nov 24, 2025
3af4ed2
Changed ALUControl to 4 bits
pharquissandas Nov 25, 2025
f306c20
Added alu instructions
minimish1 Nov 25, 2025
4b2c2ab
Changed ImmSrc to 3 bits
minimish1 Nov 25, 2025
e56ef34
Added most instructions
minimish1 Nov 25, 2025
ccad769
Added final instructions
minimish1 Nov 25, 2025
d8764d0
I/O Updated
Sicovo Nov 26, 2025
42b217f
Full ISA Supported
Sicovo Nov 26, 2025
6859162
ALUOp = 10 for I-type/R-type for better implementation in pipeline
Sicovo Nov 26, 2025
682eec0
Control path for all ISA
Sicovo Nov 27, 2025
54fd695
Single Cycle RV32I Processor
Sicovo Nov 27, 2025
4dcc04c
errors fixed
ojas-parikh Nov 27, 2025
9eb89d0
contol_path.sv deleted
ojas-parikh Nov 27, 2025
8c91968
testbench nearly done
ojas-parikh Nov 28, 2025
75c2262
fixing pcsrc
ojas-parikh Nov 28, 2025
4e49e50
fixing branch
ojas-parikh Nov 28, 2025
595f224
fixes
ojas-parikh Nov 28, 2025
805cad5
fixes
ojas-parikh Nov 28, 2025
3c0b865
fixes
ojas-parikh Nov 28, 2025
7f32a20
fixes
ojas-parikh Nov 28, 2025
a976adc
fixes
ojas-parikh Nov 28, 2025
1df7777
data_unit deleted
ojas-parikh Nov 28, 2025
f6a1535
Zero
Sicovo Nov 28, 2025
c4ee6a9
AddressingCtrl
Sicovo Nov 28, 2025
5231813
Trigger Removerd
Sicovo Nov 28, 2025
8c0ad37
sig_ext
Sicovo Nov 28, 2025
b405fea
rtl_pipelined
Sicovo Nov 28, 2025
c52e20c
sign_ext
Sicovo Nov 28, 2025
40902a6
single_cycle_design_folder
ojas-parikh Nov 28, 2025
0a5148a
removed folder
ojas-parikh Nov 28, 2025
53432e9
trigger removed
ojas-parikh Nov 28, 2025
d5ea9d5
Added all RV32I Instruction tests
pharquissandas Nov 28, 2025
386d2bb
Merge branch 'main' of https://github.com/pharquissandas/RISC-V-Team19
pharquissandas Nov 28, 2025
7d33dd6
Completed the verify.cpp and testbench for each instruction
pharquissandas Nov 28, 2025
0273080
Added fetch and decode pipeline registers
minimish1 Nov 28, 2025
ca6c35f
doit/assemble
Sicovo Nov 28, 2025
a6b4e07
trying to fix testing for mac
ojas-parikh Nov 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.DS_Store
repo/.DS_Store
41 changes: 41 additions & 0 deletions repo/rtl/alu.sv
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// 0000 = ADD
// 0001 = SUB
// 0010 = AND
// 0011 = OR
// 0100 = XOR
// 0101 = SLL
// 0110 = SRL
// 0111 = SRA
// 1000 = SLT (signed)
// 1001 = SLTU (unsigned)
// 1111 = LUI operation

module alu (
input logic [31:0] SrcA,
input logic [31:0] SrcB,
input logic [3:0] ALUControl,
output logic [31:0] ALUResult,
output logic Zero
);

always_comb begin
case (ALUControl)
4'b0000: ALUResult = SrcA + SrcB; // add
4'b0001: ALUResult = SrcA - SrcB; // sub
4'b0010: ALUResult = SrcA & SrcB; // and
4'b0011: ALUResult = SrcA | SrcB; // or
4'b0100: ALUResult = SrcA ^ SrcB; // xor

4'b0101: ALUResult = SrcA << SrcB[4:0]; // sll
4'b0110: ALUResult = SrcA >> SrcB[4:0]; // srl
4'b0111: ALUResult = $signed(SrcA) >>> SrcB[4:0]; // sra
4'b1000: ALUResult = ($signed(SrcA) < $signed(SrcB)) ? 32'b1 : 32'b0; //slt
4'b1001: ALUResult = (SrcA < SrcB) ? 32'b1 : 32'b0; //sltu
4'b1111: ALUResult = SrcB; // LUI operation (Load Upper Immediate)

default: ALUResult = 32'b0;
endcase

Zero = (ALUResult == 32'd0);
end
endmodule
187 changes: 187 additions & 0 deletions repo/rtl/control.sv
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
module control(
input logic [6:0] opcode,
input logic [2:0] funct3,
input logic [6:0] funct7,

output logic RegWrite, // enable write to register
output logic [3:0] ALUControl, // control operation in ALU
output logic ALUSrcA, // choose PC (1) or register (0) for ALU operand A
output logic ALUSrcB, // choose immediate (1) or register (0) operand
output logic MemWrite, // enable write into the data memory
// output logic [1:0] PCSrc, // control the source for the next PC value (00 = PC+4, 01 = PC + imm(branch/jal), 10 = ALUResult (jalr))
output logic [1:0] ResultSrc, // control the source of data to write back to register file (00 = ALU, 01 = Memory, 10 = PC+4)
output logic Branch,
output logic [2:0] BranchType,
output logic [1:0] Jump, // indicates jump instruction (00 = no jump, 01 = JAL, 10 = JALR)
output logic [2:0] ImmSrc, // selects type of immediate (I = 000, S = 001, B = 010, J = 011, U = 100)
output logic [2:0] AddressingControl // choose which type of load/store instruction to perform
);

// logic [6:0] opcode;
// logic [2:0] funct3;
// logic [6:0] funct7;

// assign opcode = Instr[6:0];
// assign funct3 = Instr[14:12];
// assign funct7 = Instr[31:25];
// assign AddressingControl = funct3; // store width

always_comb begin
// Default values to prevent latches
RegWrite = 1'b0;
ALUControl = 4'b0000;
ALUSrcA = 1'b0;
ALUSrcB = 1'b0;
MemWrite = 1'b0;
ResultSrc = 2'b00;
Branch = 1'b0;
BranchType = 3'b000;
Jump = 2'b00;
ImmSrc = 3'b000;
AddressingControl = 3'b000;


case(opcode)
// R-type instructions
7'b0110011: begin
RegWrite = 1'b1;
ALUSrcB = 1'b0;

case(funct3)
3'b000: begin
case(funct7)
7'b0000000: ALUControl = 4'b0000; // add
7'b0100000: ALUControl = 4'b0001; // sub
default: ALUControl = 4'b0000;
endcase
end
3'b001: ALUControl = 4'b0101; // sll
3'b010: ALUControl = 4'b1000; // slt
3'b011: ALUControl = 4'b1001; // sltu
3'b100: ALUControl = 4'b0100; // xor
3'b101: begin
case(funct7)
7'b0000000: ALUControl = 4'b0110; // srl
7'b0100000: ALUControl = 4'b0111; // sra
default: ALUControl = 4'b0110;
endcase
end
3'b110: ALUControl = 4'b0011; // or
3'b111: ALUControl = 4'b0010; // and

default: ALUControl = 4'b0000;
endcase
end

// I-type instructions (Arithmetic/Logic)
7'b0010011: begin
RegWrite = 1'b1;
ImmSrc = 3'b000; // I-type imm
ALUSrcB = 1'b1;

case(funct3)
3'b000: ALUControl = 4'b0000; // addi
3'b001: ALUControl = 4'b0101; // slli
3'b010: ALUControl = 4'b1000; // slti (Added)
3'b011: ALUControl = 4'b1001; // sltiu (Added)
3'b100: ALUControl = 4'b0100; // xori
3'b101: begin
case(funct7)
7'b0000000: ALUControl = 4'b0110; // srli
7'b0100000: ALUControl = 4'b0111; // srai
default: ALUControl = 4'b0110;
endcase
end
3'b110: ALUControl = 4'b0011; // ori
3'b111: ALUControl = 4'b0010; // andi
default: ALUControl = 4'b0000;
endcase
end

// I-type Load instructions
7'b0000011: begin
RegWrite = 1'b1;
ALUSrcB = 1'b1; // SrcB = imm
ResultSrc = 2'b01; // From Memory
ImmSrc = 3'b000; // I-type imm
AddressingControl = funct3;
ALUControl = 4'b0000; // Add for address
end

// S-type Store instructions
7'b0100011: begin
MemWrite = 1'b1;
ALUSrcB = 1'b1; // read from immediate
ImmSrc = 3'b001; // S-type immediate
ALUControl = 4'b0000; // Add for address
AddressingControl = funct3;
end

// B-type Branch instructions
7'b1100011: begin
Branch = 1'b1;
ImmSrc = 3'b010; // B-type imm
BranchType = funct3;

case(funct3)
// BEQ, BNE: ALU does SUB (0001)
// If A == B, Result = 0, Zero = 1
3'b000: ALUControl = 4'b0001; // beq
3'b001: ALUControl = 4'b0001; // bne

// BLT, BGE: ALU does SLT (1000)
// If A < B: Result = 1, Zero = 0. If A >= B: Result = 0, Zero = 1.
3'b100: ALUControl = 4'b1000; // blt
3'b101: ALUControl = 4'b1000; // bge

// BLTU, BGEU: ALU does SLTU (1001)
3'b110: ALUControl = 4'b1001; // bltu
3'b111: ALUControl = 4'b1001; // bgeu
default: ALUControl = 4'b0000;

endcase
end

// J-type JAL
7'b1101111: begin
RegWrite = 1'b1;
ResultSrc = 2'b10; // PC+4
ImmSrc = 3'b011; // J-type imm
Jump = 2'b01;
end

// I-type JALR
7'b1100111: begin
RegWrite = 1'b1;
ALUSrcB = 1'b1; // SrcB = imm
ResultSrc = 2'b10; // PC+4
ImmSrc = 3'b000; // I-type imm
Jump = 2'b10;
// ALUControl = 4'b0000; // Add for target address
end

// U-type LUI
7'b0110111: begin
RegWrite = 1'b1;
ALUSrcB = 1'b1;
ResultSrc = 2'b00;
ImmSrc = 3'b100; // U-type imm
ALUControl = 4'b1111; // LUI operation (0 + imm shifted)
end

// U-type AUIPC rd <- PC + imm << 12
7'b0010111: begin
RegWrite = 1'b1;
MemWrite = 1'b0;
ALUSrcA = 1'b1; // Select PC
ALUSrcB = 1'b1; // Select Imm
ImmSrc = 3'b100; // U-type imm
ALUControl = 4'b000; // AUIPC operation (PC + imm shifted)
end

default: begin
// Already handled by defaults at top
end
endcase
end
endmodule
56 changes: 56 additions & 0 deletions repo/rtl/control_path.sv
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
module control_path(
/* verilator lint_off UNUSED */
input logic [31:0] Instr,
/* verilator lint_on UNUSED */
input logic Zero,

output logic [1:0] PCSrc, // control the source for the next PC value (00 = PC+4, 01 = PC + imm(branch/jal), 10 = ALUResult (jalr))
output logic RegWrite, // enable write to register
output logic [3:0] ALUControl, // control operation in ALU
output logic ALUSrcA, // choose PC (1) or register (0) for ALU operand A
output logic ALUSrcB, // choose immediate (1) or register (0) operand
output logic MemWrite, // enable write into the data memory
// output logic [1:0] PCSrc, // control the source for the next PC value (00 = PC+4, 01 = PC + imm(branch/jal), 10 = ALUResult (jalr))
output logic [1:0] ResultSrc, // control the source of data to write back to register file (00 = ALU, 01 = Memory, 10 = PC+4)
output logic [2:0] ImmSrc, // selects type of immediate (I = 000, S = 001, B = 010, J = 011, U = 100)
output logic [2:0] AddressingControl // choose which type of load/store instruction to perform
);

logic Branch;
logic [2:0] BranchType;
logic [1:0] Jump;

logic [6:0] opcode;
logic [2:0] funct3;
logic [6:0] funct7;

assign opcode = Instr[6:0];
assign funct3 = Instr[14:12];
assign funct7 = Instr[31:25];

control control_unit (
.opcode(opcode),
.funct3(funct3),
.funct7(funct7),
.RegWrite(RegWrite),
.ALUControl(ALUControl),
.ALUSrcA(ALUSrcA),
.ALUSrcB(ALUSrcB),
.MemWrite(MemWrite),
.ResultSrc(ResultSrc),
.Branch(Branch),
.BranchType(BranchType),
.Jump(Jump),
.ImmSrc(ImmSrc),
.AddressingControl(AddressingControl)
);

pcsrc_unit pcsrc_unit_inst (
.Jump(Jump),
.Branch(Branch),
.Zero(Zero),
.BranchType(BranchType),
.PCSrc(PCSrc)
);

endmodule
51 changes: 51 additions & 0 deletions repo/rtl/data_mem.sv
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
module data_mem #(
parameter XLEN = 32,
parameter ADDRESS_WIDTH = 16,
parameter DATA_WIDTH = 8
) (
input logic clk,
input logic WE, // write enable
/* verilator lint_off UNUSED */
input logic [XLEN-1:0] A, // memory address
/* verilator lint_on UNUSED */
input logic [XLEN-1:0] WD, // data to write
input logic [2:0] AddressingControl, // funct3 to determine load/store type
output logic [XLEN-1:0] RD // data read
);
logic [DATA_WIDTH-1:0] ram_array [2**ADDRESS_WIDTH-1:0]; // 64KB data memory

logic [ADDRESS_WIDTH-1:0] addr;
assign addr = A[ADDRESS_WIDTH-1:0]; // use lower ADDRESS_WIDTH bits of address

always_ff @(posedge clk) begin
if (WE) begin
case (AddressingControl)
3'b000: ram_array[addr] <= WD[7:0]; // SB
3'b001: begin // SH
ram_array[addr] <= WD[7:0];
ram_array[addr+1] <= WD[15:8];
end
3'b010: begin // SW
ram_array[addr] <= WD[7:0];
ram_array[addr+1] <= WD[15:8];
ram_array[addr+2] <= WD[23:16];
ram_array[addr+3] <= WD[31:24];
end
default: ; // ignore other funct3
endcase
end
end

always_comb begin
case (AddressingControl)
3'b000: RD = {{24{ram_array[addr][7]}}, ram_array[addr]}; // LB (signed)
3'b001: RD = {{16{ram_array[addr+1][7]}}, ram_array[addr+1], ram_array[addr]}; // LH (signed)
3'b010: RD = {ram_array[addr+3], ram_array[addr+2], ram_array[addr+1], ram_array[addr]}; // LW
3'b100: RD = {24'b0, ram_array[addr]}; // LBU
3'b101: RD = {16'b0, ram_array[addr+1], ram_array[addr]}; // LHU
default: RD = 32'b0;
endcase
end


endmodule
Loading