ecp5: Remove TRELLIS_SLICE and add TRELLIS_COMB model

Signed-off-by: gatecat <gatecat@ds0.me>
This commit is contained in:
gatecat 2023-04-06 09:29:08 +02:00 committed by Lofty
parent 0f5e7c244d
commit 266f81816b
1 changed files with 30 additions and 160 deletions

View File

@ -413,177 +413,47 @@ endmodule
// --------------------------------------- // ---------------------------------------
module TRELLIS_SLICE( module TRELLIS_COMB(
input A0, B0, C0, D0, input A, B, C, D, M,
input A1, B1, C1, D1, input FCI, F1, FXA, FXB,
input M0, M1, input WD,
input FCI, FXA, FXB,
input CLK, LSR, CE,
input DI0, DI1,
input WD0, WD1,
input WAD0, WAD1, WAD2, WAD3, input WAD0, WAD1, WAD2, WAD3,
input WRE, WCK, input WRE, WCK,
output F, FCO, OFX
output F0, Q0,
output F1, Q1,
output FCO, OFX0, OFX1,
output WDO0, WDO1, WDO2, WDO3,
output WADO0, WADO1, WADO2, WADO3
); );
parameter MODE = "LOGIC"; parameter MODE = "LOGIC";
parameter GSR = "ENABLED"; parameter INITVAL = 16'h0;
parameter SRMODE = "LSR_OVER_CE"; parameter CCU2_INJECT1 = "NO";
parameter [127:0] CEMUX = "1";
parameter CLKMUX = "CLK";
parameter LSRMUX = "LSR";
parameter LUT0_INITVAL = 16'h0000;
parameter LUT1_INITVAL = 16'h0000;
parameter REG0_SD = "0";
parameter REG1_SD = "0";
parameter REG0_REGSET = "RESET";
parameter REG1_REGSET = "RESET";
parameter REG0_LSRMODE = "LSR";
parameter REG1_LSRMODE = "LSR";
parameter [127:0] CCU2_INJECT1_0 = "NO";
parameter [127:0] CCU2_INJECT1_1 = "NO";
parameter WREMUX = "WRE"; parameter WREMUX = "WRE";
parameter WCKMUX = "WCK"; parameter IS_Z1 = 1'b0;
parameter A0MUX = "A0";
parameter A1MUX = "A1";
parameter B0MUX = "B0";
parameter B1MUX = "B1";
parameter C0MUX = "C0";
parameter C1MUX = "C1";
parameter D0MUX = "D0";
parameter D1MUX = "D1";
wire A0m, B0m, C0m, D0m;
wire A1m, B1m, C1m, D1m;
generate generate
if (A0MUX == "1") assign A0m = 1'b1; else assign A0m = A0; if (MODE == "LOGIC") begin: mode_logic
if (B0MUX == "1") assign B0m = 1'b1; else assign B0m = B0; LUT4 #(.INIT(INITVAL)) lut4 (.A(A), .B(B), .C(C), .D(D), .Z(F));
if (C0MUX == "1") assign C0m = 1'b1; else assign C0m = C0; end else if (MODE == "CCU2") begin: mode_ccu2
if (D0MUX == "1") assign D0m = 1'b1; else assign D0m = D0; wire l4o, l2o;
if (A1MUX == "1") assign A1m = 1'b1; else assign A1m = A1; LUT4 #(.INIT(INITVAL)) lut4_0(.A(A), .B(B), .C(C), .D(D), .Z(l4o));
if (B1MUX == "1") assign B1m = 1'b1; else assign B1m = B1; LUT2 #(.INIT(INITVAL[3:0])) lut2_0(.A(A), .B(B), .Z(l2o));
if (C1MUX == "1") assign C1m = 1'b1; else assign C1m = C1; wire gated_cin_0 = (CCU2_INJECT1 == "YES") ? 1'b0 : FCI;
if (D1MUX == "1") assign D1m = 1'b1; else assign D1m = D1; assign F = l4o ^ gated_cin_0;
wire gated_lut2_0 = (CCU2_INJECT1 == "YES") ? 1'b0 : l2o;
endgenerate wire FCO = (~l4o & gated_lut2_0) | (l4o & FCI);
end else if (MODE == "DPRAM") begin: mode_dpram
function [15:0] permute_initval; reg [15:0] ram = INITVAL;
input [15:0] initval; always @(posedge WCK)
integer i; if (WRE)
begin ram[{WAD3, WAD2, WAD1, WAD0}] <= WD;
for (i = 0; i < 16; i = i + 1) begin assign F = ram[{A, C, B, D}];
permute_initval[{i[0], i[2], i[1], i[3]}] = initval[i];
end
end
endfunction
generate
if (MODE == "LOGIC") begin
// LUTs
LUT4 #(
.INIT(LUT0_INITVAL)
) lut4_0 (
.A(A0m), .B(B0m), .C(C0m), .D(D0m),
.Z(F0)
);
LUT4 #(
.INIT(LUT1_INITVAL)
) lut4_1 (
.A(A1m), .B(B1m), .C(C1m), .D(D1m),
.Z(F1)
);
// LUT expansion muxes
PFUMX lut5_mux (.ALUT(F1), .BLUT(F0), .C0(M0), .Z(OFX0));
L6MUX21 lutx_mux (.D0(FXA), .D1(FXB), .SD(M1), .Z(OFX1));
end else if (MODE == "CCU2") begin
CCU2C #(
.INIT0(LUT0_INITVAL),
.INIT1(LUT1_INITVAL),
.INJECT1_0(CCU2_INJECT1_0),
.INJECT1_1(CCU2_INJECT1_1)
) ccu2c_i (
.CIN(FCI),
.A0(A0m), .B0(B0m), .C0(C0m), .D0(D0m),
.A1(A1m), .B1(B1m), .C1(C1m), .D1(D1m),
.S0(F0), .S1(F1),
.COUT(FCO)
);
end else if (MODE == "RAMW") begin
assign WDO0 = C1m;
assign WDO1 = A1m;
assign WDO2 = D1m;
assign WDO3 = B1m;
assign WADO0 = D0m;
assign WADO1 = B0m;
assign WADO2 = C0m;
assign WADO3 = A0m;
end else if (MODE == "DPRAM") begin
TRELLIS_RAM16X2 #(
.INITVAL_0(permute_initval(LUT0_INITVAL)),
.INITVAL_1(permute_initval(LUT1_INITVAL)),
.WREMUX(WREMUX)
) ram_i (
.DI0(WD0), .DI1(WD1),
.WAD0(WAD0), .WAD1(WAD1), .WAD2(WAD2), .WAD3(WAD3),
.WRE(WRE), .WCK(WCK),
.RAD0(D0m), .RAD1(B0m), .RAD2(C0m), .RAD3(A0m),
.DO0(F0), .DO1(F1)
);
// TODO: confirm RAD and INITVAL ordering
// DPRAM mode contract?
`ifdef FORMAL
always @(*) begin
assert(A0m==A1m);
assert(B0m==B1m);
assert(C0m==C1m);
assert(D0m==D1m);
end
`endif
end else begin end else begin
ERROR_UNKNOWN_SLICE_MODE error(); $error("unsupported COMB mode %s", MODE);
end end
if (IS_Z1)
L6MUX21 lutx_mux (.D0(FXA), .D1(FXB), .SD(M), .Z(OFX));
else
PFUMX lut5_mux (.ALUT(F1), .BLUT(F), .C0(M), .Z(OFX));
endgenerate endgenerate
// FF input selection muxes
wire muxdi0 = (REG0_SD == "1") ? DI0 : M0;
wire muxdi1 = (REG1_SD == "1") ? DI1 : M1;
// Flipflops
TRELLIS_FF #(
.GSR(GSR),
.CEMUX(CEMUX),
.CLKMUX(CLKMUX),
.LSRMUX(LSRMUX),
.SRMODE(SRMODE),
.REGSET(REG0_REGSET),
.LSRMODE(REG0_LSRMODE)
) ff_0 (
.CLK(CLK), .LSR(LSR), .CE(CE),
.DI(muxdi0), .M(M0),
.Q(Q0)
);
TRELLIS_FF #(
.GSR(GSR),
.CEMUX(CEMUX),
.CLKMUX(CLKMUX),
.LSRMUX(LSRMUX),
.SRMODE(SRMODE),
.REGSET(REG1_REGSET),
.LSRMODE(REG1_LSRMODE)
) ff_1 (
.CLK(CLK), .LSR(LSR), .CE(CE),
.DI(muxdi1), .M(M1),
.Q(Q1)
);
endmodule endmodule
(* blackbox *) (* blackbox *)