diff --git a/TESTBENCH/barrel_shifter_tb.v b/TESTBENCH/barrel_shifter_tb.v index 1121999..3a08dbb 100644 --- a/TESTBENCH/barrel_shifter_tb.v +++ b/TESTBENCH/barrel_shifter_tb.v @@ -18,7 +18,7 @@ reg LnR; wire [31:0] Y; integer reg_idx; -reg [`DATA_INDEX_LIMIT:0] result[0:63]; +reg [`DATA_INDEX_LIMIT:0] result[0:123]; integer i, e; integer no_of_test=0; @@ -33,7 +33,7 @@ D=32'ha5a5a5a5; S=32'h00000000; LnR=1'b1; // left shift -for(i=1; i<33; i=i+1) +for(i=1; i<63; i=i+1) begin #5 no_of_test = no_of_test + 1; @@ -51,7 +51,7 @@ end #5 LnR=1'b0; // right shift -for(i=1; i<33; i=i+1) +for(i=1; i<63; i=i+1) begin #5 no_of_test = no_of_test + 1; diff --git a/alu.v b/alu.v index c4792ea..a488d62 100644 --- a/alu.v +++ b/alu.v @@ -31,11 +31,12 @@ input [`ALU_OPRN_INDEX_LIMIT:0] OPRN; // operation code output [`DATA_INDEX_LIMIT:0] OUT; // result of the operation. output ZERO; -wire [31:0] res, +wire [31:0] //res, res_addsub, res_slt, res_shift, res_mul, res_and, res_or, res_nor; +wire [31:0] res; // add = xx0001 // sub = xx0010 @@ -71,16 +72,10 @@ MUX32_16x1 out(.Y(res), .S(OPRN[3:0]), ); // or bits of result for zero flag -wire nzf [31:0]; -buf (nzf[0], res[0]); -genvar i; -generate - for (i = 1; i < 32; i = i + 1) begin : zf_gen - or (nzf[i], nzf[i-1], res[i]); - end -endgenerate +wire nzf; +or (nzf, res[24:0]); -not (ZERO, nzf[31]); +not (ZERO, nzf); buf res_out [31:0] (OUT, res); endmodule diff --git a/barrel_shifter.v b/barrel_shifter.v index db6cb85..44c20e7 100644 --- a/barrel_shifter.v +++ b/barrel_shifter.v @@ -22,20 +22,14 @@ input [31:0] S; input LnR; // check if upper bits are nonzero -wire oob [31:5]; -buf (oob[5], S[5]); -genvar i; -generate - for (i = 6; i < 32; i = i + 1) begin : shift_oob_gen - or (oob[i], oob[i-1], S[i]); - end -endgenerate +wire oob; +or (oob, S[31:5]); wire [31:0] shifted; BARREL_SHIFTER32 shifter(shifted, D, S[4:0], LnR); // return 0 if S >= 32 -MUX32_2x1 mux_oob(Y, shifted, 32'b0, oob[31]); +MUX32_2x1 mux_oob(Y, shifted, 32'b0, oob); endmodule