// ********************************************************************************************* // Project Version : v1.0 // Project : [BCDC] Microtec Academy Course: Building a RISC-V CPU with SystemVerilog // ----- // Copyright (c) : 2025 Fraunhofer IIS, Department IDS // Created : 15.Oct.2025 by Hussein Elzomor // Last Modified : 23.Oct.2025 by Hussein Elzomor [commit 2f8f03d] // ----- // HISTORY : Date By Comments // ----------- --------- ------------------------------------------------- // ********************************************************************************************* `timescale 1ns/1ns module decoder_tb (); // local Parameters localparam MEM_SIZE = 37; localparam REG_FILE_SIZE = 32; // local signals logic clk; int counter; logic[31:0] mem [MEM_SIZE-1:0]; logic[31:0] regFile [REG_FILE_SIZE-1:0]; // PC logic[31:0] CurrentPC; logic[31:0] JumpOrBranchPC; logic JumpOrBranch; logic[31:0] NextPC; // Memory logic[31:0] DAddr; logic[31:0] WData; logic[31:0] RData; logic[31:0] Instruction; logic WrMem; logic[1:0] DWidth; // Register File; logic[4:0] Rs1; logic[4:0] Rs2; logic[4:0] Rd; logic[31:0] RRs1; logic[31:0] RRs2; logic[31:0] WRd; logic WrReg; // Protection logic Illegal; // Toplevel instance (DUT) decoder u_decoder ( // PC .CurrentPC(CurrentPC), .JumpOrBranchPC(JumpOrBranchPC), .JumpOrBranch(JumpOrBranch), // Memory .DAddr(DAddr), .WData(WData), .RData(RData), .Instruction(Instruction), .WrMem(WrMem), .DWidth(DWidth), // Register File .Rs1(Rs1), .Rs2(Rs2), .Rd(Rd), .RRs1(RRs1), .RRs2(RRs2), .WRd(WRd), .WrReg(WrReg), // Protection .Illegal(Illegal) ); // Clock generation always begin clk = ~clk; #1; end // Load a new instruction every cycle always_ff @(posedge clk) begin: increment_instruction_and_print_info if (counter < MEM_SIZE) begin if (counter > 0) printInfo(); Instruction = mem[counter++]; end end // Return the value of the RegFile always_comb begin: reg_file_assignment RRs1 = regFile[Rs1]; RRs2 = regFile[Rs2]; end // Initialize and run simulation initial begin dumpWave("wave.vcd"); loadMem("decoder.hex"); clk = 1; counter = 0; CurrentPC = 32'hdeadbeef; RData = 32'hbeefdead; for(int i=0; i