1 |
121 |
ultro |
/* verilator lint_off COMBDLY */
|
2 |
|
|
|
3 |
|
|
module shiftbox (shiftop,calc_sz,ci,co,opa,opb,resa,resb,resa4,resb4,co4);
|
4 |
|
|
|
5 |
|
|
input [3:0] shiftop;
|
6 |
|
|
input [3:0] calc_sz;
|
7 |
|
|
input [31:0] opa,opb;
|
8 |
|
|
output reg [31:0] resa,resb;
|
9 |
|
|
output reg [31:0] resa4,resb4;
|
10 |
|
|
input ci;
|
11 |
|
|
output reg co,co4;
|
12 |
|
|
|
13 |
|
|
always @(*)
|
14 |
|
|
case (shiftop)
|
15 |
|
|
4'b0000 : if (calc_sz==4) begin resa <= {opa[30:0],opa[31]}; co<=ci; resb<=opb; end else // rol without ci
|
16 |
|
|
if (calc_sz==2) begin resa[15:0] <= {opa[14:0],opa[15]}; co<=ci; resb<=opb; resa[31:16]<=opa[31:16]; end else
|
17 |
|
|
begin resa[ 7:0] <= {opa[ 6:0],opa[ 7]}; co<=ci; resb<=opb; resa[31: 8]<=opa[31: 8]; end
|
18 |
|
|
|
19 |
|
|
4'b0001 : if (calc_sz==4) begin resa <= {opa[0],opa[31:1]}; co<=ci; resb<=opb; end else // ror without ci
|
20 |
|
|
if (calc_sz==2) begin resa[15:0] <= {opa[0],opa[15:1]}; co<=ci; resb<=opb; resa[31:16]<=opa[31:16]; end else
|
21 |
|
|
begin resa[ 7:0] <= {opa[0],opa[ 7:1]}; co<=ci; resb<=opb; resa[31: 8]<=opa[31: 8]; end
|
22 |
|
|
|
23 |
|
|
4'b0010 : if (calc_sz==4) begin {co,resa[31:0]} <= {opa[31:0],ci}; resb<=opb; end else // rol with ci = rcl
|
24 |
|
|
if (calc_sz==2) begin {co,resa[15:0]} <= {opa[15:0],ci}; resb<=opb; resa[31:16]<=opa[31:16]; end else
|
25 |
|
|
begin {co,resa[ 7:0]} <= {opa[ 7:0],ci}; resb<=opb; resa[31: 8]<=opa[31: 8]; end
|
26 |
|
|
|
27 |
|
|
4'b0011 : if (calc_sz==4) begin {co,resa[31:0]} <= {opa[0],ci,opa[31:1]}; resb<=opb; end else // ror with ci = rcr
|
28 |
|
|
if (calc_sz==2) begin {co,resa[15:0]} <= {opa[0],ci,opa[15:1]}; resb<=opb; resa[31:16]<=opa[31:16]; end else
|
29 |
|
|
begin {co,resa[ 7:0]} <= {opa[0],ci,opa[ 7:1]}; resb<=opb; resa[31: 8]<=opa[31: 8]; end
|
30 |
|
|
|
31 |
|
|
4'b0100,
|
32 |
|
|
4'b0110 : if (calc_sz==4) begin {co,resa[31:0]} <= {opa[31:0],1'b0}; resb<=opb; end else // shl,sal with ci
|
33 |
|
|
if (calc_sz==2) begin {co,resa[15:0]} <= {opa[15:0],1'b0}; resb<=opb; resa[31:16]<=opa[31:16]; end else
|
34 |
|
|
begin {co,resa[ 7:0]} <= {opa[ 7:0],1'b0}; resb<=opb; resa[31: 8]<=opa[31: 8]; end
|
35 |
|
|
|
36 |
|
|
4'b0101 : if (calc_sz==4) begin resa[31:0] <= {1'b0,opa[31:1]}; co<=ci; resb<=opb; end else // shr
|
37 |
|
|
if (calc_sz==2) begin resa[15:0] <= {1'b0,opa[15:1]}; co<=ci; resb<=opb; resa[31:16]<=opa[31:16]; end else
|
38 |
|
|
begin resa[ 7:0] <= {1'b0,opa[ 7:1]}; co<=ci; resb<=opb; resa[31: 8]<=opa[31: 8]; end
|
39 |
|
|
|
40 |
|
|
4'b0111 : if (calc_sz==4) begin resa[31:0] <= {opa[31],opa[31:1]}; co<=ci; resb<=opb; end else // sar
|
41 |
|
|
if (calc_sz==2) begin resa[15:0] <= {opa[15],opa[15:1]}; co<=ci; resb<=opb; resa[31:16]<=opa[31:16]; end else
|
42 |
|
|
begin resa[ 7:0] <= {opa[ 7],opa[ 7:1]}; co<=ci; resb<=opb; resa[31: 8]<=opa[31: 8]; end
|
43 |
|
|
|
44 |
|
|
4'b1000 : if (calc_sz==4) begin {resb[31:0],co} <= {opa[0],opb[31:0]}; resa[31:0] <= {opa[31],opa[31:1]}; end else // shrd
|
45 |
|
|
begin {resb[15:0],co} <= {opa[0],opb[15:0]}; resa[15:0] <= {opa[15],opa[15:1]}; resa[31:16]<=opa[31:16]; resb[31:16]<=opb[31:16]; end
|
46 |
|
|
|
47 |
|
|
4'b1001 : if (calc_sz==4) begin {co,resb[31:0]} <= {opb[31:0],opa[31]}; resa[31:0] <= {opa[30:0],opa[0]}; end else // shld
|
48 |
|
|
begin {co,resb[15:0]} <= {opb[15:0],opa[15]}; resa[15:0] <= {opa[14:0],opa[0]}; resa[31:16]<=opa[31:16]; resb[31:16]<=opb[31:16];end
|
49 |
|
|
|
50 |
|
|
default : begin co<=ci; resb<=opb; resa <= opa; end
|
51 |
|
|
endcase
|
52 |
|
|
|
53 |
|
|
always @(*)
|
54 |
|
|
case (shiftop)
|
55 |
|
|
4'b0000 : if (calc_sz==4) begin resa4 <= {opa[27:0],opa[31:28]}; co4<=ci; resb4<=opb; end else // rol without ci
|
56 |
|
|
if (calc_sz==2) begin resa4[15:0] <= {opa[11:0],opa[15:12]}; co4<=ci; resb4<=opb; resa4[31:16]<=opa[31:16]; end else
|
57 |
|
|
begin resa4[ 7:0] <= {opa[ 3:0],opa[ 7:4]}; co4<=ci; resb4<=opb; resa4[31: 8]<=opa[31: 8]; end
|
58 |
|
|
|
59 |
|
|
4'b0001 : if (calc_sz==4) begin resa4 <= {opa[3:0],opa[31:4]}; co4<=ci; resb4<=opb; end else // ror without ci
|
60 |
|
|
if (calc_sz==2) begin resa4[15:0] <= {opa[3:0],opa[15:4]}; co4<=ci; resb4<=opb; resa4[31:16]<=opa[31:16]; end else
|
61 |
|
|
begin resa4[ 7:0] <= {opa[3:0],opa[ 7:4]}; co4<=ci; resb4<=opb; resa4[31: 8]<=opa[31: 8]; end
|
62 |
|
|
|
63 |
|
|
4'b0010 : if (calc_sz==4) begin {co4,resa4[31:0]} <= {opa[28:0],ci,opa[31:29]}; resb4<=opb; end else // rol with ci = rcl
|
64 |
|
|
if (calc_sz==2) begin {co4,resa4[15:0]} <= {opa[12:0],ci,opa[15:13]}; resb4<=opb; resa4[31:16]<=opa[31:16]; end else
|
65 |
|
|
begin {co4,resa4[ 7:0]} <= {opa[ 4:0],ci,opa[ 7: 5]}; resb4<=opb; resa4[31: 8]<=opa[31: 8]; end
|
66 |
|
|
|
67 |
|
|
4'b0011 : if (calc_sz==4) begin {co4,resa4[31:0]} <= {opa[3:0],ci,opa[31:4]}; resb4<=opb; end else // ror with ci = rcr
|
68 |
|
|
if (calc_sz==2) begin {co4,resa4[15:0]} <= {opa[3:0],ci,opa[15:4]}; resb4<=opb; resa4[31:16]<=opa[31:16]; end else
|
69 |
|
|
begin {co4,resa4[ 7:0]} <= {opa[3:0],ci,opa[ 7:4]}; resb4<=opb; resa4[31: 8]<=opa[31: 8]; end
|
70 |
|
|
|
71 |
|
|
4'b0100,
|
72 |
|
|
4'b0110 : if (calc_sz==4) begin {co4,resa4[31:0]} <= {opa[28:0],4'b0000}; resb4<=opb; end else // shl,sal with ci
|
73 |
|
|
if (calc_sz==2) begin {co4,resa4[15:0]} <= {opa[12:0],4'b0000}; resb4<=opb; resa4[31:16]<=opa[31:16]; end else
|
74 |
|
|
begin {co4,resa4[ 7:0]} <= {opa[ 4:0],4'b0000}; resb4<=opb; resa4[31: 8]<=opa[31: 8]; end
|
75 |
|
|
|
76 |
|
|
4'b0101 : if (calc_sz==4) begin resa4[31:0] <= {4'b0000,opa[31:4]}; co4<=ci; resb4<=opb; end else // shr
|
77 |
|
|
if (calc_sz==2) begin resa4[15:0] <= {4'b0000,opa[15:4]}; co4<=ci; resb4<=opb; resa4[31:16]<=opa[31:16]; end else
|
78 |
|
|
begin resa4[ 7:0] <= {4'b0000,opa[ 7:4]}; co4<=ci; resb4<=opb; resa4[31: 8]<=opa[31: 8]; end
|
79 |
|
|
|
80 |
|
|
4'b0111 : if (calc_sz==4) begin resa4[31:0] <= {opa[31],opa[31],opa[31],opa[31],opa[31:4]}; co4<=ci; resb4<=opb; end else // sar
|
81 |
|
|
if (calc_sz==2) begin resa4[15:0] <= {opa[15],opa[15],opa[15],opa[15],opa[15:4]}; co4<=ci; resb4<=opb; resa4[31:16]<=opa[31:16]; end else
|
82 |
|
|
begin resa4[ 7:0] <= {opa[ 7],opa[ 7],opa[ 7],opa[ 7],opa[ 7:4]}; co4<=ci; resb4<=opb; resa4[31: 8]<=opa[31: 8]; end
|
83 |
|
|
|
84 |
|
|
4'b1000 : if (calc_sz==4) begin resa4[31:0] <= {opa[31],opa[31],opa[31],opa[31],opa[31:4]}; {resb4[31:0],co4} <= {opa[3:0],opb[31:3]}; end else // shrd
|
85 |
|
|
begin resa4[15:0] <= {opa[15],opa[15],opa[15],opa[15],opa[15:4]}; {resb4[15:0],co4} <= {opa[3:0],opb[15:3]}; resa4[31:16]<=opa[31:16]; resb4[31:16]<=opb[31:16]; end
|
86 |
|
|
|
87 |
|
|
4'b1001 : if (calc_sz==4) begin resa4[31:0] <= {opa[27:0],opa[0],opa[0],opa[0],opa[0]}; {co4,resb4[31:0]} <= {opb[28:0],opa[31:28]}; end else // shld
|
88 |
|
|
begin resa4[15:0] <= {opa[11:0],opa[0],opa[0],opa[0],opa[0]}; {co4,resb4[15:0]} <= {opb[12:0],opa[15:12]}; resa4[31:16]<=opa[31:16]; resb4[31:16]<=opb[31:16]; end
|
89 |
|
|
|
90 |
|
|
default : begin co4<=ci; resb4<=opb; resa4 <= opa; end
|
91 |
|
|
endcase
|
92 |
|
|
|
93 |
|
|
endmodule
|