2024-10-01 10:39:56 -07:00

86 lines
2.3 KiB
Verilog

// Name: alu_tb.v
// Module: ALU_TB
//
// Notes: - Testbench for ALU
//
// Revision History:
//
// Version Date Who email note
//------------------------------------------------------------------------------------------
// 1.0 Sep 10, 2014 Kaushik Patra kpatra@sjsu.edu Initial creation
//------------------------------------------------------------------------------------------
`include "../prj_definition.v"
module ALU_TB;
// reg list
reg [`DATA_INDEX_LIMIT:0] OP1; // operand 1
reg [`DATA_INDEX_LIMIT:0] OP2; // operand 2
reg [`ALU_OPRN_INDEX_LIMIT:0] OPRN; // operation code
// output list
wire [`DATA_INDEX_LIMIT:0] OUT; // result of the operation.
wire ZERO;
// results
integer ridx;
reg [`DATA_INDEX_LIMIT:0] result[199:0];
// Testcases
integer oprnd_idx, oprn_idx;
integer NumSet01[0:7];
integer NumSet02[0:7];
integer OpCode[0:8];
ALU alu_inst(.OUT(OUT), .ZERO(ZERO), .OP1(OP1), .OP2(OP2), .OPRN(OPRN));
initial
begin
// Initialize number sets
NumSet01[0] = 10; NumSet01[1] = -15; NumSet01[2] = 25; NumSet01[3] = -30; NumSet01[4] = 0; NumSet01[5] = -15; NumSet01[6] = 23; NumSet01[7] = 0;
NumSet02[0] = 10; NumSet02[1] = 15; NumSet02[2] = -25; NumSet02[3] = -30; NumSet02[4] = 0; NumSet02[5] = 42; NumSet02[6] = 0; NumSet02[7] = 70;
ridx = 0;
// Set of operation
OpCode[0] = 1; // add
OpCode[1] = 2; // sub
OpCode[2] = 3; // mult
OpCode[3] = 4; // shiftR
OpCode[4] = 5; // shiftL
OpCode[5] = 6; // and
OpCode[6] = 7; // or
OpCode[7] = 8; // nor
OpCode[8] = 9; // slt
// Loop through operands and operation
for(oprnd_idx=0; oprnd_idx<8; oprnd_idx=oprnd_idx+1)
begin
for(oprn_idx=0; oprn_idx<9; oprn_idx=oprn_idx+1)
begin
#1 OP1=NumSet01[oprnd_idx]; OP2=NumSet02[oprnd_idx]; OPRN=OpCode[oprn_idx];
#1
$write("===> %0d ",$signed(OP1));
case(OPRN)
1: $write("+");
2: $write("-");
3: $write("*");
4: $write(">>");
5: $write("<<");
6: $write("&");
7: $write("|");
8: $write("|~");
9: $write("slt");
endcase
$write(" %0d = %0d [%d]\n", $signed(OP2), $signed(OUT), ZERO);
result[ridx] = OUT; ridx = ridx + 1;
result[ridx] = ZERO; ridx = ridx + 1;
end
end
#1
$writememh("./OUTPUT/alu_tb.out", result, 0, (ridx-1));
$stop;
end
endmodule