mirror of https://github.com/YosysHQ/yosys.git
[wip] DSP48E1 sim model improvements
Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
parent
c43b0c4b49
commit
fe95807f16
|
@ -382,9 +382,9 @@ endmodule
|
||||||
module DSP48E1 (
|
module DSP48E1 (
|
||||||
output [29:0] ACOUT,
|
output [29:0] ACOUT,
|
||||||
output [17:0] BCOUT,
|
output [17:0] BCOUT,
|
||||||
output CARRYCASCOUT,
|
output reg CARRYCASCOUT,
|
||||||
output [3:0] CARRYOUT,
|
output reg [3:0] CARRYOUT,
|
||||||
output MULTSIGNOUT,
|
output reg MULTSIGNOUT,
|
||||||
output OVERFLOW,
|
output OVERFLOW,
|
||||||
output reg signed [47:0] P,
|
output reg signed [47:0] P,
|
||||||
output PATTERNBDETECT,
|
output PATTERNBDETECT,
|
||||||
|
@ -669,13 +669,70 @@ module DSP48E1 (
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
|
||||||
|
// ALU core
|
||||||
|
|
||||||
wire alu_cin = 1'b0; // FIXME*
|
wire alu_cin = 1'b0; // FIXME*
|
||||||
|
|
||||||
wire [47:0] Z_muxinv = ALUMODEr[0] ? ~Z : Z;
|
wire [47:0] Z_muxinv = ALUMODEr[0] ? ~Z : Z;
|
||||||
wire [47:0] xor_xyz = X ^ Y ^ Z_muxinv;
|
wire [47:0] xor_xyz = X ^ Y ^ Z_muxinv;
|
||||||
wire [47:0] maj_xyz = (X & Y) | (X & Z) | (X & Y);
|
wire [47:0] maj_xyz = (X & Y) | (X & Z) | (X & Y);
|
||||||
|
|
||||||
|
wire [47:0] xor_xyz_muxed = ALUMODEr[3] ? maj_xyz : xor_xyz;
|
||||||
|
wire [47:0] maj_xyz_gated = ALUMODEr[2] ? 48'b0 : maj_xyz;
|
||||||
|
|
||||||
|
wire [48:0] maj_xyz_simd_gated;
|
||||||
|
wire [3:0] int_carry_in, int_carry_out, ext_carry_out;
|
||||||
|
wire [47:0] alu_sum;
|
||||||
|
assign int_carry_in[0] = 1'b0;
|
||||||
|
|
||||||
|
generate
|
||||||
|
if (USE_SIMD == "FOUR12") begin
|
||||||
|
assign maj_xyz_simd_gated = {
|
||||||
|
maj_xyz_gated[47:36],
|
||||||
|
1'b0, maj_xyz_gated[34:24],
|
||||||
|
1'b0, maj_xyz_gated[22:12],
|
||||||
|
1'b0, maj_xyz_gated[10:0],
|
||||||
|
alu_cin
|
||||||
|
};
|
||||||
|
assign int_carry_in[3:1] = 3'b000;
|
||||||
|
assign ext_carry_out = {
|
||||||
|
int_carry_out[3],
|
||||||
|
maj_xyz_gated[35] ^ int_carry_out[2],
|
||||||
|
maj_xyz_gated[23] ^ int_carry_out[1],
|
||||||
|
maj_xyz_gated[11] ^ int_carry_out[0]
|
||||||
|
};
|
||||||
|
end else if (USE_SIMD == "TWO24") begin
|
||||||
|
assign maj_xyz_simd_gated = {
|
||||||
|
maj_xyz_gated[47:24],
|
||||||
|
1'b0, maj_xyz_gated[22:0],
|
||||||
|
alu_cin
|
||||||
|
};
|
||||||
|
assign int_carry_in[3:1] = {int_carry_out[2], 1'b0, int_carry_out[0]};
|
||||||
|
assign ext_carry_out = {
|
||||||
|
int_carry_out[3],
|
||||||
|
1'bx,
|
||||||
|
maj_xyz_gated[23] ^ int_carry_out[1],
|
||||||
|
1'bx
|
||||||
|
};
|
||||||
|
end else if (USE_SIMD == "FOUR48") begin
|
||||||
|
assign maj_xyz_simd_gated = {maj_xyz_gated, alu_cin};
|
||||||
|
assign int_carry_in[3:1] = int_carry_out[2:0];
|
||||||
|
assign ext_carry_out = {
|
||||||
|
int_carry_out[3],
|
||||||
|
3'bxxx
|
||||||
|
};
|
||||||
|
end
|
||||||
|
|
||||||
|
genvar i;
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
assign {int_carry_out[i], alu_sum[i*12 +: 12]} = {1'b0, maj_xyz_simd_gated[i*12 +: ((i == 3) ? 13 : 12)]}
|
||||||
|
+ xor_xyz_muxed[i*12 +: 12] + int_carry_in[i];
|
||||||
|
endgenerate
|
||||||
|
|
||||||
|
wire signed [47:0] Pd = ALUMODEr[1] ? ~alu_sum : alu_sum;
|
||||||
|
wire [3:0] CARRYOUTd = (ALUMODEr[0] & ALUMODEr[1]) ? ~ext_carry_out : ext_carry_out;
|
||||||
|
wire CARRYCASCOUTd = ext_carry_out[3];
|
||||||
|
wire MULTSIGNOUTd = Mr[42];
|
||||||
|
|
||||||
always @* begin
|
always @* begin
|
||||||
`ifdef __ICARUS__
|
`ifdef __ICARUS__
|
||||||
|
@ -684,8 +741,27 @@ module DSP48E1 (
|
||||||
end
|
end
|
||||||
|
|
||||||
generate
|
generate
|
||||||
if (PREG == 1) begin always @(posedge CLK) if (RSTP) P <= 48'b0; else if (CEP) P <= Mr; end
|
if (PREG == 1) begin
|
||||||
else always @* P <= Mr;
|
always @(posedge CLK)
|
||||||
|
if (RSTP) begin
|
||||||
|
P <= 48'b0;
|
||||||
|
CARRYOUT <= 4'b0;
|
||||||
|
CARRYCASCOUT <= 1'b0;
|
||||||
|
MULTSIGNOUT <= 1'b0;
|
||||||
|
end else if (CEP) begin
|
||||||
|
P <= Pd;
|
||||||
|
CARRYOUT <= CARRYOUTd;
|
||||||
|
CARRYCASCOUT <= CARRYCASCOUTd;
|
||||||
|
MULTSIGNOUT <= MULTSIGNOUTd;
|
||||||
|
end
|
||||||
|
end else begin
|
||||||
|
always @* begin
|
||||||
|
P = Pd;
|
||||||
|
CARRYOUT = CARRYOUTd;
|
||||||
|
CARRYCASCOUT = CARRYCASCOUTd;
|
||||||
|
MULTSIGNOUT = MULTSIGNOUTd;
|
||||||
|
end
|
||||||
|
end
|
||||||
endgenerate
|
endgenerate
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
Loading…
Reference in New Issue