mrg | 9e8c375 | 2021-06-14 08:22:13 -0700 | [diff] [blame] | 1 | `include "openram_defines.v" |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 2 | |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 3 | module openram_testchip( |
| 4 | `ifdef USE_POWER_PINS |
| 5 | inout vdda1, // User area 1 3.3V supply |
| 6 | inout vdda2, // User area 2 3.3V supply |
| 7 | inout vssa1, // User area 1 analog ground |
| 8 | inout vssa2, // User area 2 analog ground |
| 9 | inout vccd1, // User area 1 1.8V supply |
| 10 | inout vccd2, // User area 2 1.8v supply |
| 11 | inout vssd1, // User area 1 digital ground |
| 12 | inout vssd2, // User area 2 digital ground |
| 13 | `endif |
mrg | 8188070 | 2021-06-16 20:34:50 -0700 | [diff] [blame] | 14 | input resetn, |
mrg | 0d14b0b | 2021-06-17 11:22:43 -0700 | [diff] [blame] | 15 | input clk, |
mrg | 8188070 | 2021-06-16 20:34:50 -0700 | [diff] [blame] | 16 | input la_in_load, |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 17 | input la_sram_load, |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 18 | input [`TOTAL_SIZE-1:0] la_data_in, |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 19 | // GPIO bit to clock control register |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 20 | input gpio_in, |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 21 | input gpio_scan, |
| 22 | input gpio_sram_load, |
mrg | ad78217 | 2021-06-17 16:48:55 -0700 | [diff] [blame] | 23 | input global_csb, |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 24 | // SRAM data outputs to be captured |
mrg | b8597a7 | 2021-06-14 16:54:36 -0700 | [diff] [blame] | 25 | input [`DATA_SIZE-1:0] sram0_data0, |
| 26 | input [`DATA_SIZE-1:0] sram0_data1, |
| 27 | input [`DATA_SIZE-1:0] sram1_data0, |
| 28 | input [`DATA_SIZE-1:0] sram1_data1, |
| 29 | input [`DATA_SIZE-1:0] sram2_data0, |
| 30 | input [`DATA_SIZE-1:0] sram2_data1, |
| 31 | input [`DATA_SIZE-1:0] sram3_data0, |
| 32 | input [`DATA_SIZE-1:0] sram3_data1, |
| 33 | input [`DATA_SIZE-1:0] sram4_data0, |
| 34 | input [`DATA_SIZE-1:0] sram4_data1, |
| 35 | input [`DATA_SIZE-1:0] sram5_data0, |
| 36 | input [`DATA_SIZE-1:0] sram5_data1, |
| 37 | input [`DATA_SIZE-1:0] sram6_data0, |
| 38 | input [`DATA_SIZE-1:0] sram6_data1, |
| 39 | input [`DATA_SIZE-1:0] sram7_data0, |
| 40 | input [`DATA_SIZE-1:0] sram7_data1, |
| 41 | input [`DATA_SIZE-1:0] sram8_data0, |
| 42 | input [`DATA_SIZE-1:0] sram8_data1, |
| 43 | input [`DATA_SIZE-1:0] sram9_data0, |
| 44 | input [`DATA_SIZE-1:0] sram9_data1, |
| 45 | input [`DATA_SIZE-1:0] sram10_data0, |
| 46 | input [`DATA_SIZE-1:0] sram10_data1, |
| 47 | input [`DATA_SIZE-1:0] sram11_data0, |
| 48 | input [`DATA_SIZE-1:0] sram11_data1, |
| 49 | input [`DATA_SIZE-1:0] sram12_data0, |
| 50 | input [`DATA_SIZE-1:0] sram12_data1, |
| 51 | input [`DATA_SIZE-1:0] sram13_data0, |
| 52 | input [`DATA_SIZE-1:0] sram13_data1, |
| 53 | input [`DATA_SIZE-1:0] sram14_data0, |
| 54 | input [`DATA_SIZE-1:0] sram14_data1, |
| 55 | input [`DATA_SIZE-1:0] sram15_data0, |
| 56 | input [`DATA_SIZE-1:0] sram15_data1, |
mrg | 8188070 | 2021-06-16 20:34:50 -0700 | [diff] [blame] | 57 | |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 58 | // Shared control/data to the SRAMs |
mrg | 4a0200e | 2021-06-17 16:45:35 -0700 | [diff] [blame] | 59 | output reg [`ADDR_SIZE-1:0] addr0, |
| 60 | output reg [`DATA_SIZE-1:0] din0, |
| 61 | output reg web0, |
| 62 | output reg [`WMASK_SIZE-1:0] wmask0, |
| 63 | output reg [`ADDR_SIZE-1:0] addr1, |
| 64 | output reg [`DATA_SIZE-1:0] din1, |
| 65 | output reg web1, |
| 66 | output reg [`WMASK_SIZE-1:0] wmask1, |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 67 | // One CSB for each SRAM |
mrg | 9e8c375 | 2021-06-14 08:22:13 -0700 | [diff] [blame] | 68 | // One CSB for each SRAM |
mrg | 4a0200e | 2021-06-17 16:45:35 -0700 | [diff] [blame] | 69 | output reg [`MAX_CHIPS-1:0] csb0, |
| 70 | output reg [`MAX_CHIPS-1:0] csb1, |
mrg | 8188070 | 2021-06-16 20:34:50 -0700 | [diff] [blame] | 71 | |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 72 | output reg [`TOTAL_SIZE-1:0] la_data_out, |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 73 | output reg gpio_out |
| 74 | ); |
| 75 | |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 76 | // Store input instruction |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 77 | reg [`TOTAL_SIZE-1:0] sram_register; |
| 78 | reg csb0_temp; |
| 79 | reg csb1_temp; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 80 | |
mrg | 9e8c375 | 2021-06-14 08:22:13 -0700 | [diff] [blame] | 81 | // Mux output to connect final output data |
| 82 | // into sram_register |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 83 | reg [`DATA_SIZE-1:0] read_data0; |
| 84 | reg [`DATA_SIZE-1:0] read_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 85 | |
mrg | 9e8c375 | 2021-06-14 08:22:13 -0700 | [diff] [blame] | 86 | // SRAM input connections |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 87 | reg [`SELECT_SIZE-1:0] chip_select; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 88 | |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 89 | always @ (posedge clk) begin |
mrg | 8188070 | 2021-06-16 20:34:50 -0700 | [diff] [blame] | 90 | if(!resetn) begin |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 91 | sram_register <= {`TOTAL_SIZE{1'b0}}; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 92 | end |
| 93 | // GPIO scanning for transfer |
| 94 | else if(gpio_scan) begin |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 95 | sram_register <= {sram_register[`TOTAL_SIZE-2:0], gpio_in}; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 96 | end |
| 97 | // LA parallel load |
| 98 | else if(la_in_load) begin |
mrg | 605185e | 2021-06-13 16:02:06 -0700 | [diff] [blame] | 99 | sram_register <= la_data_in; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 100 | end |
| 101 | // Store results for read out |
| 102 | else if(gpio_sram_load || la_sram_load) begin |
mrg | 8188070 | 2021-06-16 20:34:50 -0700 | [diff] [blame] | 103 | |
| 104 | sram_register <= {sram_register[`TOTAL_SIZE-1:`TOTAL_SIZE-`SELECT_SIZE-`ADDR_SIZE], |
| 105 | read_data0, |
| 106 | sram_register[`ADDR_SIZE+`DATA_SIZE+2*`WMASK_SIZE+3:`DATA_SIZE+`WMASK_SIZE+2], |
| 107 | read_data1, |
AmoghLonkar | 4b706b1 | 2021-06-15 12:40:41 -0700 | [diff] [blame] | 108 | sram_register[`WMASK_SIZE+1:0]}; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 109 | end |
| 110 | end |
| 111 | |
mrg | 0d14b0b | 2021-06-17 11:22:43 -0700 | [diff] [blame] | 112 | |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 113 | // Splitting register bits into fields |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 114 | always @(*) begin |
AmoghLonkar | dca58fa | 2021-06-15 12:46:11 -0700 | [diff] [blame] | 115 | chip_select = sram_register[`TOTAL_SIZE-1:`TOTAL_SIZE-`SELECT_SIZE]; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 116 | |
mrg | 4a0200e | 2021-06-17 16:45:35 -0700 | [diff] [blame] | 117 | addr0 = sram_register[`TOTAL_SIZE-`SELECT_SIZE-1:`TOTAL_SIZE-`SELECT_SIZE-`ADDR_SIZE]; |
| 118 | din0 = sram_register[`DATA_SIZE+`PORT_SIZE+`WMASK_SIZE+1:`PORT_SIZE+`WMASK_SIZE+2]; |
mrg | ad78217 | 2021-06-17 16:48:55 -0700 | [diff] [blame] | 119 | csb0_temp = global_csb | sram_register[`PORT_SIZE+`WMASK_SIZE+1]; |
mrg | 4a0200e | 2021-06-17 16:45:35 -0700 | [diff] [blame] | 120 | web0 = sram_register[`PORT_SIZE+`WMASK_SIZE]; |
| 121 | wmask0 = sram_register[`PORT_SIZE+`WMASK_SIZE-1:`PORT_SIZE]; |
mrg | 8188070 | 2021-06-16 20:34:50 -0700 | [diff] [blame] | 122 | |
mrg | 4a0200e | 2021-06-17 16:45:35 -0700 | [diff] [blame] | 123 | addr1 = sram_register[`PORT_SIZE-1:`DATA_SIZE+`WMASK_SIZE+2]; |
| 124 | din1 = sram_register[`DATA_SIZE+`WMASK_SIZE+1:`WMASK_SIZE+2]; |
mrg | ad78217 | 2021-06-17 16:48:55 -0700 | [diff] [blame] | 125 | csb1_temp = global_csb | sram_register[`WMASK_SIZE+1]; |
mrg | 4a0200e | 2021-06-17 16:45:35 -0700 | [diff] [blame] | 126 | web1 = sram_register[`WMASK_SIZE]; |
| 127 | wmask1 = sram_register[`WMASK_SIZE-1:0]; |
mrg | 8188070 | 2021-06-16 20:34:50 -0700 | [diff] [blame] | 128 | end |
| 129 | |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 130 | // Apply the correct CSB |
| 131 | always @(*) begin |
mrg | 4a0200e | 2021-06-17 16:45:35 -0700 | [diff] [blame] | 132 | csb0 = ~( (~{15'b111111111111111, csb0_temp}) << chip_select); |
| 133 | csb1 = ~( (~{15'b111111111111111, csb1_temp}) << chip_select); |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 134 | end |
mrg | 8188070 | 2021-06-16 20:34:50 -0700 | [diff] [blame] | 135 | |
| 136 | // Mux value of correct SRAM data input to feed into |
| 137 | // DFF clocked by la/gpio clk |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 138 | always @ (*) begin |
| 139 | case(chip_select) |
| 140 | 4'd0: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 141 | read_data0 = sram0_data0; |
| 142 | read_data1 = sram0_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 143 | end |
| 144 | 4'd1: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 145 | read_data0 = sram1_data0; |
| 146 | read_data1 = sram1_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 147 | end |
| 148 | 4'd2: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 149 | read_data0 = sram2_data0; |
| 150 | read_data1 = sram2_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 151 | end |
| 152 | 4'd3: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 153 | read_data0 = sram3_data0; |
| 154 | read_data1 = sram3_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 155 | end |
| 156 | 4'd4: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 157 | read_data0 = sram4_data0; |
| 158 | read_data1 = sram4_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 159 | end |
| 160 | 4'd5: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 161 | read_data0 = sram5_data0; |
| 162 | read_data1 = sram5_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 163 | end |
| 164 | 4'd6: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 165 | read_data0 = sram6_data0; |
| 166 | read_data1 = sram6_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 167 | end |
| 168 | 4'd7: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 169 | read_data0 = sram7_data0; |
| 170 | read_data1 = sram7_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 171 | end |
| 172 | 4'd8: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 173 | read_data0 = sram8_data0; |
| 174 | read_data1 = sram8_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 175 | end |
| 176 | 4'd9: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 177 | read_data0 = sram9_data0; |
| 178 | read_data1 = sram9_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 179 | end |
| 180 | 4'd10: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 181 | read_data0 = sram10_data0; |
| 182 | read_data1 = sram10_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 183 | end |
| 184 | 4'd11: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 185 | read_data0 = sram11_data0; |
| 186 | read_data1 = sram11_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 187 | end |
| 188 | 4'd12: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 189 | read_data0 = sram12_data0; |
| 190 | read_data1 = sram12_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 191 | end |
| 192 | 4'd13: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 193 | read_data0 = sram13_data0; |
| 194 | read_data1 = sram13_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 195 | end |
| 196 | 4'd14: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 197 | read_data0 = sram14_data0; |
| 198 | read_data1 = sram14_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 199 | end |
| 200 | 4'd15: begin |
AmoghLonkar | f11d9b5 | 2021-06-14 18:23:01 -0700 | [diff] [blame] | 201 | read_data0 = sram15_data0; |
| 202 | read_data1 = sram15_data1; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 203 | end |
| 204 | endcase |
| 205 | end |
| 206 | |
| 207 | // Output logic |
| 208 | always @ (*) begin |
mrg | 0c951e1 | 2021-06-13 17:02:00 -0700 | [diff] [blame] | 209 | gpio_out = sram_register[`TOTAL_SIZE-1]; |
AmoghLonkar | 4b706b1 | 2021-06-15 12:40:41 -0700 | [diff] [blame] | 210 | la_data_out = sram_register; |
mrg | b40bbc7 | 2021-06-13 13:54:57 -0700 | [diff] [blame] | 211 | end |
| 212 | |
| 213 | endmodule |