165 lines
3.5 KiB
Coq
165 lines
3.5 KiB
Coq
|
//////////////////////////
|
||
|
// arithmetic //
|
||
|
//////////////////////////
|
||
|
|
||
|
module \$alu (A, B, CI, BI, X, Y, CO);
|
||
|
|
||
|
parameter A_SIGNED = 0;
|
||
|
parameter B_SIGNED = 0;
|
||
|
parameter A_WIDTH = 1;
|
||
|
parameter B_WIDTH = 1;
|
||
|
parameter Y_WIDTH = 1;
|
||
|
|
||
|
input [A_WIDTH-1:0] A;
|
||
|
input [B_WIDTH-1:0] B;
|
||
|
output [Y_WIDTH:0] X, Y;
|
||
|
|
||
|
input CI, BI;
|
||
|
output [Y_WIDTH:0] CO;
|
||
|
|
||
|
wire [Y_WIDTH-1:0] AA, BB;
|
||
|
wire [1024:0] _TECHMAP_DO_ = "splitnets CARRY; clean";
|
||
|
|
||
|
generate
|
||
|
if (A_SIGNED && B_SIGNED) begin:BLOCK1
|
||
|
assign AA = $signed(A), BB = BI ? ~$signed(B) : $signed(B);
|
||
|
end else begin:BLOCK2
|
||
|
assign AA = $unsigned(A), BB = BI ? ~$unsigned(B) : $unsigned(B);
|
||
|
end
|
||
|
endgenerate
|
||
|
|
||
|
wire [Y_WIDTH: 0 ] CARRY;
|
||
|
assign CARRY[0] = CI;
|
||
|
|
||
|
genvar i;
|
||
|
generate for (i = 0; i < Y_WIDTH - 1; i = i+1) begin:gen3
|
||
|
adder my_adder (
|
||
|
.cin (CARRY[i]),
|
||
|
.cout (CARRY[i+1]),
|
||
|
.a (AA[i]),
|
||
|
.b (BB[i]),
|
||
|
.sumout (Y[i])
|
||
|
);
|
||
|
end endgenerate
|
||
|
|
||
|
generate if ((Y_WIDTH -1) % 20 == 0) begin:gen4
|
||
|
assign Y[Y_WIDTH-1] = CARRY[Y_WIDTH-1];
|
||
|
end else begin:gen5
|
||
|
adder my_adder (
|
||
|
.cin (CARRY[Y_WIDTH - 1]),
|
||
|
.cout (CARRY[Y_WIDTH]),
|
||
|
.a (1'b0),
|
||
|
.b (1'b0),
|
||
|
.sumout (Y[Y_WIDTH -1])
|
||
|
);
|
||
|
end
|
||
|
endgenerate
|
||
|
endmodule
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
module \$fa (A, B, C, X, Y);
|
||
|
|
||
|
parameter A_SIGNED = 0;
|
||
|
parameter B_SIGNED = 0;
|
||
|
parameter A_WIDTH = 1;
|
||
|
parameter B_WIDTH = 1;
|
||
|
parameter Y_WIDTH = 1;
|
||
|
|
||
|
input [A_WIDTH-1:0] A;
|
||
|
input [B_WIDTH-1:0] B;
|
||
|
input C;
|
||
|
output [Y_WIDTH:0] X, Y;
|
||
|
|
||
|
wire [Y_WIDTH-1:0] AA, BB;
|
||
|
wire [1024:0] _TECHMAP_DO_ = "splitnets CARRY; clean";
|
||
|
|
||
|
generate
|
||
|
if (A_SIGNED && B_SIGNED) begin:BLOCK1
|
||
|
assign AA = $signed(A), BB = $signed(B);
|
||
|
end else begin:BLOCK2
|
||
|
assign AA = $unsigned(A), BB = $unsigned(B);
|
||
|
end
|
||
|
endgenerate
|
||
|
|
||
|
wire [Y_WIDTH: 0 ] CARRY;
|
||
|
assign CARRY[0] = C;
|
||
|
|
||
|
genvar i;
|
||
|
generate for (i = 0; i < Y_WIDTH - 1; i = i+1) begin:gen3
|
||
|
adder my_adder (
|
||
|
.cin (CARRY[i]),
|
||
|
.cout (CARRY[i+1]),
|
||
|
.a (AA[i]),
|
||
|
.b (BB[i]),
|
||
|
.sumout (Y[i])
|
||
|
);
|
||
|
end endgenerate
|
||
|
|
||
|
generate if ((Y_WIDTH -1) % 20 == 0) begin:gen4
|
||
|
assign Y[Y_WIDTH-1] = CARRY[Y_WIDTH-1];
|
||
|
end else begin:gen5
|
||
|
adder my_adder (
|
||
|
.cin (CARRY[Y_WIDTH - 1]),
|
||
|
.cout (CARRY[Y_WIDTH]),
|
||
|
.a (1'b0),
|
||
|
.b (1'b0),
|
||
|
.sumout (Y[Y_WIDTH -1])
|
||
|
);
|
||
|
end
|
||
|
endgenerate
|
||
|
endmodule
|
||
|
|
||
|
//---------------------------------------------------------
|
||
|
|
||
|
module \$add (A, B, Y);
|
||
|
|
||
|
parameter A_SIGNED = 0;
|
||
|
parameter B_SIGNED = 0;
|
||
|
parameter A_WIDTH = 1;
|
||
|
parameter B_WIDTH = 1;
|
||
|
parameter Y_WIDTH = 1;
|
||
|
|
||
|
input [A_WIDTH-1:0] A;
|
||
|
input [B_WIDTH-1:0] B;
|
||
|
output [Y_WIDTH:0] Y;
|
||
|
|
||
|
wire [Y_WIDTH-1:0] AA, BB;
|
||
|
wire [1024:0] _TECHMAP_DO_ = "splitnets CARRY; clean";
|
||
|
|
||
|
generate
|
||
|
if (A_SIGNED && B_SIGNED) begin:BLOCK1
|
||
|
assign AA = $signed(A), BB = $signed(B);
|
||
|
end else begin:BLOCK2
|
||
|
assign AA = $unsigned(A), BB = $unsigned(B);
|
||
|
end
|
||
|
endgenerate
|
||
|
|
||
|
wire [Y_WIDTH: 0 ] CARRY;
|
||
|
assign CARRY[0] = 1'b0;
|
||
|
|
||
|
genvar i;
|
||
|
generate for (i = 0; i < Y_WIDTH - 1; i = i+1) begin:gen3
|
||
|
adder my_adder (
|
||
|
.cin (CARRY[i]),
|
||
|
.cout (CARRY[i+1]),
|
||
|
.a (AA[i]),
|
||
|
.b (BB[i]),
|
||
|
.sumout (Y[i])
|
||
|
);
|
||
|
end endgenerate
|
||
|
|
||
|
generate if ((Y_WIDTH -1) % 20 == 0) begin:gen4
|
||
|
assign Y[Y_WIDTH-1] = CARRY[Y_WIDTH-1];
|
||
|
end else begin:gen5
|
||
|
adder my_adder (
|
||
|
.cin (CARRY[Y_WIDTH - 1]),
|
||
|
.cout (CARRY[Y_WIDTH]),
|
||
|
.a (1'b0),
|
||
|
.b (1'b0),
|
||
|
.sumout (Y[Y_WIDTH -1])
|
||
|
);
|
||
|
end
|
||
|
endgenerate
|
||
|
endmodule
|