| // LUT and DFF are combined to a GENERIC_SLICE |
| |
| module LUT #( |
| parameter K = 4, |
| parameter [2**K-1:0] INIT = 0 |
| ) ( |
| input [K-1:0] I, |
| output Q |
| ); |
| wire [K-1:0] I_pd; |
| |
| genvar ii; |
| generate |
| for (ii = 0; ii < K; ii = ii + 1'b1) |
| assign I_pd[ii] = (I[ii] === 1'bz) ? 1'b0 : I[ii]; |
| endgenerate |
| |
| assign Q = INIT[I_pd]; |
| endmodule |
| |
| module DFF ( |
| input CLK, D, |
| output reg Q |
| ); |
| initial Q = 1'b0; |
| always @(posedge CLK) |
| Q <= D; |
| endmodule |
| |
| module GENERIC_SLICE #( |
| parameter K = 4, |
| parameter [2**K-1:0] INIT = 0, |
| parameter FF_USED = 1'b0 |
| ) ( |
| input CLK, |
| input [K-1:0] I, |
| output F, |
| output Q |
| ); |
| wire f_wire; |
| |
| LUT #(.K(K), .INIT(INIT)) lut_i(.I(I), .Q(f_wire)); |
| |
| DFF dff_i(.CLK(CLK), .D(f_wire), .Q(Q)); |
| |
| assign F = f_wire; |
| endmodule |
| |
| module GENERIC_IOB #( |
| parameter INPUT_USED = 1'b0, |
| parameter OUTPUT_USED = 1'b0, |
| parameter ENABLE_USED = 1'b0 |
| ) ( |
| inout PAD, |
| input I, EN, |
| output O |
| ); |
| generate if (OUTPUT_USED && ENABLE_USED) |
| assign PAD = EN ? I : 1'bz; |
| else if (OUTPUT_USED) |
| assign PAD = I; |
| endgenerate |
| |
| generate if (INPUT_USED) |
| assign O = PAD; |
| endgenerate |
| endmodule |