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 154

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 83 mihad
// Revision 1.5  2003/01/27 16:49:31  mihad
46
// Changed module and file names. Updated scripts accordingly. FIFO synchronizations changed.
47
//
48 77 mihad
// Revision 1.4  2002/08/13 11:03:53  mihad
49
// Added a few testcases. Repaired wrong reset value for PCI_AM5 register. Repaired Parity Error Detected bit setting. Changed PCI_AM0 to always enabled(regardles of PCI_AM0 define), if image 0 is used as configuration image
50
//
51 45 mihad
// Revision 1.3  2002/02/01 15:25:12  mihad
52
// Repaired a few bugs, updated specification, added test bench files and design document
53
//
54 21 mihad
// Revision 1.2  2001/10/05 08:14:30  mihad
55
// Updated all files with inclusion of timescale file for simulation purposes.
56
//
57 6 mihad
// Revision 1.1.1.1  2001/10/02 15:33:47  mihad
58
// New project directory structure
59 2 mihad
//
60 6 mihad
//
61 2 mihad
 
62 21 mihad
// synopsys translate_off
63 6 mihad
`include "timescale.v"
64 21 mihad
// synopsys translate_on
65
`include "pci_constants.v"
66
`include "bus_commands.v"
67 6 mihad
 
68 77 mihad
module pci_parity_check
69 2 mihad
(
70
    reset_in,
71
    clk_in,
72
    pci_par_in,
73
    pci_par_out,
74
    pci_par_en_out,
75
    pci_perr_in,
76
    pci_perr_out,
77
    pci_perr_out_in,
78
    pci_perr_en_out,
79
    pci_serr_en_in,
80
    pci_serr_out,
81
    pci_serr_out_in,
82
    pci_serr_en_out,
83
    pci_frame_reg_in,
84
    pci_frame_en_in,
85
    pci_irdy_en_in,
86
    pci_irdy_reg_in,
87
    pci_trdy_reg_in,
88
    pci_trdy_en_in,
89
    pci_par_en_in,
90
    pci_ad_out_in,
91
    pci_ad_reg_in,
92
    pci_cbe_in_in,
93 21 mihad
    pci_cbe_reg_in,
94 2 mihad
    pci_cbe_out_in,
95
    pci_cbe_en_in,
96
    pci_ad_en_in,
97
    par_err_response_in,
98
    par_err_detect_out,
99
    perr_mas_detect_out,
100
 
101
    serr_enable_in,
102
    sig_serr_out
103 21 mihad
 
104 2 mihad
);
105
 
106
// system inputs
107
input       reset_in ;
108
input       clk_in ;
109
 
110
// pci signals that are monitored or generated by parity error checker
111
input           pci_par_in ;            // pci PAR input
112
output          pci_par_out ;           // pci_PAR output
113
output          pci_par_en_out ;        // pci PAR enable output
114
input           pci_perr_in ;           // PERR# input
115
output          pci_perr_out ;          // PERR# output
116
output          pci_perr_en_out ;       // PERR# buffer enable output
117
input           pci_serr_en_in ;        // SERR enable input
118
output          pci_serr_out ;          // SERR# output
119
input           pci_serr_out_in ;       // SERR# output value input
120
input           pci_perr_out_in ;       // PERR# output value input
121
output          pci_serr_en_out ;       // SERR# buffer enable output
122
input           pci_frame_reg_in ;       // frame from pci bus input
123
input           pci_frame_en_in ;       // frame enable driven by master state machine
124
input           pci_irdy_en_in ;        // irdy enable input from PCI master
125
input           pci_irdy_reg_in ;        // irdy from PCI bus
126
input           pci_trdy_reg_in ;        // target ready from PCI bus
127
input           pci_trdy_en_in ;        // target ready output enable
128
input           pci_par_en_in ;         // par enable input
129
input [31:0]    pci_ad_out_in ;         // data driven by bridge to PCI
130
input [31:0]    pci_ad_reg_in ;          // data driven by other agents on PCI
131
input [3:0]     pci_cbe_in_in ;         // cbe driven by outside agents
132 21 mihad
input [3:0]     pci_cbe_reg_in ;        // registered cbe driven by outside agents
133 2 mihad
input [3:0]     pci_cbe_out_in ;        // cbe driven by pci master state machine
134
input           pci_ad_en_in ;          // ad enable input
135
input           par_err_response_in ;   // parity error response bit from conf.space
136
output          par_err_detect_out ;    // parity error detected signal out
137
output          perr_mas_detect_out ;   // master asserted PERR or sampled PERR asserted
138
input           serr_enable_in ;        // system error enable bit from conf.space
139
output          sig_serr_out ;          // signalled system error output for configuration space
140
input           pci_cbe_en_in ;
141
 
142
// FFs for frame input - used for determining whether PAR is sampled for address phase or for data phase
143
reg     frame_dec2 ;
144
reg check_perr ;
145
 
146
/*=======================================================================================================================
147 21 mihad
CBE lines' parity is needed for overall parity calculation
148 2 mihad
=======================================================================================================================*/
149 83 mihad
wire par_cbe_out = pci_cbe_out_in[3] ^ pci_cbe_out_in[2] ^ pci_cbe_out_in[1] ^ pci_cbe_out_in[0] ;
150
wire par_cbe_in  = pci_cbe_reg_in[3] ^ pci_cbe_reg_in[2] ^ pci_cbe_reg_in[1] ^ pci_cbe_reg_in[0] ;
151 2 mihad
 
152
/*=======================================================================================================================
153
Parity generator - parity is generated and assigned to output on every clock edge. PAR output enable is active
154
one clock cycle after data output enable. Depending on whether master is performing access or target is responding,
155 21 mihad
apropriate cbe data is included in parity generation. Non - registered CBE is used during reads through target SM
156 2 mihad
=======================================================================================================================*/
157
 
158
// generate appropriate par signal
159 83 mihad
wire data_par = (pci_ad_out_in[31] ^ pci_ad_out_in[30] ^ pci_ad_out_in[29] ^ pci_ad_out_in[28]) ^
160
                (pci_ad_out_in[27] ^ pci_ad_out_in[26] ^ pci_ad_out_in[25] ^ pci_ad_out_in[24]) ^
161
                (pci_ad_out_in[23] ^ pci_ad_out_in[22] ^ pci_ad_out_in[21] ^ pci_ad_out_in[20]) ^
162
                (pci_ad_out_in[19] ^ pci_ad_out_in[18] ^ pci_ad_out_in[17] ^ pci_ad_out_in[16]) ^
163
                (pci_ad_out_in[15] ^ pci_ad_out_in[14] ^ pci_ad_out_in[13] ^ pci_ad_out_in[12]) ^
164
                (pci_ad_out_in[11] ^ pci_ad_out_in[10] ^ pci_ad_out_in[9]  ^ pci_ad_out_in[8])  ^
165
                (pci_ad_out_in[7]  ^ pci_ad_out_in[6]  ^ pci_ad_out_in[5]  ^ pci_ad_out_in[4])  ^
166
                (pci_ad_out_in[3]  ^ pci_ad_out_in[2]  ^ pci_ad_out_in[1]  ^ pci_ad_out_in[0]) ;
167 2 mihad
 
168 83 mihad
wire par_out_only = data_par ^ par_cbe_out ;
169 21 mihad
 
170 77 mihad
pci_par_crit par_gen
171 2 mihad
(
172
    .par_out        (pci_par_out),
173
    .par_out_in     (par_out_only),
174
    .pci_cbe_en_in  (pci_cbe_en_in),
175
    .data_par_in    (data_par),
176
    .pci_cbe_in     (pci_cbe_in_in)
177
) ;
178
 
179
// PAR enable = ad output enable delayed by one clock
180
assign pci_par_en_out = pci_ad_en_in ;
181
 
182
/*=======================================================================================================================
183
Parity checker - parity is checked on every clock cycle. When parity error is detected, appropriate action is taken
184 21 mihad
to signal address parity errors on SERR if enabled and data parity errors on PERR# if enabled. Logic also drives
185 2 mihad
outputs to configuration space to set appropriate status bits if parity error is detected. PAR signal is checked on
186
master read operations or writes through pci target. Master read is performed when master drives irdy output and
187
doesn't drive ad lines. Writes through target are performed when target is driving trdy and doesn't drive ad lines.
188
=======================================================================================================================*/
189
 
190
// equation indicating whether to check and generate or not PERR# signal on next cycle
191
wire perr_generate =  ~pci_par_en_in && ~pci_ad_en_in                   // par was not generated on this cycle, so it should be checked
192
                      && ((pci_irdy_en_in && ~pci_trdy_reg_in) ||       // and master is driving irdy and target is signaling ready
193
                          (pci_trdy_en_in && ~pci_irdy_reg_in)) ;       // or target is driving trdy and master is signaling ready
194
 
195 83 mihad
wire data_in_par = (pci_ad_reg_in[31] ^ pci_ad_reg_in[30] ^ pci_ad_reg_in[29] ^ pci_ad_reg_in[28]) ^
196
                   (pci_ad_reg_in[27] ^ pci_ad_reg_in[26] ^ pci_ad_reg_in[25] ^ pci_ad_reg_in[24]) ^
197
                   (pci_ad_reg_in[23] ^ pci_ad_reg_in[22] ^ pci_ad_reg_in[21] ^ pci_ad_reg_in[20]) ^
198
                   (pci_ad_reg_in[19] ^ pci_ad_reg_in[18] ^ pci_ad_reg_in[17] ^ pci_ad_reg_in[16]) ^
199
                   (pci_ad_reg_in[15] ^ pci_ad_reg_in[14] ^ pci_ad_reg_in[13] ^ pci_ad_reg_in[12]) ^
200
                   (pci_ad_reg_in[11] ^ pci_ad_reg_in[10] ^ pci_ad_reg_in[9]  ^ pci_ad_reg_in[8])  ^
201
                   (pci_ad_reg_in[7]  ^ pci_ad_reg_in[6]  ^ pci_ad_reg_in[5]  ^ pci_ad_reg_in[4])  ^
202
                   (pci_ad_reg_in[3]  ^ pci_ad_reg_in[2]  ^ pci_ad_reg_in[1]  ^ pci_ad_reg_in[0]) ;
203 2 mihad
 
204
//wire perr = (cbe_par_reg ^ pci_par_in ^ data_in_par) ;
205
wire perr ;
206
wire perr_n ;
207
wire perr_en ;
208
 
209
assign pci_perr_out = perr_n ;
210
 
211
// parity error output assignment
212
//assign pci_perr_out = ~(perr && perr_generate) ;
213
 
214 83 mihad
wire non_critical_par = par_cbe_in ^ data_in_par ;
215 2 mihad
 
216 77 mihad
pci_perr_crit perr_crit_gen
217 2 mihad
(
218
    .perr_out           (perr),
219
    .perr_n_out         (perr_n),
220
    .non_critical_par_in(non_critical_par),
221
    .pci_par_in         (pci_par_in),
222
    .perr_generate_in   (perr_generate)
223
) ;
224
 
225
// PERR# enable
226
wire pci_perr_en_reg ;
227 77 mihad
pci_perr_en_crit perr_en_crit_gen
228 2 mihad
(
229
    .reset_in               (reset_in),
230
    .clk_in                 (clk_in),
231
    .perr_en_out            (pci_perr_en_out),
232
    .perr_en_reg_out        (pci_perr_en_reg),
233
    .non_critical_par_in    (non_critical_par),
234
    .pci_par_in             (pci_par_in),
235
    .perr_generate_in       (perr_generate),
236
    .par_err_response_in    (par_err_response_in)
237
) ;
238
 
239
// address phase decoding
240
always@(posedge reset_in or posedge clk_in)
241
begin
242
    if (reset_in)
243
        frame_dec2 <= #`FF_DELAY 1'b0 ;
244
    else
245 21 mihad
        frame_dec2 <= #`FF_DELAY pci_frame_reg_in ;
246 2 mihad
end
247
 
248 21 mihad
// address phase parity error checking - done after address phase is detected - which is - when bridge's master is not driving frame,
249
// frame was asserted on previous cycle and was not asserted two cycles before.
250
wire check_for_serr_on_first = ~pci_frame_reg_in && frame_dec2  && ~pci_frame_en_in ;
251 2 mihad
 
252 21 mihad
reg  check_for_serr_on_second ;
253
always@(posedge reset_in or posedge clk_in)
254
begin
255
    if ( reset_in )
256
        check_for_serr_on_second <= #`FF_DELAY 1'b0 ;
257
    else
258
        check_for_serr_on_second <= #`FF_DELAY check_for_serr_on_first && ( pci_cbe_reg_in == `BC_DUAL_ADDR_CYC ) ;
259
end
260
 
261
wire check_for_serr = check_for_serr_on_first || check_for_serr_on_second ;
262
 
263
wire serr_generate = check_for_serr && serr_enable_in && par_err_response_in ;
264
 
265 77 mihad
pci_serr_en_crit serr_en_crit_gen
266 2 mihad
(
267
    .serr_en_out        (pci_serr_en_out),
268
    .pci_par_in         (pci_par_in),
269
    .non_critical_par_in(non_critical_par),
270
    .serr_generate_in   (serr_generate)
271
);
272
 
273
 
274
// serr is enabled only for reporting errors - route this signal to configuration space
275
assign sig_serr_out = pci_serr_en_in ;
276
 
277
// SERR# output is always 0, just enable is driven apropriately
278 77 mihad
pci_serr_crit serr_crit_gen
279 2 mihad
(
280
    .serr_out               (pci_serr_out),
281
    .non_critical_par_in    (non_critical_par),
282
    .pci_par_in             (pci_par_in),
283
    .serr_check_in          (check_for_serr)
284
);
285
 
286
/*=======================================================================================================================================
287
    Synchronizing mechanism detecting what is supposed to be done - PERR# generation or PERR# checking
288
=======================================================================================================================================*/
289
// perr should be checked one clock after PAR is generated
290
always@(posedge reset_in or posedge clk_in)
291
begin
292
    if ( reset_in )
293
        check_perr <= #`FF_DELAY 1'b0 ;
294
    else
295
        check_perr <= #`FF_DELAY pci_par_en_in ;
296
end
297
 
298
wire perr_sampled_in = ~pci_perr_in && check_perr ;
299
reg perr_sampled ;
300
always@(posedge reset_in or posedge clk_in)
301
begin
302
    if (reset_in)
303
        perr_sampled <= #`FF_DELAY 1'b0 ;
304
    else
305
        perr_sampled <= #`FF_DELAY perr_sampled_in ;
306
end
307
 
308
// assign output for parity error detected bit
309 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
310 2 mihad
 
311
// FF indicating that that last operation was done as bus master
312 21 mihad
reg frame_and_irdy_en_prev      ;
313
reg frame_and_irdy_en_prev_prev ;
314 2 mihad
reg master_perr_report ;
315
always@(posedge reset_in or posedge clk_in)
316
begin
317
    if ( reset_in )
318 21 mihad
    begin
319
        master_perr_report          <= #`FF_DELAY 1'b0 ;
320
        frame_and_irdy_en_prev      <= #`FF_DELAY 1'b0 ;
321
        frame_and_irdy_en_prev_prev <= #`FF_DELAY 1'b0 ;
322
    end
323 2 mihad
    else
324 21 mihad
    begin
325
        master_perr_report          <= #`FF_DELAY frame_and_irdy_en_prev_prev ;
326
        frame_and_irdy_en_prev      <= #`FF_DELAY pci_irdy_en_in && pci_frame_en_in ;
327
        frame_and_irdy_en_prev_prev <= #`FF_DELAY frame_and_irdy_en_prev ;
328
    end
329 2 mihad
end
330
 
331
assign perr_mas_detect_out = master_perr_report && ( (par_err_response_in && perr_sampled) || pci_perr_en_reg ) ;
332
 
333 21 mihad
endmodule

powered by: WebSVN 2.1.0

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