2026-06-09 08:33:18 +02:00

113 lines
3.6 KiB
Systemverilog

// *********************************************************************************************
// 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 Bomin Kim
// Last Modified : 23.Oct.2025 by Bomin Kim [commit 2f8f03d]
// -----
// HISTORY : Date By Comments
// ----------- --------- -------------------------------------------------
// *********************************************************************************************
`timescale 1ns/1ns
module alu_tb();
// Local Signals
logic[2:0] aluOp;
logic aluNegAr;
logic aluBypass;
logic[31:0] op1;
logic[31:0] op2;
logic[31:0] result;
logic eqFlag;
// Toplevel instance (DUT)
alu u_alu (
.aluOp(aluOp),
.aluNegAr(aluNegAr),
.aluBypass(aluBypass),
.op1(op1),
.op2(op2),
.result(result),
.eqFlag(eqFlag)
);
// list of aluOp
localparam logic[2:0] f3add = 3'b000;
localparam logic[2:0] f3sl = 3'b001;
localparam logic[2:0] f3slt = 3'b010;
localparam logic[2:0] f3sltU = 3'b011;
localparam logic[2:0] f3xor = 3'b100;
localparam logic[2:0] f3sr = 3'b101;
localparam logic[2:0] f3or = 3'b110;
localparam logic[2:0] f3and = 3'b111;
// Initialize and run simulation
initial begin
dumpWave("wave.vcd");
// Initialize inputs
aluOp = 0;
aluNegAr = 0;
aluBypass = 0;
op1 = 0;
op2 = 0;
#10
// Set op1 and op2
op1 = 32'hDEAD_BEEF; op2 = 32'h0000_0001; #70
$display("\nTime = %0dns \t : op1 = %h, op2 = %h", $time, op1, op2);
$display("\nTime = %0dns \t : Is op1 and op2 equal?; eqFlag = %d", $time, eqFlag);
aluBypass = 1; #70
$display("\nTime = %0dns \t : AluBypass is set; result = %h", $time, result);
aluBypass = 0; aluOp = f3add; #70
$display("\nTime = %0dns \t : Alu operates addition; result = %h", $time, result);
aluNegAr = 1; #70
$display("\nTime = %0dns \t : Alu operates subtraction; result = %h", $time, result);
aluNegAr = 0; aluOp = f3sl; #70
$display("\nTime = %0dns \t : Alu operates shift left; result = %h", $time, result);
aluOp = f3slt; #70
$display("\nTime = %0dns \t : Alu operates set less than; result = %h", $time, result);
aluOp = f3sltU; #70
$display("\nTime = %0dns \t : Alu operates set less than (unsigned); result = %h", $time, result);
aluOp = f3xor; #70
$display("\nTime = %0dns \t : Alu operates bit-wise XOR; result = %h", $time, result);
aluOp = f3sr; aluNegAr = 1; #70
$display("\nTime = %0dns \t : Alu operates arithmetic right shift; result = %h", $time, result);
aluNegAr = 0; #70
$display("\nTime = %0dns \t : Alu operates logical right shift; result = %h", $time, result);
aluOp = f3or; #70
$display("\nTime = %0dns \t : Alu operates bit-wise OR; result = %h", $time, result);
aluOp = f3and; #70
$display("\nTime = %0dns \t : Alu operates bit-wise AND; result = %h", $time, result);
$finish;
end
// Wave Dump Helper Task
task dumpWave(string fileName);
// Open wave file and dump all signals (2D arrays not included)
$display("\nTime = %0dns \t : Opening wave file '%s'", $time, fileName);
$dumpfile(fileName);
$display("Time = %0dns \t : Dumping all %s signals in wave file (2D arrays not included)", $time, "alu_tb");
$dumpvars(0, alu_tb);
endtask: dumpWave
endmodule