OpenCores
URL https://opencores.org/ocsvn/pci/pci/trunk

Subversion Repositories pci

[/] [pci/] [tags/] [rel_6/] [rtl/] [verilog/] [pci_parity_check.v] - Blame information for rev 45

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 mihad
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  File name "pci_parity_check.v"                              ////
4
////                                                              ////
5
////  This file is part of the "PCI bridge" project               ////
6
////  http://www.opencores.org/cores/pci/                         ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - Miha Dolenc (mihad@opencores.org)                     ////
10
////                                                              ////
11
////  All additional information is avaliable in the README       ////
12
////  file.                                                       ////
13
////                                                              ////
14
////                                                              ////
15
//////////////////////////////////////////////////////////////////////
16
////                                                              ////
17
//// Copyright (C) 2001 Miha Dolenc, mihad@opencores.org          ////
18
////                                                              ////
19
//// This source file may be used and distributed without         ////
20
//// restriction provided that this copyright statement is not    ////
21
//// removed from the file and that any derivative work contains  ////
22
//// the original copyright notice and the associated disclaimer. ////
23
////                                                              ////
24
//// This source file is free software; you can redistribute it   ////
25
//// and/or modify it under the terms of the GNU Lesser General   ////
26
//// Public License as published by the Free Software Foundation; ////
27
//// either version 2.1 of the License, or (at your option) any   ////
28
//// later version.                                               ////
29
////                                                              ////
30
//// This source is distributed in the hope that it will be       ////
31
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
32
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
33
//// PURPOSE.  See the GNU Lesser General Public License for more ////
34
//// details.                                                     ////
35
////                                                              ////
36
//// You should have received a copy of the GNU Lesser General    ////
37
//// Public License along with this source; if not, download it   ////
38
//// from http://www.opencores.org/lgpl.shtml                     ////
39
////                                                              ////
40
//////////////////////////////////////////////////////////////////////
41
//
42
// CVS Revision History
43
//
44
// $Log: not supported by cvs2svn $
45 45 mihad
// Revision 1.3  2002/02/01 15:25:12  mihad
46
// Repaired a few bugs, updated specification, added test bench files and design document
47
//
48 21 mihad
// Revision 1.2  2001/10/05 08:14:30  mihad
49
// Updated all files with inclusion of timescale file for simulation purposes.
50
//
51 6 mihad
// Revision 1.1.1.1  2001/10/02 15:33:47  mihad
52
// New project directory structure
53 2 mihad
//
54 6 mihad
//
55 2 mihad
 
56 21 mihad
// synopsys translate_off
57 6 mihad
`include "timescale.v"
58 21 mihad
// synopsys translate_on
59
`include "pci_constants.v"
60
`include "bus_commands.v"
61 6 mihad
 
62 2 mihad
module PCI_PARITY_CHECK
63
(
64
    reset_in,
65
    clk_in,
66
    pci_par_in,
67
    pci_par_out,
68
    pci_par_en_out,
69
    pci_perr_in,
70
    pci_perr_out,
71
    pci_perr_out_in,
72
    pci_perr_en_out,
73
    pci_serr_en_in,
74
    pci_serr_out,
75
    pci_serr_out_in,
76
    pci_serr_en_out,
77
    pci_frame_reg_in,
78
    pci_frame_en_in,
79
    pci_irdy_en_in,
80
    pci_irdy_reg_in,
81
    pci_trdy_reg_in,
82
    pci_trdy_en_in,
83
    pci_par_en_in,
84
    pci_ad_out_in,
85
    pci_ad_reg_in,
86
    pci_cbe_in_in,
87 21 mihad
    pci_cbe_reg_in,
88 2 mihad
    pci_cbe_out_in,
89
    pci_cbe_en_in,
90
    pci_ad_en_in,
91
    par_err_response_in,
92
    par_err_detect_out,
93
    perr_mas_detect_out,
94
 
95
    serr_enable_in,
96
    sig_serr_out
97 21 mihad
 
98 2 mihad
);
99
 
100
// system inputs
101
input       reset_in ;
102
input       clk_in ;
103
 
104
// pci signals that are monitored or generated by parity error checker
105
input           pci_par_in ;            // pci PAR input
106
output          pci_par_out ;           // pci_PAR output
107
output          pci_par_en_out ;        // pci PAR enable output
108
input           pci_perr_in ;           // PERR# input
109
output          pci_perr_out ;          // PERR# output
110
output          pci_perr_en_out ;       // PERR# buffer enable output
111
input           pci_serr_en_in ;        // SERR enable input
112
output          pci_serr_out ;          // SERR# output
113
input           pci_serr_out_in ;       // SERR# output value input
114
input           pci_perr_out_in ;       // PERR# output value input
115
output          pci_serr_en_out ;       // SERR# buffer enable output
116
input           pci_frame_reg_in ;       // frame from pci bus input
117
input           pci_frame_en_in ;       // frame enable driven by master state machine
118
input           pci_irdy_en_in ;        // irdy enable input from PCI master
119
input           pci_irdy_reg_in ;        // irdy from PCI bus
120
input           pci_trdy_reg_in ;        // target ready from PCI bus
121
input           pci_trdy_en_in ;        // target ready output enable
122
input           pci_par_en_in ;         // par enable input
123
input [31:0]    pci_ad_out_in ;         // data driven by bridge to PCI
124
input [31:0]    pci_ad_reg_in ;          // data driven by other agents on PCI
125
input [3:0]     pci_cbe_in_in ;         // cbe driven by outside agents
126 21 mihad
input [3:0]     pci_cbe_reg_in ;        // registered cbe driven by outside agents
127 2 mihad
input [3:0]     pci_cbe_out_in ;        // cbe driven by pci master state machine
128
input           pci_ad_en_in ;          // ad enable input
129
input           par_err_response_in ;   // parity error response bit from conf.space
130
output          par_err_detect_out ;    // parity error detected signal out
131
output          perr_mas_detect_out ;   // master asserted PERR or sampled PERR asserted
132
input           serr_enable_in ;        // system error enable bit from conf.space
133
output          sig_serr_out ;          // signalled system error output for configuration space
134
input           pci_cbe_en_in ;
135
 
136
// FFs for frame input - used for determining whether PAR is sampled for address phase or for data phase
137
reg     frame_dec2 ;
138
reg check_perr ;
139
 
140
/*=======================================================================================================================
141 21 mihad
CBE lines' parity is needed for overall parity calculation
142 2 mihad
=======================================================================================================================*/
143
wire par_cbe_out = pci_cbe_out_in[3] ^^ pci_cbe_out_in[2] ^^ pci_cbe_out_in[1] ^^ pci_cbe_out_in[0] ;
144 21 mihad
wire par_cbe_in  = pci_cbe_reg_in[3] ^^ pci_cbe_reg_in[2] ^^ pci_cbe_reg_in[1] ^^ pci_cbe_reg_in[0] ;
145 2 mihad
 
146
/*=======================================================================================================================
147
Parity generator - parity is generated and assigned to output on every clock edge. PAR output enable is active
148
one clock cycle after data output enable. Depending on whether master is performing access or target is responding,
149 21 mihad
apropriate cbe data is included in parity generation. Non - registered CBE is used during reads through target SM
150 2 mihad
=======================================================================================================================*/
151
 
152
// generate appropriate par signal
153
wire data_par = (pci_ad_out_in[31] ^^ pci_ad_out_in[30] ^^ pci_ad_out_in[29] ^^ pci_ad_out_in[28]) ^^
154
                (pci_ad_out_in[27] ^^ pci_ad_out_in[26] ^^ pci_ad_out_in[25] ^^ pci_ad_out_in[24]) ^^
155
                (pci_ad_out_in[23] ^^ pci_ad_out_in[22] ^^ pci_ad_out_in[21] ^^ pci_ad_out_in[20]) ^^
156
                (pci_ad_out_in[19] ^^ pci_ad_out_in[18] ^^ pci_ad_out_in[17] ^^ pci_ad_out_in[16]) ^^
157
                (pci_ad_out_in[15] ^^ pci_ad_out_in[14] ^^ pci_ad_out_in[13] ^^ pci_ad_out_in[12]) ^^
158
                (pci_ad_out_in[11] ^^ pci_ad_out_in[10] ^^ pci_ad_out_in[9]  ^^ pci_ad_out_in[8])  ^^
159
                (pci_ad_out_in[7]  ^^ pci_ad_out_in[6]  ^^ pci_ad_out_in[5]  ^^ pci_ad_out_in[4])  ^^
160
                (pci_ad_out_in[3]  ^^ pci_ad_out_in[2]  ^^ pci_ad_out_in[1]  ^^ pci_ad_out_in[0]) ;
161
 
162
wire par_out_only = data_par ^^ par_cbe_out ;
163 21 mihad
 
164 2 mihad
PAR_CRIT par_gen
165
(
166
    .par_out        (pci_par_out),
167
    .par_out_in     (par_out_only),
168
    .pci_cbe_en_in  (pci_cbe_en_in),
169
    .data_par_in    (data_par),
170
    .pci_cbe_in     (pci_cbe_in_in)
171
) ;
172
 
173
// PAR enable = ad output enable delayed by one clock
174
assign pci_par_en_out = pci_ad_en_in ;
175
 
176
/*=======================================================================================================================
177
Parity checker - parity is checked on every clock cycle. When parity error is detected, appropriate action is taken
178 21 mihad
to signal address parity errors on SERR if enabled and data parity errors on PERR# if enabled. Logic also drives
179 2 mihad
outputs to configuration space to set appropriate status bits if parity error is detected. PAR signal is checked on
180
master read operations or writes through pci target. Master read is performed when master drives irdy output and
181
doesn't drive ad lines. Writes through target are performed when target is driving trdy and doesn't drive ad lines.
182
=======================================================================================================================*/
183
 
184
// equation indicating whether to check and generate or not PERR# signal on next cycle
185
wire perr_generate =  ~pci_par_en_in && ~pci_ad_en_in                   // par was not generated on this cycle, so it should be checked
186
                      && ((pci_irdy_en_in && ~pci_trdy_reg_in) ||       // and master is driving irdy and target is signaling ready
187
                          (pci_trdy_en_in && ~pci_irdy_reg_in)) ;       // or target is driving trdy and master is signaling ready
188
 
189
wire data_in_par = (pci_ad_reg_in[31] ^^ pci_ad_reg_in[30] ^^ pci_ad_reg_in[29] ^^ pci_ad_reg_in[28]) ^^
190
                   (pci_ad_reg_in[27] ^^ pci_ad_reg_in[26] ^^ pci_ad_reg_in[25] ^^ pci_ad_reg_in[24]) ^^
191
                   (pci_ad_reg_in[23] ^^ pci_ad_reg_in[22] ^^ pci_ad_reg_in[21] ^^ pci_ad_reg_in[20]) ^^
192
                   (pci_ad_reg_in[19] ^^ pci_ad_reg_in[18] ^^ pci_ad_reg_in[17] ^^ pci_ad_reg_in[16]) ^^
193
                   (pci_ad_reg_in[15] ^^ pci_ad_reg_in[14] ^^ pci_ad_reg_in[13] ^^ pci_ad_reg_in[12]) ^^
194
                   (pci_ad_reg_in[11] ^^ pci_ad_reg_in[10] ^^ pci_ad_reg_in[9]  ^^ pci_ad_reg_in[8])  ^^
195
                   (pci_ad_reg_in[7]  ^^ pci_ad_reg_in[6]  ^^ pci_ad_reg_in[5]  ^^ pci_ad_reg_in[4])  ^^
196
                   (pci_ad_reg_in[3]  ^^ pci_ad_reg_in[2]  ^^ pci_ad_reg_in[1]  ^^ pci_ad_reg_in[0]) ;
197
 
198
//wire perr = (cbe_par_reg ^ pci_par_in ^ data_in_par) ;
199
wire perr ;
200
wire perr_n ;
201
wire perr_en ;
202
 
203
assign pci_perr_out = perr_n ;
204
 
205
// parity error output assignment
206
//assign pci_perr_out = ~(perr && perr_generate) ;
207
 
208 21 mihad
wire non_critical_par = par_cbe_in ^^ data_in_par ;
209 2 mihad
 
210
PERR_CRIT perr_crit_gen
211
(
212
    .perr_out           (perr),
213
    .perr_n_out         (perr_n),
214
    .non_critical_par_in(non_critical_par),
215
    .pci_par_in         (pci_par_in),
216
    .perr_generate_in   (perr_generate)
217
) ;
218
 
219
// PERR# enable
220
wire pci_perr_en_reg ;
221
PERR_EN_CRIT perr_en_crit_gen
222
(
223
    .reset_in               (reset_in),
224
    .clk_in                 (clk_in),
225
    .perr_en_out            (pci_perr_en_out),
226
    .perr_en_reg_out        (pci_perr_en_reg),
227
    .non_critical_par_in    (non_critical_par),
228
    .pci_par_in             (pci_par_in),
229
    .perr_generate_in       (perr_generate),
230
    .par_err_response_in    (par_err_response_in)
231
) ;
232
 
233
// address phase decoding
234
always@(posedge reset_in or posedge clk_in)
235
begin
236
    if (reset_in)
237
        frame_dec2 <= #`FF_DELAY 1'b0 ;
238
    else
239 21 mihad
        frame_dec2 <= #`FF_DELAY pci_frame_reg_in ;
240 2 mihad
end
241
 
242 21 mihad
// address phase parity error checking - done after address phase is detected - which is - when bridge's master is not driving frame,
243
// frame was asserted on previous cycle and was not asserted two cycles before.
244
wire check_for_serr_on_first = ~pci_frame_reg_in && frame_dec2  && ~pci_frame_en_in ;
245 2 mihad
 
246 21 mihad
reg  check_for_serr_on_second ;
247
always@(posedge reset_in or posedge clk_in)
248
begin
249
    if ( reset_in )
250
        check_for_serr_on_second <= #`FF_DELAY 1'b0 ;
251
    else
252
        check_for_serr_on_second <= #`FF_DELAY check_for_serr_on_first && ( pci_cbe_reg_in == `BC_DUAL_ADDR_CYC ) ;
253
end
254
 
255
wire check_for_serr = check_for_serr_on_first || check_for_serr_on_second ;
256
 
257
wire serr_generate = check_for_serr && serr_enable_in && par_err_response_in ;
258
 
259 2 mihad
SERR_EN_CRIT serr_en_crit_gen
260
(
261
    .serr_en_out        (pci_serr_en_out),
262
    .pci_par_in         (pci_par_in),
263
    .non_critical_par_in(non_critical_par),
264
    .serr_generate_in   (serr_generate)
265
);
266
 
267
 
268
// serr is enabled only for reporting errors - route this signal to configuration space
269
assign sig_serr_out = pci_serr_en_in ;
270
 
271
// SERR# output is always 0, just enable is driven apropriately
272
SERR_CRIT serr_crit_gen
273
(
274
    .serr_out               (pci_serr_out),
275
    .non_critical_par_in    (non_critical_par),
276
    .pci_par_in             (pci_par_in),
277
    .serr_check_in          (check_for_serr)
278
);
279
 
280
/*=======================================================================================================================================
281
    Synchronizing mechanism detecting what is supposed to be done - PERR# generation or PERR# checking
282
=======================================================================================================================================*/
283
// perr should be checked one clock after PAR is generated
284
always@(posedge reset_in or posedge clk_in)
285
begin
286
    if ( reset_in )
287
        check_perr <= #`FF_DELAY 1'b0 ;
288
    else
289
        check_perr <= #`FF_DELAY pci_par_en_in ;
290
end
291
 
292
wire perr_sampled_in = ~pci_perr_in && check_perr ;
293
reg perr_sampled ;
294
always@(posedge reset_in or posedge clk_in)
295
begin
296
    if (reset_in)
297
        perr_sampled <= #`FF_DELAY 1'b0 ;
298
    else
299
        perr_sampled <= #`FF_DELAY perr_sampled_in ;
300
end
301
 
302
// assign output for parity error detected bit
303 45 mihad
assign par_err_detect_out = ~pci_serr_out_in || ~pci_perr_out_in ;//|| perr_sampled ; MihaD - removed - detected parity error is set only during Master Reads or Target Writes
304 2 mihad
 
305
// FF indicating that that last operation was done as bus master
306 21 mihad
reg frame_and_irdy_en_prev      ;
307
reg frame_and_irdy_en_prev_prev ;
308 2 mihad
reg master_perr_report ;
309
always@(posedge reset_in or posedge clk_in)
310
begin
311
    if ( reset_in )
312 21 mihad
    begin
313
        master_perr_report          <= #`FF_DELAY 1'b0 ;
314
        frame_and_irdy_en_prev      <= #`FF_DELAY 1'b0 ;
315
        frame_and_irdy_en_prev_prev <= #`FF_DELAY 1'b0 ;
316
    end
317 2 mihad
    else
318 21 mihad
    begin
319
        master_perr_report          <= #`FF_DELAY frame_and_irdy_en_prev_prev ;
320
        frame_and_irdy_en_prev      <= #`FF_DELAY pci_irdy_en_in && pci_frame_en_in ;
321
        frame_and_irdy_en_prev_prev <= #`FF_DELAY frame_and_irdy_en_prev ;
322
    end
323 2 mihad
end
324
 
325
assign perr_mas_detect_out = master_perr_report && ( (par_err_response_in && perr_sampled) || pci_perr_en_reg ) ;
326
 
327 21 mihad
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.