mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
56 lines
1.7 KiB
Systemverilog
56 lines
1.7 KiB
Systemverilog
module booth(xExt, choose, add1, e, pp);
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
input [53:0] xExt; // multiplicand xExt
|
|
input [2:0] choose; // bits needed to choose which encoding
|
|
output [1:0] add1; // do you add 1
|
|
output e;
|
|
output [54:0] pp; // the resultant encoding
|
|
|
|
logic [54:0] pp, temp;
|
|
logic e;
|
|
logic [1:0] add1;
|
|
logic [53:0] negx;
|
|
//logic temp;
|
|
|
|
assign negx = ~xExt;
|
|
|
|
always @(choose, xExt, negx)
|
|
case (choose)
|
|
3'b000 : pp = 55'b0; // 0
|
|
3'b001 : pp = {xExt[53], xExt}; // 1
|
|
3'b010 : pp = {xExt[53], xExt}; // 1
|
|
3'b011 : pp = {xExt, 1'b0}; // 2
|
|
3'b100 : pp = {negx, 1'b0}; // -2
|
|
3'b101 : pp = {negx[53], negx}; // -1
|
|
3'b110 : pp = {negx[53], negx}; // -1
|
|
3'b111 : pp = 55'hfffffffffffffff; // -0
|
|
endcase
|
|
|
|
always @(choose, xExt, negx)
|
|
case (choose)
|
|
3'b000 : e = 0; // 0
|
|
3'b001 : e = xExt[53]; // 1
|
|
3'b010 : e = xExt[53]; // 1
|
|
3'b011 : e = xExt[53]; // 2
|
|
3'b100 : e = negx[53]; // -2
|
|
3'b101 : e = negx[53]; // -1
|
|
3'b110 : e = negx[53]; // -1
|
|
3'b111 : e = 1; // -0
|
|
endcase
|
|
// assign add1 = (choose[2] == 1'b1) ? ((choose[1:0] == 2'b11) ? 1'b0 : 1'b1) : 1'b0;
|
|
// assign add1 = choose[2];
|
|
always @(choose)
|
|
case (choose)
|
|
3'b000 : add1 = 2'b0; // 0
|
|
3'b001 : add1 = 2'b0; // 1
|
|
3'b010 : add1 = 2'b0; // 1
|
|
3'b011 : add1 = 2'b0; // 2
|
|
3'b100 : add1 = 2'b10; // -2
|
|
3'b101 : add1 = 2'b1; // -1
|
|
3'b110 : add1 = 2'b1; // -1
|
|
3'b111 : add1 = 2'b1; // -0
|
|
endcase
|
|
|
|
endmodule
|