|
| 1 | +`default_nettype none |
| 2 | +/*********************************************************************************************************************** |
| 3 | + * Copyright (C) 2016-2017 Andrew Zonenberg and contributors * |
| 4 | + * * |
| 5 | + * This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General * |
| 6 | + * Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) * |
| 7 | + * any later version. * |
| 8 | + * * |
| 9 | + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * |
| 10 | + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for * |
| 11 | + * more details. * |
| 12 | + * * |
| 13 | + * You should have received a copy of the GNU Lesser General Public License along with this program; if not, you may * |
| 14 | + * find one here: * |
| 15 | + * https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt * |
| 16 | + * or you may search the http://www.gnu.org website for the version 2.1 license, or you may write to the Free Software * |
| 17 | + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA * |
| 18 | + **********************************************************************************************************************/ |
| 19 | + |
| 20 | +/** |
| 21 | + @brief Global routing fabric - the "Zero Power Interconnect Array" |
| 22 | + */ |
| 23 | +module XC2CZIA( |
| 24 | + dedicated_in, ibuf_in, macrocell_in, |
| 25 | + zia_out, |
| 26 | + config_bits); |
| 27 | + |
| 28 | + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 29 | + // Device configuration |
| 30 | + |
| 31 | + parameter MACROCELLS = 32; //A variant implied for 32/64, no support for base version |
| 32 | + |
| 33 | + initial begin |
| 34 | + if(MACROCELLS != 32) begin |
| 35 | + $display("ZIA not implemented for other device densities"); |
| 36 | + $finish; |
| 37 | + end |
| 38 | + end |
| 39 | + |
| 40 | + localparam NUM_IBUFS = 32; //TODO: function or something |
| 41 | + localparam NUM_MCELLS = 32; |
| 42 | + |
| 43 | + localparam BITS_PER_ROW = 8; |
| 44 | + |
| 45 | + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 46 | + // Inputs |
| 47 | + |
| 48 | + input wire dedicated_in; //only present in 32a |
| 49 | + |
| 50 | + input wire[NUM_IBUFS-1:0] ibuf_in; //Inputs (from flipflop or input buffer) |
| 51 | + //{fb2, fb1} |
| 52 | + input wire[NUM_MCELLS-1:0] macrocell_in; //Inputs (from XOR gate or flipflop) |
| 53 | + //{fb2, fb1} |
| 54 | + |
| 55 | + output reg[39:0] zia_out; //40 outputs to the function block |
| 56 | + |
| 57 | + input wire[40 * BITS_PER_ROW-1 : 0] config_bits; //The actual config bitstream for this ZIA block |
| 58 | + |
| 59 | + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 60 | + // Reshuffle the bitstream into proper rows |
| 61 | + |
| 62 | + reg[BITS_PER_ROW-1:0] row_config[39:0]; |
| 63 | + |
| 64 | + integer i; |
| 65 | + always @(*) begin |
| 66 | + for(i=0; i<40; i=i+1) |
| 67 | + assign row_config[i] = config_bits[i*BITS_PER_ROW +: BITS_PER_ROW]; |
| 68 | + end |
| 69 | + |
| 70 | + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 71 | + // Inputs to the ROM muxes |
| 72 | + |
| 73 | + /* |
| 74 | + 64:54 First group (left side, next to VCCINT rail) |
| 75 | + 53:43 Second group |
| 76 | + 42:32 Third group |
| 77 | + 31:21 Fourth group |
| 78 | + 20:10 Fifth group |
| 79 | + 9:0 Sixth group (rightmost) |
| 80 | + */ |
| 81 | + wire[65:0] zbus = |
| 82 | + { |
| 83 | + macrocell_in, |
| 84 | + ibuf_in[31:16], |
| 85 | + dedicated_in, |
| 86 | + ibuf_in[15:0] |
| 87 | + }; |
| 88 | + |
| 89 | + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 90 | + // The ROM muxes (M3-M4 vias) |
| 91 | + |
| 92 | + //This is for the XC2C32A only |
| 93 | + //TODO: do other densities |
| 94 | + wire[7:0] zia_row_inputs[39:0]; |
| 95 | + assign zia_row_inputs[0] = {2'b10, zbus[58], zbus[46], zbus[34], zbus[22], zbus[10], zbus[0]}; |
| 96 | + assign zia_row_inputs[1] = {2'b10, zbus[61], zbus[48], zbus[41], zbus[23], zbus[11], zbus[1]}; |
| 97 | + assign zia_row_inputs[2] = {2'b10, zbus[60], zbus[53], zbus[35], zbus[30], zbus[12], zbus[2]}; |
| 98 | + assign zia_row_inputs[3] = {2'b10, zbus[55], zbus[47], zbus[42], zbus[26], zbus[13], zbus[3]}; |
| 99 | + assign zia_row_inputs[4] = {2'b10, zbus[59], zbus[44], zbus[38], zbus[28], zbus[14], zbus[4]}; |
| 100 | + assign zia_row_inputs[5] = {2'b10, zbus[56], zbus[50], zbus[40], zbus[31], zbus[15], zbus[5]}; |
| 101 | + assign zia_row_inputs[6] = {2'b10, zbus[62], zbus[52], zbus[33], zbus[21], zbus[16], zbus[6]}; |
| 102 | + assign zia_row_inputs[7] = {2'b10, zbus[64], zbus[45], zbus[32], zbus[27], zbus[17], zbus[7]}; |
| 103 | + assign zia_row_inputs[8] = {2'b10, zbus[57], zbus[43], zbus[39], zbus[25], zbus[18], zbus[8]}; |
| 104 | + assign zia_row_inputs[9] = {2'b10, zbus[54], zbus[51], zbus[37], zbus[24], zbus[19], zbus[9]}; |
| 105 | + assign zia_row_inputs[10] = {2'b10, zbus[63], zbus[49], zbus[36], zbus[29], zbus[20], zbus[7]}; |
| 106 | + assign zia_row_inputs[11] = {2'b10, zbus[59], zbus[47], zbus[35], zbus[23], zbus[11], zbus[0]}; |
| 107 | + assign zia_row_inputs[12] = {2'b10, zbus[64], zbus[50], zbus[37], zbus[30], zbus[12], zbus[1]}; |
| 108 | + assign zia_row_inputs[13] = {2'b10, zbus[62], zbus[49], zbus[42], zbus[24], zbus[19], zbus[2]}; |
| 109 | + assign zia_row_inputs[14] = {2'b10, zbus[61], zbus[44], zbus[36], zbus[31], zbus[15], zbus[3]}; |
| 110 | + assign zia_row_inputs[15] = {2'b10, zbus[56], zbus[48], zbus[33], zbus[27], zbus[17], zbus[4]}; |
| 111 | + assign zia_row_inputs[16] = {2'b10, zbus[60], zbus[45], zbus[39], zbus[29], zbus[20], zbus[5]}; |
| 112 | + assign zia_row_inputs[17] = {2'b10, zbus[57], zbus[51], zbus[41], zbus[22], zbus[10], zbus[6]}; |
| 113 | + assign zia_row_inputs[18] = {2'b10, zbus[63], zbus[53], zbus[34], zbus[21], zbus[16], zbus[7]}; |
| 114 | + assign zia_row_inputs[19] = {2'b10, zbus[55], zbus[46], zbus[32], zbus[28], zbus[14], zbus[8]}; |
| 115 | + assign zia_row_inputs[20] = {2'b10, zbus[58], zbus[43], zbus[40], zbus[26], zbus[13], zbus[9]}; |
| 116 | + assign zia_row_inputs[21] = {2'b10, zbus[54], zbus[52], zbus[38], zbus[25], zbus[18], zbus[8]}; |
| 117 | + assign zia_row_inputs[22] = {2'b10, zbus[60], zbus[48], zbus[36], zbus[24], zbus[12], zbus[0]}; |
| 118 | + assign zia_row_inputs[23] = {2'b10, zbus[54], zbus[53], zbus[39], zbus[26], zbus[19], zbus[1]}; |
| 119 | + assign zia_row_inputs[24] = {2'b10, zbus[55], zbus[51], zbus[38], zbus[31], zbus[13], zbus[2]}; |
| 120 | + assign zia_row_inputs[25] = {2'b10, zbus[63], zbus[50], zbus[33], zbus[25], zbus[20], zbus[3]}; |
| 121 | + assign zia_row_inputs[26] = {2'b10, zbus[62], zbus[45], zbus[37], zbus[22], zbus[16], zbus[4]}; |
| 122 | + assign zia_row_inputs[27] = {2'b10, zbus[57], zbus[49], zbus[34], zbus[28], zbus[18], zbus[5]}; |
| 123 | + assign zia_row_inputs[28] = {2'b10, zbus[61], zbus[46], zbus[40], zbus[30], zbus[11], zbus[6]}; |
| 124 | + assign zia_row_inputs[29] = {2'b10, zbus[58], zbus[52], zbus[42], zbus[23], zbus[10], zbus[7]}; |
| 125 | + assign zia_row_inputs[30] = {2'b10, zbus[64], zbus[44], zbus[35], zbus[21], zbus[17], zbus[8]}; |
| 126 | + assign zia_row_inputs[31] = {2'b10, zbus[56], zbus[47], zbus[32], zbus[29], zbus[15], zbus[9]}; |
| 127 | + assign zia_row_inputs[32] = {2'b10, zbus[59], zbus[43], zbus[41], zbus[27], zbus[14], zbus[9]}; |
| 128 | + assign zia_row_inputs[33] = {2'b10, zbus[61], zbus[49], zbus[37], zbus[25], zbus[13], zbus[0]}; |
| 129 | + assign zia_row_inputs[34] = {2'b10, zbus[60], zbus[43], zbus[42], zbus[28], zbus[15], zbus[1]}; |
| 130 | + assign zia_row_inputs[35] = {2'b10, zbus[54], zbus[44], zbus[40], zbus[27], zbus[20], zbus[2]}; |
| 131 | + assign zia_row_inputs[36] = {2'b10, zbus[56], zbus[52], zbus[39], zbus[22], zbus[14], zbus[3]}; |
| 132 | + assign zia_row_inputs[37] = {2'b10, zbus[64], zbus[51], zbus[34], zbus[26], zbus[11], zbus[4]}; |
| 133 | + assign zia_row_inputs[38] = {2'b10, zbus[63], zbus[46], zbus[38], zbus[23], zbus[17], zbus[5]}; |
| 134 | + assign zia_row_inputs[39] = {2'b10, zbus[58], zbus[50], zbus[35], zbus[29], zbus[19], zbus[6]}; |
| 135 | + |
| 136 | + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 137 | + // The SRAM muxes |
| 138 | + |
| 139 | + always @(*) begin |
| 140 | + |
| 141 | + for(i=0; i<40; i=i+1) begin |
| 142 | + |
| 143 | + //The real silicon uses a tristate mux so bus fights are possible if multiple bits are asserted. |
| 144 | + //For the FPGA model, use an if/else cascade to resolve ambiguity (rather than bus fight) |
| 145 | + //Note that bit 7 is active high but the rest are active low. |
| 146 | + //This is done to ensure that a blank bitstream (all 1s) puts the chip in a sane state. |
| 147 | + //TODO: model OGATE properly during the config step? |
| 148 | + if(row_config[i][7]) |
| 149 | + zia_out[i] <= zia_row_inputs[i][7]; |
| 150 | + else if(!row_config[i][6]) |
| 151 | + zia_out[i] <= zia_row_inputs[i][6]; |
| 152 | + else if(!row_config[i][5]) |
| 153 | + zia_out[i] <= zia_row_inputs[i][5]; |
| 154 | + else if(!row_config[i][4]) |
| 155 | + zia_out[i] <= zia_row_inputs[i][4]; |
| 156 | + else if(!row_config[i][3]) |
| 157 | + zia_out[i] <= zia_row_inputs[i][3]; |
| 158 | + else if(!row_config[i][2]) |
| 159 | + zia_out[i] <= zia_row_inputs[i][2]; |
| 160 | + else if(!row_config[i][1]) |
| 161 | + zia_out[i] <= zia_row_inputs[i][1]; |
| 162 | + else if(!row_config[i][0]) |
| 163 | + zia_out[i] <= zia_row_inputs[i][0]; |
| 164 | + |
| 165 | + //Default to 0 if no bits are active. |
| 166 | + //The real silicon has a weak keeper circuit for this |
| 167 | + else |
| 168 | + zia_out[i] <= 0; |
| 169 | + |
| 170 | + end |
| 171 | + |
| 172 | + end |
| 173 | + |
| 174 | +endmodule |
0 commit comments