Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / design / sys / iop / niu / rtl / niu_zcp_macros.v
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: niu_zcp_macros.v
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35/*%W% %G%*/
36
37/*****************************************************************
38 *
39 * File Name : niu_zcp_macros.v
40 * Author Name : John Lo
41 * Description : It contains ZCP macros,
42 *
43 * Parent Module:
44 * Child Module:
45 * Interface Mod:
46 * Date Created : 3/26/04
47 *
48 * Copyright (c) 2020, Sun Microsystems, Inc.
49 * Sun Proprietary and Confidential
50 *
51 * Modification :
52 *
53 ****************************************************************/
54
55
56module zcp_par_gen (chk_bit_data,din,par);
57parameter dwidth = 8;
58 input chk_bit_data;
59 input [dwidth-1:0] din;
60 output par;
61
62 wire par_temp = ^(din[dwidth-1:0]);
63 wire par = chk_bit_data ^ par_temp;
64
65endmodule
66
67//*****************************
68// Loadable Register
69//*****************************
70module zcp_RegLd (clk,reset,ld,ld_value,we,din,qout);
71
72parameter dwidth = 10;
73input clk, reset;
74input ld;
75input [dwidth-1:0] ld_value;
76input we;
77input [dwidth-1:0] din;
78output [dwidth-1:0] qout;
79
80reg [dwidth-1:0] qout;
81
82always @ (posedge clk)
83 if (reset)
84 qout <= 0;
85 else
86 casex({we, ld}) // synopsys parallel_case full_case
87 2'b00: qout <= qout;
88 2'b01: qout <= ld_value;
89 2'b1x: qout <= din;
90 endcase
91
92endmodule
93
94
95/***********************************
96 * RegDff
97 * *********************************/
98module zcp_RegDff (din,clk,qout);
99
100parameter dwidth = 10;
101input clk;
102input [dwidth-1:0] din;
103output [dwidth-1:0] qout;
104
105reg [dwidth-1:0] qout;
106
107always @ (posedge clk)
108 qout <= din;
109
110
111endmodule // RegDff
112
113
114//*****************************
115// Register xREG
116//*****************************
117module zcp_xREG (clk,reset,en,din,qout);
118
119parameter dwidth = 10;
120input clk, en, reset;
121input [dwidth-1:0] din;
122output [dwidth-1:0] qout;
123
124reg [dwidth-1:0] qout;
125
126always @ (posedge clk)
127 if (reset)
128 qout <= 0;
129 else if (en)
130 qout <= din;
131 else
132 qout <= qout;
133
134
135endmodule
136
137//*****************************
138// Register xREG2
139//*****************************
140module zcp_xREG2 (clk,reset,reset_value,load,din,qout);
141
142 parameter dwidth = 10;
143 input clk;
144 input reset;
145 input [dwidth-1:0] reset_value;
146 input load;
147 input [dwidth-1:0] din;
148 output [dwidth-1:0] qout;
149
150 reg [dwidth-1:0] qout;
151
152
153always @ (posedge clk)
154 if (reset)
155 qout <= reset_value;
156 else if (load)
157 qout <= din;
158 else
159 qout <= qout;
160
161endmodule // zcp_xREG2
162
163/*****************************
164 * RegRst
165 *****************************/
166module zcp_RegRst (clk,reset,din,qout);
167
168parameter dwidth = 10;
169input clk, reset;
170input [dwidth-1:0] din;
171output [dwidth-1:0] qout;
172
173reg [dwidth-1:0] qout;
174
175always @ (posedge clk)
176 if (reset)
177 qout <= 0;
178 else
179 qout <= din;
180
181endmodule
182
183
184
185/***********************************
186 * Counter
187 ***********************************/
188module zcp_counter (reset,clk,ce,count);
189parameter dwidth = 9;
190input reset,clk,ce;
191output [dwidth-1:0] count;
192
193reg [dwidth-1:0] count;
194
195always @ (posedge clk)
196 if (reset)
197 count <= 0;
198 else
199 casex(ce)
200 1'b0: count <= count;
201 1'b1: count <= count + 1;
202 endcase
203
204endmodule
205
206module zcp_ud_cntr (clk,reset,reset_value,inc,dec,count);
207parameter dwidth = 9;
208input reset,clk,inc,dec;
209input [dwidth-1:0] reset_value;
210output [dwidth-1:0] count;
211
212reg [dwidth-1:0] count;
213
214always @ (posedge clk)
215 if (reset)
216 count <= reset_value;
217 else
218 casex({inc,dec})
219 2'b00: count <= count;
220 2'b01: count <= count - 1;
221 2'b10: count <= count + 1;
222 2'b11: count <= count;
223 default:count <= count;
224 endcase
225
226endmodule
227
228
229module zcp_pls_gen2_reg (clk,sig_in,lead,trail);
230 input clk;
231 input sig_in;
232 output lead;
233 output trail;
234
235 reg sig_in_reg,sig_out;
236 wire lead,trail;
237
238always @ (posedge clk)
239 begin
240 sig_in_reg <= sig_in;
241 sig_out <= sig_in_reg;
242 end
243
244 assign lead = sig_in_reg & ~sig_out;
245
246 assign trail= ~sig_in_reg & sig_out;
247
248endmodule // pls_gen2_reg
249
250
251module zcp_pls_gen2 (clk,sig_in,lead,trail);
252 input clk;
253 input sig_in;
254 output lead;
255 output trail;
256
257 wire sig_in,lead,trail;
258 reg sig_out;
259
260
261always @ (posedge clk)
262 begin
263 sig_out <= sig_in;
264 end
265
266 assign lead = sig_in & ~sig_out;
267
268 assign trail= ~sig_in & sig_out;
269
270endmodule // zcp_pls_gen2
271
272module zcp_pls_gen1 (clk,sig_in,lead);
273 input clk;
274 input sig_in;
275 output lead;
276
277 wire sig_in,lead;
278 reg sig_out;
279
280
281always @ (posedge clk)
282 begin
283 sig_out <= sig_in;
284 end
285
286 assign lead = sig_in & ~sig_out;
287
288
289endmodule // zcp_pls_gen1
290
291
292module zcp_w1c_ff (clk,reset,set,ld,w1c,w1c_data,q);
293 input clk;
294 input reset;
295 input set;
296 input ld;
297 input w1c;
298 input w1c_data;
299 output q;
300
301 wire w1c,w1c_data;
302 wire set;
303 wire set_pls;
304 wire rst = w1c & w1c_data;
305 wire ld;
306 reg q;
307
308zcp_pls_gen1 zcp_pls_gen1(.clk(clk),.sig_in(set),.lead(set_pls));
309
310always @ (posedge clk)
311 if (reset)
312 q <= 0;
313 else if (ld)
314 q <= w1c_data;
315 else
316 case({set_pls, rst})
317 2'b00: q <= q;
318 2'b01: q <= 0; // rst
319 2'b11: q <= 0; // rst has hi pri
320 2'b10: q <= 1; // set
321 default: q <= q;
322 endcase
323
324
325
326endmodule // zcp_w1c_ff
327
328
329
330module zcp_SRFF (clk,reset,set,rst,q);
331
332input reset, clk, set, rst;
333output q;
334
335reg q;
336
337always @ (posedge clk)
338if (reset)
339 q <= 0;
340else
341 casex({set, rst})
342 2'b00: q <= q;
343 2'b01: q <= 0;
344 2'b1x: q <= 1;
345 default:q <= 0;
346 endcase
347
348endmodule
349
350
351module zcp_RSFF (clk,reset,set,rst,q);
352
353input reset, clk, set, rst;
354output q;
355
356reg q;
357
358always @ (posedge clk)
359if (reset)
360 q <= 0;
361else
362 casex({set, rst})
363 2'b00: q <= q;
364 2'bx1: q <= 0;
365 2'b10: q <= 1;
366 default:q <= 0;
367 endcase
368
369endmodule
370
371
372// *************************************************************************
373// Copyright (c) 1995 - 2001 Sun Microsystems, Inc.
374//
375// All rights reserved. No part of this design may be reproduced stored
376// in a retrieval system, or transmitted, in any form or by any means,
377// electronic, mechanical, photocopying, recording, or otherwise, without
378// prior written permission of Sun Microsystems, Inc.
379//
380// Sun Proprietary: Need-To-Know
381// *************************************************************************
382//
383//
384// Description : A parameterizable register file made using flip flops.
385// Warning: Appropriate only for small number of entries.
386//
387//
388
389module zcp_RegFile (
390 d_in,
391 wr_addr,
392 rd_addr,
393 wr,
394
395 clk,
396
397 d_out
398
399);
400
401parameter WIDTH = 16, // Width (# of bits)
402 ADDR_BITS = 4, // number of address bits
403 DEPTH = 1<<ADDR_BITS; // number of entries
404
405//======================================================================
406// Input/Outputs declarations
407//======================================================================
408input clk; // Clock
409
410input wr; // Write strobe
411input [WIDTH-1:0] d_in; // data in
412input [ADDR_BITS-1:0] wr_addr; // write address
413input [ADDR_BITS-1:0] rd_addr; // read address
414
415output [WIDTH-1:0] d_out;
416
417
418
419// The memory array
420reg [WIDTH-1:0] mem [DEPTH-1:0];
421
422
423
424// Output mux
425assign d_out = mem[rd_addr];
426
427
428// verilint 257 off
429// verilint 280 off
430// verilint 548 off
431// verilint 193 off
432// verilint 529 off
433
434
435// data_in
436always @(posedge clk)
437begin
438 if (wr)
439 mem[wr_addr] <= #1 d_in;
440 else
441 ;
442end
443
444//----------------------------------------------------------------------
445// Debugging stuff
446// verilint translate off
447// synopsys translate_off
448//simtech modcovoff -bpe
449`ifdef DEBUG
450
451wire [WIDTH-1:0] peek_0 = mem[0];
452wire [WIDTH-1:0] peek_1 = mem[1];
453wire [WIDTH-1:0] peek_2 = mem[2];
454wire [WIDTH-1:0] peek_3 = mem[3];
455wire [WIDTH-1:0] peek_4 = mem[4];
456wire [WIDTH-1:0] peek_5 = mem[5];
457wire [WIDTH-1:0] peek_6 = mem[6];
458wire [WIDTH-1:0] peek_7 = mem[7];
459wire [WIDTH-1:0] peek_8 = mem[8];
460wire [WIDTH-1:0] peek_9 = mem[9];
461wire [WIDTH-1:0] peek_10 = mem[10];
462wire [WIDTH-1:0] peek_11 = mem[11];
463wire [WIDTH-1:0] peek_12 = mem[12];
464wire [WIDTH-1:0] peek_13 = mem[13];
465wire [WIDTH-1:0] peek_14 = mem[14];
466wire [WIDTH-1:0] peek_15 = mem[15];
467
468integer i;
469
470task dump;
471begin
472 $display("========================================");
473 $display("Memory dump. Width=%0d, Depth=%0d",WIDTH,DEPTH);
474 `ifdef VERILOG
475 $showscopes;
476 `endif
477 for (i=0; i<DEPTH; i=i+1) begin
478 $display("#%0x: mem(%x)",i,mem[i]);
479 end
480 $display("========================================");
481
482end
483endtask
484
485
486`endif // DEBUG
487// synopsys translate_on
488// verilint translate on
489//simtech modcovon -bpe
490
491
492endmodule
493
494
495
496
497module zcpfifo_16d (clk,reset,we,wp,din,rp,dout);
498 parameter WIDTH = 16;
499 input clk;
500 input reset;
501 input we;
502 input [3:0] wp,rp;
503 input [WIDTH-1:0] din;
504 output [WIDTH-1:0] dout;
505
506reg [WIDTH-1:0] zcpfifo_reg [0:15]; // 16 deep
507
508// vlint flag_empty_statement off
509// vlint flag_null_else_statement off
510always @ (posedge clk)
511 begin
512 if (reset)
513 begin
514 zcpfifo_reg[0] <= 0;
515 zcpfifo_reg[1] <= 0;
516 zcpfifo_reg[2] <= 0;
517 zcpfifo_reg[3] <= 0;
518 zcpfifo_reg[4] <= 0;
519 zcpfifo_reg[5] <= 0;
520 zcpfifo_reg[6] <= 0;
521 zcpfifo_reg[7] <= 0;
522 zcpfifo_reg[8] <= 0;
523 zcpfifo_reg[9] <= 0;
524 zcpfifo_reg[10] <= 0;
525 zcpfifo_reg[11] <= 0;
526 zcpfifo_reg[12] <= 0;
527 zcpfifo_reg[13] <= 0;
528 zcpfifo_reg[14] <= 0;
529 zcpfifo_reg[15] <= 0;
530 end
531 else
532 case (we) // synopsys parallel_case full_case infer_mux
533 1'b1: zcpfifo_reg[wp] <= din;
534 1'b0: zcpfifo_reg[wp] <= zcpfifo_reg[wp]; // hold
535 endcase
536 end // always @ (posedge clk)
537// vlint flag_empty_statement on
538// vlint flag_null_else_statement on
539
540 assign dout = zcpfifo_reg[rp];
541
542
543endmodule // zcpfifo_16d
544
545
546
547
548/*********************************************************
549
550 Project : Niu
551
552 Date : Oct. 2005
553
554 Description : 4 sets of {nand3, nor2, inv, mux2, reg}
555
556 Synthesis Notes:
557
558 Modification History:
559
560 Date Description
561 ---- -----------
562
563***********************************************************/
564
565
566`ifdef NEPTUNE
567module zcp_spare_gates (
568 di_nd3,
569 di_nd2,
570 di_nd1,
571 di_nd0,
572 di_nr3,
573 di_nr2,
574 di_nr1,
575 di_nr0,
576 di_inv,
577 di_mx3,
578 di_mx2,
579 di_mx1,
580 di_mx0,
581 mx_sel,
582 di_reg,
583 wt_ena,
584 rst,
585 si,
586 se,
587 clk,
588 do_nad,
589 do_nor,
590 do_inv,
591 do_mux,
592 do_q,
593 so
594 );
595
596input [2:0] di_nd3;
597input [2:0] di_nd2;
598input [2:0] di_nd1;
599input [2:0] di_nd0;
600
601input [1:0] di_nr3;
602input [1:0] di_nr2;
603input [1:0] di_nr1;
604input [1:0] di_nr0;
605
606input [3:0] di_inv;
607
608input [1:0] di_mx3;
609input [1:0] di_mx2;
610input [1:0] di_mx1;
611input [1:0] di_mx0;
612input [3:0] mx_sel;
613
614input [3:0] di_reg;
615input [3:0] wt_ena;
616input [3:0] rst;
617
618input si;
619input se;
620input clk;
621
622output [3:0] do_nad;
623output [3:0] do_nor;
624output [3:0] do_inv;
625output [3:0] do_mux;
626output [3:0] do_q;
627output so;
628
629wire [3:0] do_nad;
630wire [3:0] do_nor;
631wire [3:0] do_inv;
632wire [3:0] do_mux;
633wire [3:0] do_q;
634wire so = do_q[3];
635
636wire [3:0] rst_l;
637
638 ND3M1P nand3_3 ( .Z(do_nad[3]), .A(di_nd3[0]), .B(di_nd3[1]), .C(di_nd3[2]) );
639 ND3M1P nand3_2 ( .Z(do_nad[2]), .A(di_nd2[0]), .B(di_nd2[1]), .C(di_nd2[2]) );
640 ND3M1P nand3_1 ( .Z(do_nad[1]), .A(di_nd1[0]), .B(di_nd1[1]), .C(di_nd1[2]) );
641 ND3M1P nand3_0 ( .Z(do_nad[0]), .A(di_nd0[0]), .B(di_nd0[1]), .C(di_nd0[2]) );
642
643 NR2M1P nor_3 ( .Z(do_nor[3]), .A(di_nr3[0]), .B(di_nr3[1]) );
644 NR2M1P nor_2 ( .Z(do_nor[2]), .A(di_nr2[0]), .B(di_nr2[1]) );
645 NR2M1P nor_1 ( .Z(do_nor[1]), .A(di_nr1[0]), .B(di_nr1[1]) );
646 NR2M1P nor_0 ( .Z(do_nor[0]), .A(di_nr0[0]), .B(di_nr0[1]) );
647
648 N1M1P inv_3 ( .Z(do_inv[3]), .A(di_inv[3]) );
649 N1M1P inv_2 ( .Z(do_inv[2]), .A(di_inv[2]) );
650 N1M1P inv_1 ( .Z(do_inv[1]), .A(di_inv[1]) );
651 N1M1P inv_0 ( .Z(do_inv[0]), .A(di_inv[0]) );
652
653 MUX21HM1P mux21_3 ( .Z(do_mux[3]), .A(di_mx3[0]), .B(di_mx3[1]), .S(mx_sel[3]) );
654 MUX21HM1P mux21_2 ( .Z(do_mux[2]), .A(di_mx2[0]), .B(di_mx2[1]), .S(mx_sel[2]) );
655 MUX21HM1P mux21_1 ( .Z(do_mux[1]), .A(di_mx1[0]), .B(di_mx1[1]), .S(mx_sel[1]) );
656 MUX21HM1P mux21_0 ( .Z(do_mux[0]), .A(di_mx0[0]), .B(di_mx0[1]), .S(mx_sel[0]) );
657
658 FD2SL2QM1P regtre_3 ( .Q(do_q[3]), .D(di_reg[3]), .CP(clk), .CD(rst_l[3]), .TI(do_q[2]), .TE(se), .LD(wt_ena[3]) );
659 FD2SL2QM1P regtre_2 ( .Q(do_q[2]), .D(di_reg[2]), .CP(clk), .CD(rst_l[2]), .TI(do_q[1]), .TE(se), .LD(wt_ena[2]) );
660 FD2SL2QM1P regtre_1 ( .Q(do_q[1]), .D(di_reg[1]), .CP(clk), .CD(rst_l[1]), .TI(do_q[0]), .TE(se), .LD(wt_ena[1]) );
661 FD2SL2QM1P regtre_0 ( .Q(do_q[0]), .D(di_reg[0]), .CP(clk), .CD(rst_l[0]), .TI(si), .TE(se), .LD(wt_ena[0]) );
662
663 N1M1P inv_rst_3( .Z(rst_l[3]), .A(rst[3]) );
664 N1M1P inv_rst_2( .Z(rst_l[2]), .A(rst[2]) );
665 N1M1P inv_rst_1( .Z(rst_l[1]), .A(rst[1]) );
666 N1M1P inv_rst_0( .Z(rst_l[0]), .A(rst[0]) );
667
668endmodule
669
670
671`else // !ifdef NEPTUNE
672`endif
673
674
675