|
@@ -7,67 +7,98 @@
|
|
|
|
|
|
|
|
module fpu32_tb();
|
|
module fpu32_tb();
|
|
|
reg reset, clk;
|
|
reg reset, clk;
|
|
|
- reg [31:0] input_a, input_b, result_add, result_div, result_mul;
|
|
|
|
|
|
|
+ reg [31:0] input_a, input_b, result_add, result_div, result_mult;
|
|
|
wire nan, overflow, underflow, zero;
|
|
wire nan, overflow, underflow, zero;
|
|
|
|
|
|
|
|
|
|
|
|
|
- reg adder_input_a_stb, adder_input_b_stb, adder_output_z_ack;
|
|
|
|
|
- wire adder_input_a_ack, adder_input_b_ack, adder_output_z_stb;
|
|
|
|
|
|
|
+ reg adder_input_stb, adder_output_z_ack;
|
|
|
|
|
+ reg mult_input_stb, mult_output_z_ack;
|
|
|
|
|
+ wire adder_input_ack, adder_output_z_stb;
|
|
|
|
|
+ wire mult_input_ack, mult_output_z_stb;
|
|
|
|
|
|
|
|
adder add0(
|
|
adder add0(
|
|
|
.clk(clk),
|
|
.clk(clk),
|
|
|
.rst(reset),
|
|
.rst(reset),
|
|
|
.input_a(input_a),
|
|
.input_a(input_a),
|
|
|
- .input_a_stb(adder_input_a_stb),
|
|
|
|
|
- .input_a_ack(adder_input_a_ack),
|
|
|
|
|
.input_b(input_b),
|
|
.input_b(input_b),
|
|
|
- .input_b_stb(adder_input_b_stb),
|
|
|
|
|
- .input_b_ack(adder_input_b_ack),
|
|
|
|
|
|
|
+ .input_stb(adder_input_stb),
|
|
|
|
|
+ .input_ack(adder_input_ack),
|
|
|
.output_z(result_add),
|
|
.output_z(result_add),
|
|
|
.output_z_ack(adder_output_z_ack),
|
|
.output_z_ack(adder_output_z_ack),
|
|
|
.output_z_stb(adder_output_z_stb)
|
|
.output_z_stb(adder_output_z_stb)
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
|
|
+ multiplier mult0(
|
|
|
|
|
+ .clk(clk),
|
|
|
|
|
+ .rst(reset),
|
|
|
|
|
+ .input_a(input_a),
|
|
|
|
|
+ .input_b(input_b),
|
|
|
|
|
+ .input_stb(mult_input_stb),
|
|
|
|
|
+ .input_ack(mult_input_ack),
|
|
|
|
|
+ .output_z(result_mult),
|
|
|
|
|
+ .output_z_ack(mult_output_z_ack),
|
|
|
|
|
+ .output_z_stb(mult_output_z_stb)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
|
|
|
initial forever #5 clk = ~clk;
|
|
initial forever #5 clk = ~clk;
|
|
|
|
|
|
|
|
- reg [31:0] test_mem [29:0][3:0];
|
|
|
|
|
|
|
+ reg [31:0] test_mem [9999:0][3:0];
|
|
|
|
|
|
|
|
- initial $readmemh("../../scripts/fp32_test.hex", test_mem);
|
|
|
|
|
|
|
+ initial $readmemh("scripts/fp32_test.hex", test_mem);
|
|
|
|
|
|
|
|
initial begin
|
|
initial begin
|
|
|
|
|
+ static int num_err = 0;
|
|
|
|
|
+ static int num_tests = $size(test_mem) * 2;
|
|
|
|
|
+
|
|
|
clk = 0;
|
|
clk = 0;
|
|
|
reset = 1;
|
|
reset = 1;
|
|
|
- adder_input_a_stb = 0;
|
|
|
|
|
- adder_input_b_stb = 0;
|
|
|
|
|
|
|
+ adder_input_stb = 0;
|
|
|
adder_output_z_ack = 0;
|
|
adder_output_z_ack = 0;
|
|
|
|
|
|
|
|
|
|
+ mult_input_stb = 0;
|
|
|
|
|
+ mult_output_z_ack = 0;
|
|
|
|
|
+
|
|
|
#20;
|
|
#20;
|
|
|
reset = 0;
|
|
reset = 0;
|
|
|
|
|
|
|
|
- foreach(test_mem[i]) begin
|
|
|
|
|
|
|
+
|
|
|
|
|
+ for (int i=0; i < $size(test_mem); i++) begin
|
|
|
input_a = test_mem[i][0];
|
|
input_a = test_mem[i][0];
|
|
|
input_b = test_mem[i][1];
|
|
input_b = test_mem[i][1];
|
|
|
- adder_input_a_stb = 1;
|
|
|
|
|
- adder_input_b_stb = 1;
|
|
|
|
|
|
|
+ adder_input_stb = 1;
|
|
|
|
|
+ mult_input_stb = 1;
|
|
|
|
|
|
|
|
- wait(adder_input_a_ack | adder_input_b_ack == 1);
|
|
|
|
|
|
|
+ wait(adder_input_ack | mult_input_ack == 1);
|
|
|
#15;
|
|
#15;
|
|
|
- adder_input_a_stb = 0;
|
|
|
|
|
- adder_input_b_stb = 0;
|
|
|
|
|
|
|
+ adder_input_stb = 0;
|
|
|
|
|
+ mult_input_stb = 0;
|
|
|
|
|
|
|
|
- @(posedge adder_output_z_stb);
|
|
|
|
|
|
|
+ @(posedge adder_output_z_stb & mult_output_z_stb);
|
|
|
adder_output_z_ack = 1;
|
|
adder_output_z_ack = 1;
|
|
|
- if(result_add != test_mem[i][3])
|
|
|
|
|
- $display("PASS: %H + %H = %H", input_a, input_b, result_add);
|
|
|
|
|
- else
|
|
|
|
|
- $error("FAIL ADD: %H + %H = %H, expected %H", input_a, input_b, result_add, test_mem[i][3]);
|
|
|
|
|
|
|
+ mult_output_z_ack = 1;
|
|
|
|
|
|
|
|
- @(negedge adder_output_z_stb);
|
|
|
|
|
|
|
+ if(result_add != test_mem[i][2]) begin
|
|
|
|
|
+ if(num_err < 20)
|
|
|
|
|
+ $display("FAIL ADD: %H + %H = %H, expected %H", input_a, input_b, result_add, test_mem[i][2]);
|
|
|
|
|
+ num_err = num_err + 1;
|
|
|
|
|
+ end
|
|
|
|
|
+
|
|
|
|
|
+ if(result_mult != test_mem[i][3]) begin
|
|
|
|
|
+ if(num_err < 20)
|
|
|
|
|
+ $display("FAIL ADD: %H * %H = %H, expected %H", input_a, input_b, result_add, test_mem[i][3]);
|
|
|
|
|
+ num_err = num_err + 1;
|
|
|
|
|
+ end
|
|
|
|
|
+
|
|
|
|
|
+ @(negedge adder_output_z_stb & mult_output_z_stb);
|
|
|
adder_output_z_ack = 0;
|
|
adder_output_z_ack = 0;
|
|
|
|
|
+ mult_output_z_ack = 0;
|
|
|
#10;
|
|
#10;
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
+ $display("Passed %d of %d tests", num_tests-num_err, num_tests);
|
|
|
|
|
+ $finish();
|
|
|
|
|
+
|
|
|
// assert(result_add == 32'h42440000);
|
|
// assert(result_add == 32'h42440000);
|
|
|
// assert(result_mul == 32'hc2480000);
|
|
// assert(result_mul == 32'hc2480000);
|
|
|
// $finish();
|
|
// $finish();
|