module signed_multiplier_test; reg failed_flag = 0; reg signed [5:0] s_prod; wire [2:0] u_pos_two = 3'b010; wire signed [2:0] s_pos_two = 3'sb010; wire signed [2:0] s_neg_two = 3'sb110; wire s = 1'b1; // flag to indicate signed wire u = 1'b0; // flag to indicate unsigned initial begin // unsigned positive two as first argument of multiply #1 s_prod = u_pos_two * u_pos_two; check_mult(1,u,u_pos_two,u,u_pos_two,s_prod,6'sb000100); #1 s_prod = u_pos_two * s_pos_two; check_mult(2,u,u_pos_two,s,s_pos_two,s_prod,6'sb000100); // This makes an unsigned result. #1 s_prod = u_pos_two * s_neg_two; check_mult(3,u,u_pos_two,s,s_neg_two,s_prod,6'sb001100); // signed positive two as first argument of multiply #1 s_prod = s_pos_two * u_pos_two; check_mult(4,s,s_pos_two,u,u_pos_two,s_prod,6'sb000100); #1 s_prod = s_pos_two * s_pos_two; check_mult(5,s,s_pos_two,s,s_pos_two,s_prod,6'sb000100); #1 s_prod = s_pos_two * s_neg_two; check_mult(6,s,s_pos_two,s,s_neg_two,s_prod,6'sb111100); // signed negative two as first argument of multiply // This makes an unsigned result. #1 s_prod = s_neg_two * u_pos_two; check_mult(7,s,s_neg_two,u,u_pos_two,s_prod,6'sb001100); #1 s_prod = s_neg_two * s_pos_two; check_mult(8,s,s_neg_two,s,s_pos_two,s_prod,6'sb111100); #1 s_prod = s_neg_two * s_neg_two; check_mult(9,s,s_neg_two,s,s_neg_two,s_prod,6'sb000100); if (failed_flag == 0) $display("PASSED"); $finish; end task check_mult; input [31:0] idx; input signeda; input [ 2:0] arga; input signedb; input [ 2:0] argb; input [ 5:0] result,expected; if (result !== expected) begin failed_flag = 1; $write("failed: test %0d, ",idx); if (signeda) $write("3'sb%b",arga); else $write("3 'b%b",arga); $write(" * "); if (signedb) $write("3'sb%b",argb); else $write("3 'b%b",argb); $write(" = 6'sb%b (expected 6'sb%b)\n",result,expected); end endtask endmodule