blob: c3622d0ef4ec3853c1e02c29b7f4c006eb9afc7a [file] [log] [blame]
mrg9e8c3752021-06-14 08:22:13 -07001`include "openram_defines.v"
mrg0c951e12021-06-13 17:02:00 -07002
mrgb40bbc72021-06-13 13:54:57 -07003module 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
mrg81880702021-06-16 20:34:50 -070014 input resetn,
mrg0d14b0b2021-06-17 11:22:43 -070015 input clk,
mrg81880702021-06-16 20:34:50 -070016 input la_in_load,
mrgb40bbc72021-06-13 13:54:57 -070017 input la_sram_load,
mrg0c951e12021-06-13 17:02:00 -070018 input [`TOTAL_SIZE-1:0] la_data_in,
mrgb40bbc72021-06-13 13:54:57 -070019 // GPIO bit to clock control register
mrgb40bbc72021-06-13 13:54:57 -070020 input gpio_in,
mrgb40bbc72021-06-13 13:54:57 -070021 input gpio_scan,
22 input gpio_sram_load,
mrgad782172021-06-17 16:48:55 -070023 input global_csb,
mrgb40bbc72021-06-13 13:54:57 -070024 // SRAM data outputs to be captured
mrgb8597a72021-06-14 16:54:36 -070025 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,
mrg81880702021-06-16 20:34:50 -070057
mrgb40bbc72021-06-13 13:54:57 -070058 // Shared control/data to the SRAMs
mrg4a0200e2021-06-17 16:45:35 -070059 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,
mrgb40bbc72021-06-13 13:54:57 -070067 // One CSB for each SRAM
mrg9e8c3752021-06-14 08:22:13 -070068 // One CSB for each SRAM
mrg4a0200e2021-06-17 16:45:35 -070069 output reg [`MAX_CHIPS-1:0] csb0,
70 output reg [`MAX_CHIPS-1:0] csb1,
mrg81880702021-06-16 20:34:50 -070071
mrg0c951e12021-06-13 17:02:00 -070072 output reg [`TOTAL_SIZE-1:0] la_data_out,
mrgb40bbc72021-06-13 13:54:57 -070073 output reg gpio_out
74);
75
mrgb40bbc72021-06-13 13:54:57 -070076// Store input instruction
mrg0c951e12021-06-13 17:02:00 -070077 reg [`TOTAL_SIZE-1:0] sram_register;
78 reg csb0_temp;
79 reg csb1_temp;
mrgb40bbc72021-06-13 13:54:57 -070080
mrg9e8c3752021-06-14 08:22:13 -070081 // Mux output to connect final output data
82 // into sram_register
mrg0c951e12021-06-13 17:02:00 -070083 reg [`DATA_SIZE-1:0] read_data0;
84 reg [`DATA_SIZE-1:0] read_data1;
mrgb40bbc72021-06-13 13:54:57 -070085
mrg9e8c3752021-06-14 08:22:13 -070086 // SRAM input connections
mrg0c951e12021-06-13 17:02:00 -070087 reg [`SELECT_SIZE-1:0] chip_select;
mrgb40bbc72021-06-13 13:54:57 -070088
mrgb40bbc72021-06-13 13:54:57 -070089always @ (posedge clk) begin
mrg81880702021-06-16 20:34:50 -070090 if(!resetn) begin
mrg0c951e12021-06-13 17:02:00 -070091 sram_register <= {`TOTAL_SIZE{1'b0}};
mrgb40bbc72021-06-13 13:54:57 -070092 end
93 // GPIO scanning for transfer
94 else if(gpio_scan) begin
mrg0c951e12021-06-13 17:02:00 -070095 sram_register <= {sram_register[`TOTAL_SIZE-2:0], gpio_in};
mrgb40bbc72021-06-13 13:54:57 -070096 end
97 // LA parallel load
98 else if(la_in_load) begin
mrg605185e2021-06-13 16:02:06 -070099 sram_register <= la_data_in;
mrgb40bbc72021-06-13 13:54:57 -0700100 end
101 // Store results for read out
102 else if(gpio_sram_load || la_sram_load) begin
mrg81880702021-06-16 20:34:50 -0700103
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,
AmoghLonkar4b706b12021-06-15 12:40:41 -0700108 sram_register[`WMASK_SIZE+1:0]};
mrgb40bbc72021-06-13 13:54:57 -0700109 end
110end
111
mrg0d14b0b2021-06-17 11:22:43 -0700112
mrgb40bbc72021-06-13 13:54:57 -0700113// Splitting register bits into fields
mrg0c951e12021-06-13 17:02:00 -0700114always @(*) begin
AmoghLonkardca58fa2021-06-15 12:46:11 -0700115 chip_select = sram_register[`TOTAL_SIZE-1:`TOTAL_SIZE-`SELECT_SIZE];
mrgb40bbc72021-06-13 13:54:57 -0700116
mrg4a0200e2021-06-17 16:45:35 -0700117 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];
mrgad782172021-06-17 16:48:55 -0700119 csb0_temp = global_csb | sram_register[`PORT_SIZE+`WMASK_SIZE+1];
mrg4a0200e2021-06-17 16:45:35 -0700120 web0 = sram_register[`PORT_SIZE+`WMASK_SIZE];
121 wmask0 = sram_register[`PORT_SIZE+`WMASK_SIZE-1:`PORT_SIZE];
mrg81880702021-06-16 20:34:50 -0700122
mrg4a0200e2021-06-17 16:45:35 -0700123 addr1 = sram_register[`PORT_SIZE-1:`DATA_SIZE+`WMASK_SIZE+2];
124 din1 = sram_register[`DATA_SIZE+`WMASK_SIZE+1:`WMASK_SIZE+2];
mrgad782172021-06-17 16:48:55 -0700125 csb1_temp = global_csb | sram_register[`WMASK_SIZE+1];
mrg4a0200e2021-06-17 16:45:35 -0700126 web1 = sram_register[`WMASK_SIZE];
127 wmask1 = sram_register[`WMASK_SIZE-1:0];
mrg81880702021-06-16 20:34:50 -0700128end
129
mrgb40bbc72021-06-13 13:54:57 -0700130// Apply the correct CSB
131always @(*) begin
mrg4a0200e2021-06-17 16:45:35 -0700132 csb0 = ~( (~{15'b111111111111111, csb0_temp}) << chip_select);
133 csb1 = ~( (~{15'b111111111111111, csb1_temp}) << chip_select);
mrgb40bbc72021-06-13 13:54:57 -0700134end
mrg81880702021-06-16 20:34:50 -0700135
136// Mux value of correct SRAM data input to feed into
137// DFF clocked by la/gpio clk
mrgb40bbc72021-06-13 13:54:57 -0700138always @ (*) begin
139 case(chip_select)
140 4'd0: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700141 read_data0 = sram0_data0;
142 read_data1 = sram0_data1;
mrgb40bbc72021-06-13 13:54:57 -0700143 end
144 4'd1: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700145 read_data0 = sram1_data0;
146 read_data1 = sram1_data1;
mrgb40bbc72021-06-13 13:54:57 -0700147 end
148 4'd2: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700149 read_data0 = sram2_data0;
150 read_data1 = sram2_data1;
mrgb40bbc72021-06-13 13:54:57 -0700151 end
152 4'd3: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700153 read_data0 = sram3_data0;
154 read_data1 = sram3_data1;
mrgb40bbc72021-06-13 13:54:57 -0700155 end
156 4'd4: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700157 read_data0 = sram4_data0;
158 read_data1 = sram4_data1;
mrgb40bbc72021-06-13 13:54:57 -0700159 end
160 4'd5: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700161 read_data0 = sram5_data0;
162 read_data1 = sram5_data1;
mrgb40bbc72021-06-13 13:54:57 -0700163 end
164 4'd6: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700165 read_data0 = sram6_data0;
166 read_data1 = sram6_data1;
mrgb40bbc72021-06-13 13:54:57 -0700167 end
168 4'd7: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700169 read_data0 = sram7_data0;
170 read_data1 = sram7_data1;
mrgb40bbc72021-06-13 13:54:57 -0700171 end
172 4'd8: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700173 read_data0 = sram8_data0;
174 read_data1 = sram8_data1;
mrgb40bbc72021-06-13 13:54:57 -0700175 end
176 4'd9: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700177 read_data0 = sram9_data0;
178 read_data1 = sram9_data1;
mrgb40bbc72021-06-13 13:54:57 -0700179 end
180 4'd10: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700181 read_data0 = sram10_data0;
182 read_data1 = sram10_data1;
mrgb40bbc72021-06-13 13:54:57 -0700183 end
184 4'd11: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700185 read_data0 = sram11_data0;
186 read_data1 = sram11_data1;
mrgb40bbc72021-06-13 13:54:57 -0700187 end
188 4'd12: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700189 read_data0 = sram12_data0;
190 read_data1 = sram12_data1;
mrgb40bbc72021-06-13 13:54:57 -0700191 end
192 4'd13: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700193 read_data0 = sram13_data0;
194 read_data1 = sram13_data1;
mrgb40bbc72021-06-13 13:54:57 -0700195 end
196 4'd14: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700197 read_data0 = sram14_data0;
198 read_data1 = sram14_data1;
mrgb40bbc72021-06-13 13:54:57 -0700199 end
200 4'd15: begin
AmoghLonkarf11d9b52021-06-14 18:23:01 -0700201 read_data0 = sram15_data0;
202 read_data1 = sram15_data1;
mrgb40bbc72021-06-13 13:54:57 -0700203 end
204 endcase
205end
206
207// Output logic
208always @ (*) begin
mrg0c951e12021-06-13 17:02:00 -0700209 gpio_out = sram_register[`TOTAL_SIZE-1];
AmoghLonkar4b706b12021-06-15 12:40:41 -0700210 la_data_out = sram_register;
mrgb40bbc72021-06-13 13:54:57 -0700211end
212
213endmodule