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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_8/] [rtl/] [verilog/] [pci_parity_check.v] - Blame information for rev 21

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

powered by: WebSVN 2.1.0

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