lots of changes to Marina test code, mostly for scan chain counters
[fleet.git] / bee2-selectmap / main_counterexample_map1.v
1 `timescale 1ps / 1ps
2
3 //  Copyright (c) 2005-2006, Regents of the University of California
4 //  All rights reserved.
5 //
6 //  Redistribution and use in source and binary forms, with or without modification,
7 //  are permitted provided that the following conditions are met:
8 //
9 //      - Redistributions of source code must retain the above copyright notice,
10 //          this list of conditions and the following disclaimer.
11 //      - Redistributions in binary form must reproduce the above copyright
12 //          notice, this list of conditions and the following disclaimer
13 //          in the documentation and/or other materials provided with the
14 //          distribution.
15 //      - Neither the name of the University of California, Berkeley nor the
16 //          names of its contributors may be used to endorse or promote
17 //          products derived from this software without specific prior
18 //          written permission.
19 //
20 //  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21 //  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 //  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 //  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
24 //  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25 //  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 //  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
27 //  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 //  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 //  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 //----------------------------------------------------------------------------
32 // user_fifo.v
33 //----------------------------------------------------------------------------
34
35 `timescale 1ps / 1ps
36
37 module user_fifo
38   (
39    // FIFO interface ports
40    WrFifo_Din,                  // Write FIFO data-in
41    WrFifo_WrEn,                 // Write FIFO write enable
42    WrFifo_Full,                 // Write FIFO full
43    WrFifo_WrCnt,                // Write FIFO write count
44    RdFifo_Dout,                 // Read FIFO data-out
45    RdFifo_RdEn,                 // Read FIFO read enable
46    RdFifo_Empty,                // Read FIFO empty
47    RdFifo_RdCnt,                // Read FIFO read count
48    User_Rst,                    // User reset
49    User_Clk,                    // User clock
50    Sys_Rst,                     // System clock reset
51    Sys_Clk,                     // 100MHz system clock for CCLK generation
52
53    // SelectMAP interface ports
54    D_I,                         // Data bus input
55    D_O,                         // Data bus output
56    D_T,                         // Data bus tristate enable
57    RDWR_B,                      // Read/write signal
58    CS_B,                        // Chip select
59    INIT_B,                      // Initialization/interrupt signal
60    CCLK                         // CCLK output
61    );
62
63    // FIFO interface ports
64    input [0:7]         WrFifo_Din;
65    input               WrFifo_WrEn;
66    output              WrFifo_Full;
67    output [0:7]        WrFifo_WrCnt;
68    output [0:7]        RdFifo_Dout;
69    input               RdFifo_RdEn;
70    output              RdFifo_Empty;
71    output [0:7]        RdFifo_RdCnt;
72    input               User_Rst;
73    input               User_Clk;
74    input               Sys_Rst;
75    input               Sys_Clk;
76
77    // SelectMAP protocol ports
78    input [0:7]         D_I;
79    output [0:7]        D_O;
80    output [0:7]        D_T;
81    input               RDWR_B;
82    input               CS_B;
83    output              INIT_B;
84    output              CCLK;
85
86    //   ____        __ _       _ _   _                   //
87    //  |  _ \  ___ / _(_)_ __ (_) |_(_) ___  _ __  ___   //
88    //  | | | |/ _ \ |_| | '_ \| | __| |/ _ \| '_ \/ __|  //
89    //  | |_| |  __/  _| | | | | | |_| | (_) | | | \__ \  //
90    //  |____/ \___|_| |_|_| |_|_|\__|_|\___/|_| |_|___/  //
91    //                                                    //
92
93    //----------------------------------------------------------------------------
94    // Signal definitions
95    //----------------------------------------------------------------------------
96    // Write FIFO signals
97    wire [0:7]          WrFifo_Dout;
98    wire                WrFifo_Empty;
99    wire                WrFifo_RdEn;
100    wire [0:7]          WrFifo_RdCnt;
101    wire [0:7]          WrFifo_RdCnt_int;
102    wire [0:7]          WrFifo_WrCnt_int;
103
104    // Read FIFO signals
105    wire [0:7]          RdFifo_Din;
106    wire                RdFifo_Full;
107    wire                RdFifo_WrEn;
108    wire [0:7]          RdFifo_WrCnt;
109    wire [0:7]          RdFifo_WrCnt_int;
110    wire [0:7]          RdFifo_RdCnt_int;
111
112    //----------------------------------------------------------------------------
113    // IO Registers
114    //----------------------------------------------------------------------------
115    reg                 CCLK;
116
117    reg [0:7]           D_I_reg;    // synthesis attribute iob of D_I_reg is true;
118    reg [0:7]           D_O_reg;    // synthesis attribute iob of D_O_reg is true;
119    reg                 RDWR_B_reg; // synthesis attribute iob of RDWR_B_reg is true;
120    reg                 CS_B_reg;   // synthesis attribute iob of CS_B_reg is true;
121    reg                 INIT_B_reg; // synthesis attribute iob of INIT_B_reg is true;
122
123    // Outputs
124    assign              D_O = D_O_reg;
125    assign              INIT_B = INIT_B_reg;
126
127    // Inputs
128    always @( posedge Sys_Clk )
129      begin
130         D_I_reg    <= D_I;
131         RDWR_B_reg <= RDWR_B;
132         CS_B_reg   <= CS_B;
133      end
134
135    //----------------------------------------------------------------------------
136    // Generate CCLK and associated reset
137    //----------------------------------------------------------------------------
138    reg                SYNC_done;
139    reg                SYNC_done_dly;
140    reg                CS_B_reg_dly;
141
142    always @( posedge Sys_Clk )
143      begin
144         CS_B_reg_dly <= CS_B_reg;
145      end
146
147    always @( posedge Sys_Clk )
148      begin
149         if (Sys_Rst)
150           SYNC_done <= 1'b0;
151         else if (RDWR_B_reg && ~CS_B_reg)
152           SYNC_done <= 1'b1;
153      end
154
155    always @( posedge Sys_Clk )
156      begin
157         if (Sys_Rst)
158           SYNC_done_dly <= 1'b0;
159         else
160           SYNC_done_dly <= SYNC_done;
161      end
162
163    always @( posedge Sys_Clk )
164      begin
165         if (Sys_Rst)
166           CCLK <= 1'b0;
167         else if (~CS_B_reg && CS_B_reg_dly && CCLK)
168           CCLK <= 1'b1;
169         else
170           CCLK <= ~CCLK;
171      end
172
173    //   _____ ___ _____ ___        //
174    //  |  ___|_ _|  ___/ _ \ ___   //
175    //  | |_   | || |_ | | | / __|  //
176    //  |  _|  | ||  _|| |_| \__ \  //
177    //  |_|   |___|_|   \___/|___/  //
178    //                              //
179    // Write FIFO:  The write is with respect to the user.  The user writes data to this
180    //              FIFO and the control side of SelectMAP reads the data.
181    //
182    // Read FIFO:  The read is with respect to the user.  The user reads data sent from the
183    //             control side of SelectMAP.
184    //
185
186    //----------------------------------------------------------------------------
187    // Read FIFO
188    //----------------------------------------------------------------------------
189    assign RdFifo_WrEn = SYNC_done_dly && ~RDWR_B_reg && ~CS_B_reg && ~RdFifo_Full && CCLK;
190    assign RdFifo_Din = D_I_reg;
191
192    async_fifo_8_8_128 RdFifo( .din( RdFifo_Din ),
193                   .dout( RdFifo_Dout ),
194                   .rd_clk( User_Clk ),
195                   .rd_en( RdFifo_RdEn ),
196                   .wr_clk( Sys_Clk ),
197                   .wr_en( RdFifo_WrEn ),
198                   .rst( User_Rst ),
199                   .empty( RdFifo_Empty ),
200                   .full( RdFifo_Full ),
201                   .rd_data_count( RdFifo_RdCnt_int ),
202                   .wr_data_count( RdFifo_WrCnt_int ) );
203
204    assign RdFifo_WrCnt = 8'd129 - RdFifo_WrCnt_int;
205    assign RdFifo_RdCnt = RdFifo_RdCnt_int;
206
207    //----------------------------------------------------------------------------
208    // Write FIFO
209    //----------------------------------------------------------------------------
210    assign WrFifo_RdEn = SYNC_done_dly && RDWR_B_reg && ~CS_B_reg && ~WrFifo_Empty && CCLK;
211
212    async_fifo_8_8_128 WrFifo( .din( WrFifo_Din ),
213                   .dout( WrFifo_Dout ),
214                   .rd_clk( Sys_Clk ),
215                   .rd_en( WrFifo_RdEn ),
216                   .wr_clk( User_Clk ),
217                   .wr_en( WrFifo_WrEn ),
218                   .rst( User_Rst ),
219                   .empty( WrFifo_Empty ),
220                   .full( WrFifo_Full ),
221                   .rd_data_count( WrFifo_RdCnt_int ),
222                   .wr_data_count( WrFifo_WrCnt_int ) );
223
224    assign WrFifo_WrCnt = 8'd129 - WrFifo_WrCnt_int;
225    assign WrFifo_RdCnt = WrFifo_RdCnt_int;
226
227    //   ____       _           _   __  __    _    ____    //
228    //  / ___|  ___| | ___  ___| |_|  \/  |  / \  |  _ \   //
229    //  \___ \ / _ \ |/ _ \/ __| __| |\/| | / _ \ | |_) |  //
230    //   ___) |  __/ |  __/ (__| |_| |  | |/ ___ \|  __/   //
231    //  |____/ \___|_|\___|\___|\__|_|  |_/_/   \_\_|      //
232    //                                                     //
233
234    //----------------------------------------------------------------------------
235    // SelectMAP control outputs
236    //----------------------------------------------------------------------------
237    wire [0:7] DataCnt = RDWR_B_reg ? WrFifo_RdCnt : RdFifo_WrCnt;
238
239    assign     D_T    = {8{(~RDWR_B & ~CS_B)}}; // stop driving if master is sending
240
241    always @( posedge Sys_Clk )
242      begin
243         D_O_reg    <= CS_B_reg ? DataCnt : WrFifo_Dout;
244         INIT_B_reg <= WrFifo_Empty;
245      end
246
247    //----------------------------------------------------------------------------
248
249 endmodule
250
251
252 module main
253   (
254    // User clock ports
255    Clkin_p,
256    Clkin_m,
257    
258    // SelectMAP interface ports
259    D,                           // Data bus
260    RDWR_B,                      // Read/write signal
261    CS_B,                        // Chip select
262    INIT_B,                      // Initialization/interrupt signal
263    CCLK,                        // Local CCLK output
264    gpleds,
265    terminal
266    );
267
268    // User clock/reset ports
269    input                       Clkin_p;
270    input                       Clkin_m;
271   
272    // SelectMAP protocol ports
273    inout [0:7]                 D;
274    input                       RDWR_B;
275    input                       CS_B;
276    output                      INIT_B;
277    output                      CCLK;
278    output [6:1] gpleds;
279
280
281    // Wires
282    wire                        CCLK_int;
283    
284    wire [0:31]                 LoopData;
285    wire [0:31]                 LoopDataW;
286    wire                        LoopEmpty;
287    wire                        LoopFull;
288
289    wire [0:7]                  D_I;
290    wire [0:7]                  D_O;
291    wire [0:7]                  D_T;
292
293    wire                        User_Clk;
294    wire                        User_Rst;
295
296    reg  [6:1]                  gpleds_reg;
297
298    // synthesis attribute tig of activate_r is yes; 
299    wire   activate_r;
300    // synthesis attribute tig of activate_a is yes; 
301    wire   activate_a;
302
303    wire [7:0] write_data;
304    wire       write_enable;
305    wire       write_full;
306
307    wire [7:0] read_data;
308    wire       read_empty;
309    wire [7:0] read_wire;
310
311    reg  [7:0] write_reg;
312    reg  [7:0] read_reg;
313    wire read_enable;
314    inout [33:0] terminal;
315    wire [7:0] write_data_;
316    assign write_data = write_data_ + 48;
317    
318    Maps_Bee2_Map1 map (.Clock(User_Clk),
319                         .SelectMapData(write_data_),
320                         .SelectMapWrite(write_enable),
321                         .__TERMINAL_SynchronousLink_Pins(terminal));
322         
323 //synthesis attribute LOC of terminal is "C15,L16,M16,J16,K16,H16,G16,E16,F16,M18,M17,L17,K17,H17,J17,F17,G17,D16,D17,K18,L18,G18,H18,E17,E18,C18,C17,L19,M19,J19,K19,G19,H19,E19"
324               
325
326    // IO buffers
327    OBUF obuf_cclk( .I( CCLK_int ),
328                    .O( CCLK )
329                    );
330    
331    IOBUF iobuf_d0( .I( D_O[0] ),
332                    .IO( D[0] ),
333                    .O( D_I[0] ),
334                    .T( D_T[0] )
335                    );
336    
337    IOBUF iobuf_d1( .I( D_O[1] ),
338                    .IO( D[1] ),
339                    .O( D_I[1] ),
340                    .T( D_T[1] )
341                    );
342    
343    IOBUF iobuf_d2( .I( D_O[2] ),
344                    .IO( D[2] ),
345                    .O( D_I[2] ),
346                    .T( D_T[2] )
347                    );
348    
349    IOBUF iobuf_d3( .I( D_O[3] ),
350                    .IO( D[3] ),
351                    .O( D_I[3] ),
352                    .T( D_T[3] )
353                    );
354    
355    IOBUF iobuf_d4( .I( D_O[4] ),
356                    .IO( D[4] ),
357                    .O( D_I[4] ),
358                    .T( D_T[4] )
359                    );
360    
361    IOBUF iobuf_d5( .I( D_O[5] ),
362                    .IO( D[5] ),
363                    .O( D_I[5] ),
364                    .T( D_T[5] )
365                    );
366    
367    IOBUF iobuf_d6( .I( D_O[6] ),
368                    .IO( D[6] ),
369                    .O( D_I[6] ),
370                    .T( D_T[6] )
371                    );
372    
373    IOBUF iobuf_d7( .I( D_O[7] ),
374                    .IO( D[7] ),
375                    .O( D_I[7] ),
376                    .T( D_T[7] )
377                    );
378
379    // Clock buffer and reset
380    IBUFGDS_LVDS_25 diff_usrclk_buf( .I( Clkin_p ),
381                                     .IB( Clkin_m ), 
382                                     .O( User_Clk )
383                                     );
384
385    wire [0:3] rst;
386    
387    FD rst0( .D( 1'b0 ),
388             .Q( rst[0] ),
389             .C( User_Clk )
390             );
391    defparam rst0.INIT = 1'b1;
392
393    FD rst1( .D( rst[0] ),
394             .Q( rst[1] ),
395             .C( User_Clk )
396             );
397    defparam rst1.INIT = 1'b1;
398
399    FD rst2( .D( rst[1] ),
400             .Q( rst[2] ),
401             .C( User_Clk )
402             );
403    defparam rst2.INIT = 1'b1;
404
405    FD rst3( .D( rst[2] ),
406             .Q( rst[3] ),
407             .C( User_Clk )
408             );
409    defparam rst3.INIT = 1'b1;
410
411    assign   User_Rst = |rst;
412
413
414    // FIFO module instantiation
415    user_fifo test_fifo( 
416                         .WrFifo_Din( write_data ),
417                         .WrFifo_WrEn( write_enable ),
418                         .WrFifo_Full( write_full ),
419                         .WrFifo_WrCnt(  ),
420                         .RdFifo_Dout( read_data ),
421                         .RdFifo_RdEn( read_enable ),
422                         .RdFifo_Empty( read_empty ),
423                         .RdFifo_RdCnt(  ),
424                         .User_Rst( User_Rst ),
425                         .User_Clk( User_Clk ),
426                         .Sys_Rst( User_Rst ),
427                         .Sys_Clk( User_Clk ),                        
428                         .D_I( D_I ),
429                         .D_O( D_O ),
430                         .D_T( D_T ),                         
431                         .RDWR_B( RDWR_B ),
432                         .CS_B( CS_B ),
433                         .INIT_B( INIT_B ),
434                         .CCLK( CCLK_int )
435                         );
436    
437 endmodule