diff --git a/.gitignore b/.gitignore index e8c8dad..d8eddca 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,8 @@ __pycache__/ # Cadence/Xcelium simulation output sim/behav/WORKSPACE/ + +# Submission packaging +*-dd-fall26.zip +regress.log +submission.stamp diff --git a/Makefile b/Makefile index 84937a8..b4082cf 100644 --- a/Makefile +++ b/Makefile @@ -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= Assemble a test and generate golden files" @echo "make smoke Test build/TB wiring with a mock DUT" @echo "make test TEST= Generate and run one RTL test" @echo "make regress Run every test, print PASS/FAIL summary (logs in tests//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,23 @@ 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" + +>>>>>>> upstream/main clean: $(MAKE) -C sim/behav clean $(MAKE) --no-print-directory clean-generated diff --git a/README.md b/README.md index 1ad9a46..1afd7b6 100644 --- a/README.md +++ b/README.md @@ -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​** image +- 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​** image - Include any supporting documentation you may have used (diagrams, drawings, state machines) diff --git a/scripts/sjstamp b/scripts/sjstamp new file mode 100755 index 0000000..1cfa2d0 Binary files /dev/null and b/scripts/sjstamp differ diff --git a/src/verilog/cpu/cpu_top.sv b/src/verilog/cpu/cpu_top.sv index edba9bf..6b43435 100644 --- a/src/verilog/cpu/cpu_top.sv +++ b/src/verilog/cpu/cpu_top.sv @@ -5,6 +5,7 @@ // END SYSTEM HEADER module cpu_top ( +<<<<<<< HEAD input logic clk_i, input logic rst_i, input logic en_i, diff --git a/src/verilog/cpu/fetch.sv b/src/verilog/cpu/fetch.sv index 36d15f0..9d44911 100644 --- a/src/verilog/cpu/fetch.sv +++ b/src/verilog/cpu/fetch.sv @@ -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 diff --git a/src/verilog/cpu/reg_file.sv b/src/verilog/cpu/reg_file.sv index e3afbe5..25990b0 100644 --- a/src/verilog/cpu/reg_file.sv +++ b/src/verilog/cpu/reg_file.sv @@ -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 diff --git a/src/verilog/sram_wrapper.sv b/src/verilog/sram_wrapper.sv index 0914dc3..07f9a20 100644 --- a/src/verilog/sram_wrapper.sv +++ b/src/verilog/sram_wrapper.sv @@ -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