Compare commits

..
22 Commits
Author SHA1 Message Date
Benzi 55a0856b5f remove conflict scaffolding 2026-09-20 19:32:01 -04:00
Benzi 1d6b45b324 Merge remote-tracking branch 'upstream/main' 2026-09-20 19:24:11 -04:00
dylan 7094593bd4 fix load stall logic 2026-09-20 19:10:26 -04:00
dylan 4723f7ffaa update load stall condition 2026-09-20 18:45:42 -04:00
dylan 5856ab3d7c fix load stall declaration 2026-09-20 18:33:39 -04:00
Tran, Huy QuangandGitHub Enterprise aca0b2ca60 Merge pull request #5 from SiliconJackets/readme-zip
Submit the make submit zip
2026-09-17 14:30:32 -04:00
Wade Tranandwade-ai f1a8741911 submit the zip make submit writes, not the src folder
Co-Authored-By: wade-ai <[email protected]>
2026-09-17 14:30:16 -04:00
Tran, Huy QuangandGitHub Enterprise 990408862d Merge pull request #4 from SiliconJackets/make-submit
In person checkoffs still send the zip
2026-09-17 14:28:46 -04:00
Wade Tranandwade-ai a14af4090b in person checkoffs still send the zip
Co-Authored-By: wade-ai <[email protected]>
2026-09-17 14:27:57 -04:00
Tran, Huy QuangandGitHub Enterprise 7454586413 Merge pull request #3 from SiliconJackets/make-submit
make submit
2026-09-17 14:14:22 -04:00
Wade Tranandwade-ai b0d1314278 mention make submit in the readme
Co-Authored-By: wade-ai <[email protected]>
2026-09-17 14:03:56 -04:00
Wade Tranandwade-ai c02b6708f1 stamp make submit with who ran it, when, and how long regress took
Co-Authored-By: wade-ai <[email protected]>
2026-09-17 13:44:03 -04:00
Wade Tranandwade-ai 6d812677d4 join every part of the member name in the zip filename
Co-Authored-By: wade-ai <[email protected]>
2026-09-17 13:17:25 -04:00
Wade Tranandwade-ai b558beb69f name the submission zip after the member and pack their tests and testbenches
Co-Authored-By: wade-ai <[email protected]>
2026-09-17 11:57:27 -04:00
Wade Tranandwade-ai 0eace93dfd add make submit to run regress and zip src for checkoff
Co-Authored-By: wade-ai <[email protected]>
2026-09-17 11:45:08 -04:00
Nech, GabrielandGitHub Enterprise 62b1cbd48d Update README.md 2026-09-11 10:28:14 -07:00
Antony Selvin Raj, Alfi Misha 00ef7a32ed update readme with new tb files and cleaned up cadence instructions.
rewording readme a bit
2026-09-06 18:27:02 -04:00
plittlefield6 4f30a3ef6b updated smoke test include file 2026-09-05 22:37:14 -04:00
Tran, Huy QuangandGitHub Enterprise dcc53bba3c Merge pull request #2 from SiliconJackets/fetch-testbench
Standalone fetch testbench
2026-09-05 17:36:39 -04:00
Wade Tranandwade-ai a33802a191 add a standalone fetch testbench and note how to run it
Co-Authored-By: wade-ai <[email protected]>
2026-09-05 17:32:37 -04:00
plittlefield6 51a87a5dac make testbench visible so simvision works 2026-09-05 16:59:51 -04:00
Konstantin GaydevandCooper Shaw 49a639f69a Initial Commit 2026-09-04 11:40:42 -04:00
10 changed files with 165 additions and 119 deletions
+5
View File
@@ -9,3 +9,8 @@ __pycache__/
# Cadence/Xcelium simulation output
sim/behav/WORKSPACE/
# Submission packaging
*-dd-fall26.zip
regress.log
submission.stamp
+27 -1
View File
@@ -1,3 +1,12 @@
# Fill these in before running make submit, for example:
# MEMBER_NAME = George Burdell
# GT_USERNAME = gburdell3
# DISCORD_NAME = gburdell67discord
MEMBER_NAME =
GT_USERNAME =
DISCORD_NAME =
export MEMBER_NAME
PYTHON ?= python3
TEST ?= ebreak
TEST_DIR := tests/$(TEST)
@@ -6,13 +15,14 @@ CROSSBAR_TIMEOUT ?= 20
TEST_NAMES := $(sort $(notdir $(patsubst %/,%,$(dir $(wildcard tests/*/program.asm)))))
.PHONY: help generate smoke test regress clean clean-generated
.PHONY: help generate smoke test regress submit clean clean-generated
help:
@echo "make generate TEST=<name> Assemble a test and generate golden files"
@echo "make smoke Test build/TB wiring with a mock DUT"
@echo "make test TEST=<name> Generate and run one RTL test"
@echo "make regress Run every test, print PASS/FAIL summary (logs in tests/<name>/sim.log)"
@echo "make submit Run regress and zip your sources, tests and log for checkoff"
@echo "make clean Remove generated test and simulator files"
@echo "Available tests: $(TEST_NAMES)"
@@ -54,6 +64,22 @@ regress:
exit 1; \
fi
submit:
@if [ -z "$(strip $(MEMBER_NAME))" ] || [ -z "$(strip $(GT_USERNAME))" ] || [ -z "$(strip $(DISCORD_NAME))" ]; then \
echo "Fill in MEMBER_NAME, GT_USERNAME and DISCORD_NAME at the top of the Makefile first."; \
exit 2; \
fi
@submission="$$(printf '%s' "$$MEMBER_NAME" | tr -d "[:space:]'.,-")-$(strip $(GT_USERNAME))-$(strip $(DISCORD_NAME))-dd-fall26.zip"; \
rm -f "$$submission" regress.log submission.stamp; \
scripts/sjstamp submission.stamp regress.log src sim/behav/Include tests -- $(MAKE) --no-print-directory regress; \
status=$$?; \
if [ $$status -eq 125 ]; then echo "Could not stamp the submission, nothing was zipped."; exit 1; fi; \
zip -qr "$$submission" src sim/behav/Include tests regress.log submission.stamp \
-x '*.DS_Store' 'tests/*/program.o' 'tests/*/program.hex' 'tests/*/sim.log'; \
echo "----------------------------------------"; \
if [ $$status -ne 0 ]; then echo "WARNING: not all tests pass, see regress.log"; fi; \
echo "Wrote $$submission"
clean:
$(MAKE) -C sim/behav clean
$(MAKE) --no-print-directory clean-generated
+3 -1
View File
@@ -273,10 +273,12 @@ Disclaimer: We will be running some back end AI and software similarity checkers
In Person Submissions:
- We will ask you to walk through the logic and answer a few random questions on must-know concepts.
- You still need to run `make submit` and send the zip to the sjcheckoffs Discord Account, same as an online submission.
Additional Instructions For Online Submissions:
- Include a screenshot of all your tests passing with your gt username somewhere in the terminal in the screenshot
- **submit a zip of the src folder to the sjcheckoffs Discord Account​** <img width="417" height="422" alt="image" src="https://github.gatech.edu/user-attachments/assets/1c271294-ba6a-4314-beb2-e4c76c7e97db" />
- fill in your name, GT username and Discord username at the top of the `Makefile`, then run `make submit` to run every test and build the zip
- **submit the zip that `make submit` wrote to the sjcheckoffs Discord Account​** <img width="417" height="422" alt="image" src="https://github.gatech.edu/user-attachments/assets/1c271294-ba6a-4314-beb2-e4c76c7e97db" />
- Include any supporting documentation you may have used (diagrams, drawings, state machines)
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -21,7 +21,7 @@ module main_decoder (
mem_write_o = 1'b0;
alu_src_o = 1'b0;
alu_op_o = 1'b00;
load_stall = 1'b0;
load_stall_o = 1'b0;
case (opcode_i)
// lw
@@ -33,7 +33,7 @@ module main_decoder (
result_src_o = 1'b1;
branch_o = 1'b0;
alu_op_o = 2'b00;
load_stall = 1'b1;
load_stall_o = 1'b1;
end
// sw
7'b0100011: begin
+18 -7
View File
@@ -59,8 +59,24 @@ module cpu_top (
logic ebreak_latch;
logic load_stall;
logic load_stall_cycle;
logic load_stall_ff;
assign stall_core = ebreak_latch | halted_o | ~en_i | load_stall; //when else would you stall?
assign load_stall_ff = (load_stall & ~load_stall_cycle);
assign stall_core = ebreak_latch | halted_o | ~en_i | load_stall_ff;
always_ff @(posedge clk_i) begin
if (rst_i) begin
halted_o <= 1'b0;
load_stall_cycle <= 1'b0;
end else if (ebreak_latch) halted_o <= 1'b1;
else if (load_stall & ~load_stall_cycle) begin
load_stall_cycle <= 1'b1;
end else if (load_stall & load_stall_cycle) begin
load_stall_cycle <= 1'b0;
end
end
// === Instruction Fetch === //
// certain ports are tied off bc they depend on modulees you need to implement.
@@ -101,17 +117,12 @@ module cpu_top (
.rs1_data_o(rs1_data),
.rs2_data_o(rs2_data),
.load_stall_o(load_stall),
.load_stall_ff_i(load_stall_ff),
.instr_invld_o(instr_invld_decode),
.reg_values_o(reg_crossbar_o),
.ebreak_o(ebreak_latch)
);
always_ff @(posedge clk_i) begin
if (rst_i) halted_o <= 1'b0;
else if (ebreak_latch) halted_o <= 1'b1;
end
always_comb begin
if (pc_target[31:12] == '0) begin
branch_vld = '1;
+2 -1
View File
@@ -5,6 +5,7 @@ module decode (
input logic instr_vld_i, // is instruction passed valid
input logic alu_zero_i,
input logic [31:0] rd_data_i,
input logic load_stall_ff_i,
output logic pc_src_o,
output logic result_src_o,
@@ -49,7 +50,7 @@ module decode (
.rs2_addr_i(instr_i[24:20]),
.rs1_data_o(rs1_data_o),
.rs2_data_o(rs2_data_o),
.rd_write_en_i(reg_write),
.rd_write_en_i(reg_write & ~load_stall_ff_i),
.rd_addr_i(instr_i[11:7]),
.rd_data_i(rd_data_i),
.reg_values_o(reg_values_o)
+46 -46
View File
@@ -1,61 +1,61 @@
//DO NOT MODIFY THIS FILE!
//DO NOT MODIFY THIS FILE!!
module fetch (
input logic clk_i,
input logic rst_i,
input logic en_i,
input logic clk_i,
input logic rst_i,
input logic en_i,
input logic stall_core_i,
// === Instruction RAM Interface === //
output logic isram_en_o,
output logic [9:0] isram_addr_o,
input logic [31:0] isram_rdata_i,
input logic isram_rready_i,
input logic stall_core_i,
// === Instruction RAM Interface === //
output logic isram_en_o,
output logic [9:0] isram_addr_o,
input logic [31:0] isram_rdata_i,
input logic isram_rready_i,
// === Fetched Instruction === //
output logic [31:0] instr_o,
output logic [31:0] pc_o, //current instruction
output logic instr_vld_o,
// === Fetched Instruction === //
output logic [31:0] instr_o,
output logic [31:0] pc_o, //current instruction
output logic instr_vld_o,
input logic branch_vld_i,
input logic [9:0] branch_trgt_i,
input logic branch_taken_i
input logic branch_vld_i,
input logic [9:0] branch_trgt_i,
input logic branch_taken_i
);
logic [31:0] next_pc; //instruction to be run at the next cycle
logic [31:0] next_pc; //instruction to be run at the next cycle
always_ff @(posedge clk_i) begin
if(rst_i) begin
pc_o <= '0;
end else if(en_i & !stall_core_i) begin
pc_o <= next_pc;
end
end
always_ff @(posedge clk_i) begin
if (rst_i) begin
pc_o <= '0;
end else if (en_i & !stall_core_i) begin
pc_o <= next_pc;
end
end
always_comb begin
next_pc = '0;
isram_en_o = '0;
isram_addr_o = '0;
instr_o = '0;
instr_vld_o = '0;
if(en_i) begin
if (stall_core_i) begin
next_pc = pc_o; //when we stall we stay at the same instruction at the next cycle
end else if (branch_vld_i && branch_taken_i) begin
next_pc = {20'b0, branch_trgt_i, 2'b00};
end else begin
next_pc = pc_o + 4;
end
always_comb begin
next_pc = '0;
isram_en_o = '0;
isram_addr_o = '0;
instr_o = '0;
instr_vld_o = '0;
if (en_i) begin
if (stall_core_i) begin
next_pc = pc_o; //when we stall we stay at the same instruction at the next cycle
end else if (branch_vld_i && branch_taken_i) begin
next_pc = {20'b0, branch_trgt_i, 2'b00};
end else begin
next_pc = pc_o + 4;
end
isram_en_o = 1'b1;
isram_addr_o = next_pc[11:2];
instr_o = isram_rdata_i;
instr_vld_o = isram_rready_i;
isram_en_o = 1'b1;
isram_addr_o = next_pc[11:2];
instr_o = isram_rdata_i;
instr_vld_o = isram_rready_i;
end
end
end
end
endmodule
+30 -29
View File
@@ -1,45 +1,46 @@
// 32 x 32-bit RISC-V integer register file.
// Register x0 always reads as zero and ignores writes.
module reg_file (
input logic clk_i,
input logic rst_i,
input logic clk_i,
input logic rst_i,
input logic [ 4:0] rs1_addr_i, //Register Source 1 Address Input
input logic [ 4:0] rs2_addr_i,
input logic [4:0] rs1_addr_i, //Register Source 1 Address Input
input logic [4:0] rs2_addr_i,
output logic [31:0] rs1_data_o,
output logic [31:0] rs2_data_o, //Register Source 2 Data Output
output logic [31:0] rs2_data_o, //Register Source 2 Data Output
input logic rd_write_en_i, //Register Destination Write Enable Input
input logic [ 4:0] rd_addr_i,
input logic [31:0] rd_data_i,
input logic rd_write_en_i, //Register Destination Write Enable Input
input logic [4:0] rd_addr_i,
input logic [31:0] rd_data_i,
// Read-only architectural state exposed to the debug crossbar.
output logic [31:0] reg_values_o[32] //Register Values Output
output logic [31:0] reg_values_o [0:31] //Register Values Output
);
logic [31:0] registers[32];
integer i; //used for generate loops in systemverilog
logic [31:0] registers [0:31];
integer i; //used for generate loops in systemverilog
always_comb begin
rs1_data_o = (rs1_addr_i == 5'd0) ? 32'd0 : registers[rs1_addr_i];
rs2_data_o = (rs2_addr_i == 5'd0) ? 32'd0 : registers[rs2_addr_i];
end
assign reg_values_o[0] = 32'd0;
generate
for (
genvar register_index = 1; register_index < 32; register_index++
) begin : gen_debug_register_values
assign reg_values_o[register_index] = registers[register_index];
always_comb begin
rs1_data_o = (rs1_addr_i == 5'd0) ? 32'd0 : registers[rs1_addr_i];
rs2_data_o = (rs2_addr_i == 5'd0) ? 32'd0 : registers[rs2_addr_i];
end
endgenerate
always_ff @(posedge clk_i) begin
if (rst_i) begin
for (i = 0; i < 32; i = i + 1) registers[i] <= 32'd0;
end else if (rd_write_en_i && (rd_addr_i != 5'd0)) begin
registers[rd_addr_i] <= rd_data_i;
assign reg_values_o[0] = 32'd0;
generate
for (genvar register_index = 1;
register_index < 32;
register_index++) begin : gen_debug_register_values
assign reg_values_o[register_index] = registers[register_index];
end
endgenerate
always_ff @(posedge clk_i) begin
if (rst_i) begin
for (i = 0; i < 32; i = i + 1)
registers[i] <= 32'd0;
end else if (rd_write_en_i && (rd_addr_i != 5'd0)) begin
registers[rd_addr_i] <= rd_data_i;
end
end
end
endmodule
+32 -32
View File
@@ -4,46 +4,46 @@
//DO NOT MODIFY//
module sram_wrapper (
input logic clk_i,
input logic rst_i,
input logic rst_i,
input logic en_i,
input logic write_en_i,
input logic [ 9:0] addr_i,
input logic [9:0] addr_i,
input logic [31:0] wdata_i,
output logic [31:0] rdata_o,
output logic rready_o
output logic rready_o
);
CF_SRAM_1024x32_macro u_sram (
.DO (rdata_o),
.DI (wdata_i),
.AD (addr_i),
.CLKin (clk_i),
.EN (en_i),
.R_WB (~write_en_i),
.BEN (32'hFFFF_FFFF),
.TM (1'b0),
.SM (1'b0),
.WLBI (1'b0),
.WLOFF (1'b0),
.ScanInCC (1'b0),
.ScanInDL (1'b0),
.ScanInDR (1'b0),
.ScanOutCC(),
.vpwrac (1'b1),
.vpwrpc (1'b1)
);
CF_SRAM_1024x32_macro u_sram (
.DO (rdata_o),
.DI (wdata_i),
.AD (addr_i),
.CLKin (clk_i),
.EN (en_i),
.R_WB (~write_en_i),
.BEN (32'hFFFF_FFFF),
.TM (1'b0),
.SM (1'b0),
.WLBI (1'b0),
.WLOFF (1'b0),
.ScanInCC (1'b0),
.ScanInDL (1'b0),
.ScanInDR (1'b0),
.ScanOutCC (),
.vpwrac (1'b1),
.vpwrpc (1'b1)
);
logic rdata_valid;
logic rdata_valid;
always_ff @(posedge clk_i) begin
if(rst_i) begin
rdata_valid <= 1'b0;
end else begin
rdata_valid <= en_i;
end
end
always_ff @(posedge clk_i) begin
if (rst_i) begin
rdata_valid <= 1'b0;
end else begin
rdata_valid <= en_i;
end
end
assign rready_o = rdata_valid;
assign rready_o = rdata_valid;
endmodule