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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_3/] [rtl/] [verilog/] [conf_space.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: conf_space.v                                     ////
4
////                                                              ////
5
////  This file is part of the "PCI bridge" project               ////
6
////  http://www.opencores.org/cores/pci/                         ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - tadej@opencores.org                                   ////
10
////      - Tadej Markovic                                        ////
11
////                                                              ////
12
////  All additional information is avaliable in the README.txt   ////
13
////  file.                                                       ////
14
////                                                              ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18
//// Copyright (C) 2000 Tadej Markovic, tadej@opencores.org       ////
19
////                                                              ////
20
//// This source file may be used and distributed without         ////
21
//// restriction provided that this copyright statement is not    ////
22
//// removed from the file and that any derivative work contains  ////
23
//// the original copyright notice and the associated disclaimer. ////
24
////                                                              ////
25
//// This source file is free software; you can redistribute it   ////
26
//// and/or modify it under the terms of the GNU Lesser General   ////
27
//// Public License as published by the Free Software Foundation; ////
28
//// either version 2.1 of the License, or (at your option) any   ////
29
//// later version.                                               ////
30
////                                                              ////
31
//// This source is distributed in the hope that it will be       ////
32
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
33
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
34
//// PURPOSE.  See the GNU Lesser General Public License for more ////
35
//// details.                                                     ////
36
////                                                              ////
37
//// You should have received a copy of the GNU Lesser General    ////
38
//// Public License along with this source; if not, download it   ////
39
//// from http://www.opencores.org/lgpl.shtml                     ////
40
////                                                              ////
41
//////////////////////////////////////////////////////////////////////
42
//
43
// CVS Revision History
44
//
45
// $Log: not supported by cvs2svn $
46 45 mihad
// Revision 1.3  2002/02/01 15:25:12  mihad
47
// Repaired a few bugs, updated specification, added test bench files and design document
48
//
49 21 mihad
// Revision 1.2  2001/10/05 08:14:28  mihad
50
// Updated all files with inclusion of timescale file for simulation purposes.
51
//
52 6 mihad
// Revision 1.1.1.1  2001/10/02 15:33:46  mihad
53
// New project directory structure
54 2 mihad
//
55 6 mihad
//
56 2 mihad
 
57 21 mihad
`include "pci_constants.v"
58
 
59
// synopsys translate_off
60 6 mihad
`include "timescale.v"
61 21 mihad
// synopsys translate_on
62 2 mihad
 
63
/*-----------------------------------------------------------------------------------------------------------
64
        w_ prefix is a sign for Write (and read) side of Dual-Port registers
65
        r_ prefix is a sign for Read only side of Dual-Port registers
66 21 mihad
In the first line there are DATA and ADDRESS ports, in the second line there are write enable and read
67 2 mihad
enable signals with chip-select (conf_hit) for config. space.
68
In the third line there are output signlas from Command register of the PCI configuration header !!!
69
In the fourth line there are input signals to Status register of the PCI configuration header !!!
70
In the fifth line there is output from Latency Timer & r_Interrupt pin registers of the PCI conf. header !!!
71
Following are IMAGE specific registers, from which PCI_BASE_ADDR registers are the same as base address
72
registers from the PCI conf. header !!!
73
-----------------------------------------------------------------------------------------------------------*/
74
                                        // normal R/W address, data and control
75 21 mihad
module CONF_SPACE (     w_conf_address_in, w_conf_data_in, w_conf_data_out, r_conf_address_in, r_conf_data_out,
76 2 mihad
                                        w_we, w_re, r_re, w_byte_en, w_clock, reset, pci_clk, wb_clk,
77
                                        // outputs from command register of the PCI header
78
                                        serr_enable, perr_response, pci_master_enable, memory_space_enable, io_space_enable,
79
                                        // inputs to status register of the PCI header
80
                                        perr_in, serr_in, master_abort_recv, target_abort_recv, target_abort_set, master_data_par_err,
81
                                        // output from cache_line_size, latency timer and r_interrupt_pin register of the PCI header
82 21 mihad
                                        cache_line_size_to_pci, cache_line_size_to_wb, cache_lsize_not_zero_to_wb,
83
                                        latency_tim,
84 2 mihad
                                        // output from all pci IMAGE registers
85 21 mihad
                                        pci_base_addr0, pci_base_addr1, pci_base_addr2, pci_base_addr3, pci_base_addr4, pci_base_addr5,
86
                                        pci_memory_io0, pci_memory_io1, pci_memory_io2, pci_memory_io3, pci_memory_io4, pci_memory_io5,
87
                                        pci_addr_mask0, pci_addr_mask1, pci_addr_mask2, pci_addr_mask3, pci_addr_mask4, pci_addr_mask5,
88
                                        pci_tran_addr0, pci_tran_addr1, pci_tran_addr2, pci_tran_addr3, pci_tran_addr4, pci_tran_addr5,
89 2 mihad
                                        pci_img_ctrl0,  pci_img_ctrl1,  pci_img_ctrl2,  pci_img_ctrl3,  pci_img_ctrl4,  pci_img_ctrl5,
90
                                        // input to pci error control and status register, error address and error data registers
91 21 mihad
                                        pci_error_be, pci_error_bc, pci_error_rty_exp, pci_error_es, pci_error_sig, pci_error_addr,
92
                                        pci_error_data,
93
                                        // output from all wishbone IMAGE registers
94 2 mihad
                                        wb_base_addr0, wb_base_addr1, wb_base_addr2, wb_base_addr3, wb_base_addr4, wb_base_addr5,
95 21 mihad
                                        wb_memory_io0, wb_memory_io1, wb_memory_io2, wb_memory_io3, wb_memory_io4, wb_memory_io5,
96 2 mihad
                                        wb_addr_mask0, wb_addr_mask1, wb_addr_mask2, wb_addr_mask3, wb_addr_mask4, wb_addr_mask5,
97
                                        wb_tran_addr0, wb_tran_addr1, wb_tran_addr2, wb_tran_addr3, wb_tran_addr4, wb_tran_addr5,
98 21 mihad
                                        wb_img_ctrl0,  wb_img_ctrl1,  wb_img_ctrl2,  wb_img_ctrl3,  wb_img_ctrl4,  wb_img_ctrl5,
99 2 mihad
                                        // input to wb error control and status register, error address and error data registers
100
                                        wb_error_be, wb_error_bc, wb_error_rty_exp, wb_error_es, wb_error_sig, wb_error_addr, wb_error_data,
101 21 mihad
                                        // output from conf. cycle generation register (sddress), int. control register & interrupt output
102
                                        config_addr, icr_soft_res, int_out,
103 2 mihad
                                        // input to interrupt status register
104 21 mihad
                                        isr_sys_err_int, isr_par_err_int, isr_int_prop ) ;
105
 
106
 
107 2 mihad
/*###########################################################################################################
108
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
109
        Input and output ports
110
        ======================
111
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
112
###########################################################################################################*/
113
 
114 21 mihad
// output data
115 2 mihad
output  [31 : 0]                         w_conf_data_out ;
116
output  [31 : 0]                         r_conf_data_out ;
117
reg             [31 : 0]                         w_conf_data_out ;
118 21 mihad
 
119
`ifdef  NO_CNF_IMAGE
120
`else
121 2 mihad
reg             [31 : 0]                         r_conf_data_out ;
122 21 mihad
`endif
123
 
124 2 mihad
// input data
125
input   [31 : 0]                         w_conf_data_in ;
126 21 mihad
wire    [31 : 0]                         w_conf_pdata_reduced ; // reduced data written into PCI image registers
127
wire    [31 : 0]                         w_conf_wdata_reduced ; // reduced data written into WB  image registers
128 2 mihad
// input address
129
input   [11 : 0]                         w_conf_address_in ;
130
input   [11 : 0]                         r_conf_address_in ;
131
// input control signals
132
input                                                   w_we ;
133
input                                                   w_re ;
134
input                                                   r_re ;
135
input   [3 : 0]                                  w_byte_en ;
136
input                                                   w_clock ;
137
input                                                   reset ;
138
input                                                   pci_clk ;
139
input                                                   wb_clk ;
140
// PCI header outputs from command register
141
output                                                  serr_enable ;
142
output                                                  perr_response ;
143
output                                                  pci_master_enable ;
144
output                                                  memory_space_enable ;
145
output                                                  io_space_enable ;
146
// PCI header inputs to status register
147
input                                                   perr_in ;
148
input                                                   serr_in ;
149
input                                                   master_abort_recv ;
150
input                                                   target_abort_recv ;
151
input                                                   target_abort_set ;
152
input                                                   master_data_par_err ;
153
// PCI header output from cache_line_size, latency timer and interrupt pin
154 21 mihad
output  [7 : 0]                                  cache_line_size_to_pci ; // sinchronized to PCI clock
155
output  [7 : 0]                                  cache_line_size_to_wb ;  // sinchronized to WB clock
156
output                                                  cache_lsize_not_zero_to_wb ; // used in WBU and PCIU
157 2 mihad
output  [7 : 0]                                  latency_tim ;
158 21 mihad
//output        [2 : 0]                                 int_pin ; // only 3 LSbits are important!
159 2 mihad
// PCI output from image registers
160 21 mihad
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr0 ;
161
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr1 ;
162
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr2 ;
163
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr3 ;
164
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr4 ;
165
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_base_addr5 ;
166 2 mihad
output                                                  pci_memory_io0 ;
167
output                                                  pci_memory_io1 ;
168
output                                                  pci_memory_io2 ;
169
output                                                  pci_memory_io3 ;
170
output                                                  pci_memory_io4 ;
171
output                                                  pci_memory_io5 ;
172 21 mihad
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask0 ;
173
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask1 ;
174
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask2 ;
175
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask3 ;
176
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask4 ;
177
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_addr_mask5 ;
178
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr0 ;
179
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr1 ;
180
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr2 ;
181
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr3 ;
182
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr4 ;
183
output  [31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] pci_tran_addr5 ;
184
output  [2 : 1]                 pci_img_ctrl0 ;
185
output  [2 : 1]                 pci_img_ctrl1 ;
186
output  [2 : 1]                 pci_img_ctrl2 ;
187
output  [2 : 1]                 pci_img_ctrl3 ;
188
output  [2 : 1]                 pci_img_ctrl4 ;
189
output  [2 : 1]                 pci_img_ctrl5 ;
190 2 mihad
// PCI input to pci error control and status register, error address and error data registers
191 21 mihad
input   [3 : 0]                                  pci_error_be ;
192
input   [3 : 0]                 pci_error_bc ;
193 2 mihad
input                           pci_error_rty_exp ;
194 21 mihad
input                                                   pci_error_es ;
195
input                           pci_error_sig ;
196
input   [31 : 0]                pci_error_addr ;
197
input   [31 : 0]                pci_error_data ;
198 2 mihad
// WISHBONE output from image registers
199 21 mihad
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr0 ;
200
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr1 ;
201
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr2 ;
202
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr3 ;
203
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr4 ;
204
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_base_addr5 ;
205 2 mihad
output                                                  wb_memory_io0 ;
206
output                                                  wb_memory_io1 ;
207
output                                                  wb_memory_io2 ;
208
output                                                  wb_memory_io3 ;
209
output                                                  wb_memory_io4 ;
210
output                                                  wb_memory_io5 ;
211 21 mihad
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask0 ;
212
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask1 ;
213
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask2 ;
214
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask3 ;
215
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask4 ;
216
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_addr_mask5 ;
217
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr0 ;
218
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr1 ;
219
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr2 ;
220
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr3 ;
221
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr4 ;
222
output  [31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] wb_tran_addr5 ;
223
output  [2 : 0]                 wb_img_ctrl0 ;
224
output  [2 : 0]                 wb_img_ctrl1 ;
225
output  [2 : 0]                 wb_img_ctrl2 ;
226
output  [2 : 0]                 wb_img_ctrl3 ;
227
output  [2 : 0]                 wb_img_ctrl4 ;
228
output  [2 : 0]                 wb_img_ctrl5 ;
229 2 mihad
// WISHBONE input to wb error control and status register, error address and error data registers
230 21 mihad
input   [3 : 0]                          wb_error_be ;
231
input   [3 : 0]                  wb_error_bc ;
232 2 mihad
input                                   wb_error_rty_exp ;
233 21 mihad
input                           wb_error_es ;
234
input                           wb_error_sig ;
235
input   [31 : 0]                wb_error_addr ;
236
input   [31 : 0]                wb_error_data ;
237
// GENERAL output from conf. cycle generation register & int. control register
238
output  [23 : 0]                         config_addr ;
239 2 mihad
output                          icr_soft_res ;
240 21 mihad
output                                                  int_out ;
241
// GENERAL input to interrupt status register
242
input                           isr_sys_err_int ;
243
input                           isr_par_err_int ;
244
input                                                   isr_int_prop ;
245 2 mihad
 
246
 
247
/*###########################################################################################################
248
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
249
        REGISTERS definition
250
        ====================
251
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
252
###########################################################################################################*/
253
 
254 21 mihad
// Decoded Register Select signals for writting (only one address decoder)
255
reg             [55 : 0]                         w_reg_select_dec ;
256 2 mihad
 
257
/*###########################################################################################################
258
-------------------------------------------------------------------------------------------------------------
259
PCI CONFIGURATION SPACE HEADER (type 00h) registers
260
 
261
        BIST and some other registers are not implemented and therefor written in correct
262
        place with comment line. There are also some registers with NOT all bits implemented and therefor uses
263 21 mihad
        _bitX or _bitX2_X1 to sign which bit or range of bits are implemented.
264 2 mihad
        Some special cases and examples are described below!
265
-------------------------------------------------------------------------------------------------------------
266
###########################################################################################################*/
267
 
268
/*-----------------------------------------------------------------------------------------------------------
269
[000h-00Ch] First 4 DWORDs (32-bit) of PCI configuration header - the same regardless of the HEADER type !
270
                        r_ prefix is a sign for read only registers
271 21 mihad
        Vendor_ID is an ID for a specific vendor defined by PCI_SIG - 2321h does not belong to anyone (e.g.
272 2 mihad
        Xilinx's Vendor_ID is 10EEh and Altera's Vendor_ID is 1172h). Device_ID and Revision_ID should be used
273 21 mihad
        together by application. Class_Code has 3 bytes to define BASE class (06h for PCI Bridge), SUB class
274 2 mihad
        (00h for HOST type, 80h for Other Bridge type) and Interface type (00h for normal).
275
-----------------------------------------------------------------------------------------------------------*/
276
                        parameter                       r_vendor_id = `HEADER_VENDOR_ID ;       // 16'h2321 = 16'd8993 !!!
277
                        parameter                       r_device_id = `HEADER_DEVICE_ID ;
278 21 mihad
                        reg                                     command_bit8 ;
279
                        reg                                     command_bit6 ;
280
                        reg             [2 : 0]          command_bit2_0 ;
281
                        reg             [15 : 11]       status_bit15_11 ;
282 2 mihad
                        parameter                       r_status_bit10_9 = 2'b01 ;      // 2'b01 means MEDIUM devsel timing !!!
283
                        reg                                     status_bit8 ;
284 21 mihad
                        parameter                       r_status_bit7 = 1'b1 ; // fast back-to-back capable response !!!
285 2 mihad
                        parameter                       r_status_bit5 = `HEADER_66MHz ;         // 1'b0 indicates 33 MHz capable !!!
286
                        parameter                       r_revision_id = `HEADER_REVISION_ID ;
287
`ifdef          HOST
288
                        parameter                       r_class_code = 24'h06_00_00 ;
289
`else
290
                        parameter                       r_class_code = 24'h06_80_00 ;
291
`endif
292
                        reg             [7 : 0]          cache_line_size_reg     ;
293
                        reg             [7 : 0]          latency_timer ;
294
                        parameter                       r_header_type = 8'h00 ;
295
                        // REG                          bist                                                    NOT implemented !!!
296
 
297
/*-----------------------------------------------------------------------------------------------------------
298
[010h-03Ch] all other DWORDs (32-bit) of PCI configuration header - only for HEADER type 00h !
299
                        r_ prefix is a sign for read only registers
300
        BASE_ADDRESS_REGISTERS are the same as ones in the PCI Target configuration registers section. They
301 21 mihad
        are duplicated and therefor defined just ones and used with the same name as written below. If
302
        IMAGEx is NOT defined there is only parameter image_X assigned to '0' and this parameter is used
303 2 mihad
        elsewhere in the code. This parameter is defined in the INTERNAL SIGNALS part !!!
304
        Interrupt_Pin value 8'h01 is used for INT_A pin used.
305
        MIN_GNT and MAX_LAT are used for device's desired values for Latency Timer value. The value in boath
306
        registers specifies a period of time in units of 1/4 microsecond. ZERO indicates that there are no
307 21 mihad
        major requirements for the settings of Latency Timer.
308 2 mihad
        MIN_GNT specifieshow how long a burst period the device needs at 33MHz. MAX_LAT specifies how often
309
        the device needs to gain access to the PCI bus. Values are choosen assuming that the target does not
310
        insert any wait states. Follow the expamle of settings for simple display card.
311
        If we use 64 (32-bit) FIFO locations for one burst then we need 8 x 1/4 microsecond periods at 33MHz
312 21 mihad
        clock rate => MIN_GNT = 08h ! Resolution is 1024 x 768 (= 786432 pixels for one frame) with 16-bit
313 2 mihad
        color mode. We can transfere 2 16-bit pixels in one FIFO location. From that we calculate, that for
314
        one frame we need 6144 burst transferes in 1/25 second. So we need one burst every 6,51 microsecond
315
        and that is 26 x 1/4 microsecond or 1Ah x 1/4 microsecond => MAX_LAT = 1Ah !
316
-----------------------------------------------------------------------------------------------------------*/
317
                        // REG x 6              base_address_register_X                 IMPLEMENTED as          pci_ba_X !!!
318
                        // REG                  r_cardbus_cis_pointer                   NOT implemented !!!
319
                        // REG                  r_subsystem_vendor_id                   NOT implemented !!!
320
                        // REG                  r_subsystem_id                                  NOT implemented !!!
321
                        // REG                  r_expansion_rom_base_address    NOT implemented !!!
322
                        // REG                  r_cap_list_pointer                              NOT implemented !!!
323
                        reg             [7 : 0]  interrupt_line ;
324
                        parameter               r_interrupt_pin = 8'h01 ;
325
                        parameter               r_min_gnt = 8'h08 ;
326
                        parameter               r_max_lat = 8'h1a ;
327
 
328
 
329
/*###########################################################################################################
330
-------------------------------------------------------------------------------------------------------------
331
PCI Bridge default image SIZE parameters
332
        This parameters are not part of any register group, but are needed for default image size configuration
333
        used in PCI Target and WISHBONE Slave configuration registers!
334
-------------------------------------------------------------------------------------------------------------
335
###########################################################################################################*/
336
 
337
/*-----------------------------------------------------------------------------------------------------------
338 21 mihad
        PCI Target default image size parameters are defined with masked bits for address mask registers of
339
        each image space. By default there are 1MByte of address space defined for def_pci_imageX_addr_map
340 2 mihad
        parameters!
341
-----------------------------------------------------------------------------------------------------------*/
342 21 mihad
                wire    [19:0]   def_pci_image0_addr_map = `PCI_AM0 ;
343
                wire    [19:0]   def_pci_image1_addr_map = `PCI_AM1 ;
344
                wire    [19:0]   def_pci_image2_addr_map = `PCI_AM2 ;
345
                wire    [19:0]   def_pci_image3_addr_map = `PCI_AM3 ;
346
                wire    [19:0]   def_pci_image4_addr_map = `PCI_AM4 ;
347
                wire    [19:0]   def_pci_image5_addr_map = `PCI_AM5 ;
348 2 mihad
 
349
/*-----------------------------------------------------------------------------------------------------------
350 21 mihad
        WISHBONE Slave default image size parameters are defined with masked bits for address mask registers
351
        of each image space. By default there are 1MByte of address space defined for def_wb_imageX_addr_map
352 2 mihad
        parameters except for def_wb_image0_addr_map which is used for configuration space!
353
-----------------------------------------------------------------------------------------------------------*/
354
                        // PARAMETER    def_wb_image0_addr_map  IMPLEMENTED as r_wb_am0 parameter for CONF. space !!!
355 21 mihad
                wire    [19:0]   def_wb_image1_addr_map = 20'h0000_0 ;
356
                wire    [19:0]   def_wb_image2_addr_map = 20'h0000_0 ;
357
                wire    [19:0]   def_wb_image3_addr_map = 20'h0000_0 ;
358
                wire    [19:0]   def_wb_image4_addr_map = 20'h0000_0 ;
359
                wire    [19:0]   def_wb_image5_addr_map = 20'h0000_0 ;
360 2 mihad
 
361
 
362
/*###########################################################################################################
363
-------------------------------------------------------------------------------------------------------------
364
PCI Target configuration registers
365 21 mihad
        There are also some registers with NOT all bits implemented and therefor uses _bitX or _bitX2_X1 to
366 2 mihad
        sign which bit or range of bits are implemented. Some special cases and examples are described below!
367
-------------------------------------------------------------------------------------------------------------
368
###########################################################################################################*/
369
 
370
/*-----------------------------------------------------------------------------------------------------------
371 21 mihad
[100h-168h]
372
        Depending on defines (PCI_IMAGE1 or .. or PCI_IMAGE5 or (PCI_IMAGE0 and HOST)) in constants.v file,
373
        there are registers corresponding to each IMAGE defined to REG and parameter pci_image_X assigned to '1'.
374
        The maximum number of images is "6". By default there are first two images used and the first (PCI_IMAGE0)
375
        is assigned to Configuration space! With a 'define' PCI_IMAGEx you choose the number of used PCI IMAGES
376
        in a bridge without PCI_IMAGE0 (e.g. PCI_IMAGE3 tells, that PCI_IMAGE1, PCI_IMAGE2 and PCI_IMAGE3 are
377
        used for mapping the space from WB to PCI. Offcourse, PCI_IMAGE0 is assigned to Configuration space).
378 2 mihad
        That leave us PCI_IMAGE5 as the maximum number of images.
379 21 mihad
        There is one exeption, when the core is implemented as HOST. If so, then the PCI specification allowes
380
        the Configuration space NOT to be visible on the PCI bus. With `define PCI_IMAGE0 (and `define HOST), we
381
        assign PCI_IMAGE0 to normal WB to PCI image and not to configuration space!
382 2 mihad
 
383
        When error occurs, PCI ERR_ADDR and ERR_DATA registers stores address and data on the bus that
384
        caused error. While ERR_CS register stores Byte Enables and Bus Command in the MSByte. In bits 10
385
        and 8 it reports Retry Counter Expired (for posted writes), Error Source (Master Abort) and Error
386 21 mihad
        Report Signal (signals that error has occured) respectively. With bit 0 we enable Error Reporting
387 2 mihad
        mechanism.
388
-----------------------------------------------------------------------------------------------------------*/
389 21 mihad
`ifdef          HOST
390
        `ifdef  NO_CNF_IMAGE
391
                `ifdef  PCI_IMAGE0      // if PCI bridge is HOST and IMAGE0 is assigned as general image space
392 2 mihad
                        reg             [31 : 12]       pci_ba0_bit31_12 ;
393
                        reg             [2 : 1]         pci_img_ctrl0_bit2_1 ;
394
                        reg                                     pci_ba0_bit0 ;
395
                        reg             [31 : 12]       pci_am0 ;
396
                        reg             [31 : 12]       pci_ta0 ;
397 21 mihad
                `else // if PCI bridge is HOST and IMAGE0 is not used
398
                        wire    [31 : 12]       pci_ba0_bit31_12 = 20'h0000_0 ; // NO base address needed
399
                        wire    [2 : 1]         pci_img_ctrl0_bit2_1 = 2'b00 ; // NO addr.transl. and pre-fetch
400
                        wire                            pci_ba0_bit0 = 0 ; // config. space is MEMORY space
401
                        wire    [31 : 12]       pci_am0 = 20'h0000_0 ; // NO address mask needed
402
                        wire    [31 : 12]       pci_ta0 = 20'h0000_0 ; // NO address translation needed
403
                `endif
404 2 mihad
        `else // if PCI bridge is HOST and IMAGE0 is assigned to PCI configuration space
405 21 mihad
                        reg             [31 : 12]       pci_ba0_bit31_12 ;
406 2 mihad
                        wire    [2 : 1]         pci_img_ctrl0_bit2_1 = 2'b00 ; // NO pre-fetch and read line support
407
                        wire                            pci_ba0_bit0 = 0 ; // config. space is MEMORY space
408 45 mihad
                        wire    [31 : 12]       pci_am0 = 20'hFFFF_F ; // address mask for configuration image always 20'hffff_f
409 2 mihad
                        wire    [31 : 12]       pci_ta0 = 20'h0000_0 ; // NO address translation needed
410
        `endif
411
`else // if PCI bridge is GUEST, then IMAGE0 is assigned to PCI configuration space
412 21 mihad
                        reg             [31 : 12]       pci_ba0_bit31_12 ;
413 2 mihad
                        wire    [2 : 1]         pci_img_ctrl0_bit2_1 = 2'b00 ; // NO addr.transl. and pre-fetch
414
                        wire                            pci_ba0_bit0 = 0 ; // config. space is MEMORY space
415 45 mihad
                        wire    [31 : 12]       pci_am0 = 20'hffff_f ; // address mask for configuration image always 20'hffff_f
416 2 mihad
                        wire    [31 : 12]       pci_ta0 = 20'h0000_0 ; // NO address translation needed
417
`endif
418 21 mihad
// IMAGE1 is included by default, meanwhile other IMAGEs are optional !!!
419 2 mihad
                        reg             [2 : 1]         pci_img_ctrl1_bit2_1 ;
420
                        reg             [31 : 12]       pci_ba1_bit31_12 ;
421 21 mihad
        `ifdef  HOST
422 2 mihad
                        reg                                     pci_ba1_bit0 ;
423 21 mihad
        `else
424
                        wire                            pci_ba1_bit0 = `PCI_BA1_MEM_IO ;
425
        `endif
426 2 mihad
                        reg             [31 : 12]       pci_am1 ;
427
                        reg             [31 : 12]       pci_ta1 ;
428 21 mihad
`ifdef          PCI_IMAGE2
429 2 mihad
                        reg             [2 : 1]         pci_img_ctrl2_bit2_1 ;
430
                        reg             [31 : 12]       pci_ba2_bit31_12 ;
431 21 mihad
        `ifdef  HOST
432 2 mihad
                        reg                                     pci_ba2_bit0 ;
433 21 mihad
        `else
434
                        wire                            pci_ba2_bit0 = `PCI_BA2_MEM_IO ;
435
        `endif
436 2 mihad
                        reg             [31 : 12]       pci_am2 ;
437
                        reg             [31 : 12]       pci_ta2 ;
438 21 mihad
`else
439
            wire        [2 : 1]         pci_img_ctrl2_bit2_1 = 2'b00 ;
440
                        wire    [31 : 12]       pci_ba2_bit31_12 = 20'h0000_0 ;
441
            wire                                pci_ba2_bit0 = 1'b0 ;
442
            wire        [31 : 12]       pci_am2 = 20'h0000_0 ;
443
            wire        [31 : 12]       pci_ta2 = 20'h0000_0 ;
444 2 mihad
`endif
445 21 mihad
`ifdef          PCI_IMAGE3
446 2 mihad
                        reg             [2 : 1]         pci_img_ctrl3_bit2_1 ;
447
                        reg             [31 : 12]       pci_ba3_bit31_12 ;
448 21 mihad
        `ifdef  HOST
449 2 mihad
                        reg                                     pci_ba3_bit0 ;
450 21 mihad
        `else
451
                        wire                            pci_ba3_bit0 = `PCI_BA3_MEM_IO ;
452
        `endif
453 2 mihad
                        reg             [31 : 12]       pci_am3 ;
454
                        reg             [31 : 12]       pci_ta3 ;
455 21 mihad
`else
456
            wire        [2 : 1]         pci_img_ctrl3_bit2_1 = 2'b00 ;
457
                        wire    [31 : 12]       pci_ba3_bit31_12 = 20'h0000_0 ;
458
            wire                                pci_ba3_bit0 = 1'b0 ;
459
            wire        [31 : 12]       pci_am3 = 20'h0000_0 ;
460
            wire        [31 : 12]       pci_ta3 = 20'h0000_0 ;
461 2 mihad
`endif
462 21 mihad
`ifdef          PCI_IMAGE4
463 2 mihad
                        reg             [2 : 1]         pci_img_ctrl4_bit2_1 ;
464
                        reg             [31 : 12]       pci_ba4_bit31_12 ;
465 21 mihad
        `ifdef  HOST
466 2 mihad
                        reg                                     pci_ba4_bit0 ;
467 21 mihad
        `else
468
                        wire                            pci_ba4_bit0 = `PCI_BA4_MEM_IO ;
469
        `endif
470 2 mihad
                        reg             [31 : 12]       pci_am4 ;
471
                        reg             [31 : 12]       pci_ta4 ;
472 21 mihad
`else
473
            wire        [2 : 1]         pci_img_ctrl4_bit2_1 = 2'b00 ;
474
                        wire    [31 : 12]       pci_ba4_bit31_12 = 20'h0000_0 ;
475
            wire                                pci_ba4_bit0 = 1'b0 ;
476
            wire        [31 : 12]       pci_am4 = 20'h0000_0 ;
477
            wire        [31 : 12]       pci_ta4 = 20'h0000_0 ;
478 2 mihad
`endif
479 21 mihad
`ifdef          PCI_IMAGE5
480 2 mihad
                        reg             [2 : 1]         pci_img_ctrl5_bit2_1 ;
481
                        reg             [31 : 12]       pci_ba5_bit31_12 ;
482 21 mihad
        `ifdef  HOST
483 2 mihad
                        reg                                     pci_ba5_bit0 ;
484 21 mihad
        `else
485
                        wire                            pci_ba5_bit0 = `PCI_BA5_MEM_IO ;
486
        `endif
487 2 mihad
                        reg             [31 : 12]       pci_am5 ;
488
                        reg             [31 : 12]       pci_ta5 ;
489 21 mihad
`else
490
            wire        [2 : 1]         pci_img_ctrl5_bit2_1 = 2'b00 ;
491
                        wire    [31 : 12]       pci_ba5_bit31_12 = 20'h0000_0 ;
492
            wire                                pci_ba5_bit0 = 1'b0 ;
493
            wire        [31 : 12]       pci_am5 = 20'h0000_0 ;
494
            wire        [31 : 12]       pci_ta5 = 20'h0000_0 ;
495 2 mihad
`endif
496
                        reg             [31 : 24]       pci_err_cs_bit31_24 ;
497
                        reg                                     pci_err_cs_bit10 ;
498 21 mihad
                        reg                                     pci_err_cs_bit9 ;
499 2 mihad
                        reg                                     pci_err_cs_bit8 ;
500
                        reg                                     pci_err_cs_bit0 ;
501
                        reg             [31 : 0] pci_err_addr ;
502
                        reg             [31 : 0] pci_err_data ;
503 21 mihad
 
504
 
505 2 mihad
/*###########################################################################################################
506
-------------------------------------------------------------------------------------------------------------
507
WISHBONE Slave configuration registers
508 21 mihad
        There are also some registers with NOT all bits implemented and therefor uses _bitX or _bitX2_X1 to
509 2 mihad
        sign which bit or range of bits are implemented. Some special cases and examples are described below!
510
-------------------------------------------------------------------------------------------------------------
511
###########################################################################################################*/
512 21 mihad
 
513 2 mihad
/*-----------------------------------------------------------------------------------------------------------
514 21 mihad
[800h-85Ch]
515
        Depending on defines (WB_IMAGE1 or .. or WB_IMAGE4 or WB_IMAGE5) in constants.v file, there are
516
        registers corresponding to each IMAGE defined to REG and parameter wb_image_X assigned to '1'.
517
        The maximum number of images is "6". By default there are first two images used and the first (WB_IMAGE0)
518
        is assigned to Configuration space! With a 'define' WB_IMAGEx you choose the number of used WB IMAGES in
519
        a bridge without WB_IMAGE0 (e.g. WB_IMAGE3 tells, that WB_IMAGE1, WB_IMAGE2 and WB_IMAGE3 are used for
520
        mapping the space from PCI to WB. Offcourse, WB_IMAGE0 is assigned to Configuration space). That leave
521
        us WB_IMAGE5 as the maximum number of images.
522
 
523 2 mihad
        When error occurs, WISHBONE ERR_ADDR and ERR_DATA registers stores address and data on the bus that
524
        caused error. While ERR_CS register stores Byte Enables and Bus Command in the MSByte. In bits 10, 9
525
        and 8 it reports Retry Counter Expired (for posted writes), Error Source (Master Abort) and Error
526 21 mihad
        Report Signal (signals that error has occured) respectively. With bit 0 we enable Error Reporting
527
        mechanism.
528 2 mihad
-----------------------------------------------------------------------------------------------------------*/
529 21 mihad
// WB_IMAGE0 is always assigned to config. space or is not used
530
                        wire    [2 : 0]          wb_img_ctrl0_bit2_0 = 3'b000 ; // NO addr.transl., pre-fetch and read-line
531 2 mihad
                        wire    [31 : 12]       wb_ba0_bit31_12 = `WB_CONFIGURATION_BASE ;
532 21 mihad
                        wire                            wb_ba0_bit0 = 0 ; // config. space is MEMORY space
533
                        wire    [31 : 12]       wb_am0 = `WB_AM0 ; // 4KBytes of configuration space is minimum
534
                        wire    [31 : 12]       wb_ta0 = 20'h0000_0 ; // NO address translation needed
535
// WB_IMAGE1 is included by default meanwhile others are optional !
536 2 mihad
                        reg             [2 : 0]          wb_img_ctrl1_bit2_0 ;
537
                        reg             [31 : 12]       wb_ba1_bit31_12 ;
538
                        reg                                     wb_ba1_bit0 ;
539
                        reg             [31 : 12]       wb_am1 ;
540
                        reg             [31 : 12]       wb_ta1 ;
541 21 mihad
`ifdef          WB_IMAGE2
542 2 mihad
                        reg             [2 : 0]          wb_img_ctrl2_bit2_0 ;
543
                        reg             [31 : 12]       wb_ba2_bit31_12 ;
544
                        reg                                     wb_ba2_bit0 ;
545
                        reg             [31 : 12]       wb_am2 ;
546
                        reg             [31 : 12]       wb_ta2 ;
547 21 mihad
`else
548
            wire        [2 : 0]          wb_img_ctrl2_bit2_0 = 3'b000 ;
549
                        wire    [31 : 12]       wb_ba2_bit31_12 = 20'h0000_0 ;
550
            wire                                wb_ba2_bit0 = 1'b0 ;
551
            wire        [31 : 12]       wb_am2 = 20'h0000_0 ;
552
            wire        [31 : 12]       wb_ta2 = 20'h0000_0 ;
553
`endif
554
`ifdef          WB_IMAGE3
555 2 mihad
                        reg             [2 : 0]          wb_img_ctrl3_bit2_0 ;
556
                        reg             [31 : 12]       wb_ba3_bit31_12 ;
557
                        reg                                     wb_ba3_bit0 ;
558
                        reg             [31 : 12]       wb_am3 ;
559
                        reg             [31 : 12]       wb_ta3 ;
560 21 mihad
`else
561
            wire        [2 : 0]          wb_img_ctrl3_bit2_0 = 3'b000 ;
562
                        wire    [31 : 12]       wb_ba3_bit31_12 = 20'h0000_0 ;
563
            wire                                wb_ba3_bit0 = 1'b0 ;
564
            wire        [31 : 12]       wb_am3 = 20'h0000_0 ;
565
            wire        [31 : 12]       wb_ta3 = 20'h0000_0 ;
566
`endif
567
`ifdef          WB_IMAGE4
568 2 mihad
                        reg             [2 : 0]          wb_img_ctrl4_bit2_0 ;
569
                        reg             [31 : 12]       wb_ba4_bit31_12 ;
570
                        reg                                     wb_ba4_bit0 ;
571
                        reg             [31 : 12]       wb_am4 ;
572
                        reg             [31 : 12]       wb_ta4 ;
573 21 mihad
`else
574
            wire        [2 : 0]          wb_img_ctrl4_bit2_0 = 3'b000 ;
575
                        wire    [31 : 12]       wb_ba4_bit31_12 = 20'h0000_0 ;
576
            wire                                wb_ba4_bit0 = 1'b0 ;
577
            wire        [31 : 12]       wb_am4 = 20'h0000_0 ;
578
            wire        [31 : 12]       wb_ta4 = 20'h0000_0 ;
579
`endif
580
`ifdef          WB_IMAGE5
581 2 mihad
                        reg             [2 : 0]          wb_img_ctrl5_bit2_0 ;
582
                        reg             [31 : 12]       wb_ba5_bit31_12 ;
583
                        reg                                     wb_ba5_bit0 ;
584
                        reg             [31 : 12]       wb_am5 ;
585
                        reg             [31 : 12]       wb_ta5 ;
586 21 mihad
`else
587
            wire        [2 : 0]          wb_img_ctrl5_bit2_0 = 3'b000 ;
588
                        wire    [31 : 12]       wb_ba5_bit31_12 = 20'h0000_0 ;
589
            wire                                wb_ba5_bit0 = 1'b0 ;
590
            wire        [31 : 12]       wb_am5 = 20'h0000_0 ;
591
            wire        [31 : 12]       wb_ta5 = 20'h0000_0 ;
592
`endif
593 2 mihad
                        reg             [31 : 24]       wb_err_cs_bit31_24 ;
594 21 mihad
/*                      reg                                     wb_err_cs_bit10 ;*/
595
                        reg                                     wb_err_cs_bit9 ;
596
                        reg                                     wb_err_cs_bit8 ;
597 2 mihad
                        reg                                     wb_err_cs_bit0 ;
598
                        reg             [31 : 0] wb_err_addr ;
599
                        reg             [31 : 0] wb_err_data ;
600 21 mihad
 
601
 
602 2 mihad
/*###########################################################################################################
603
-------------------------------------------------------------------------------------------------------------
604
Configuration Cycle address register
605 21 mihad
        There are also some registers with NOT all bits implemented and therefor uses _bitX or _bitX2_X1 to
606
        sign which bit or range of bits are implemented.
607 2 mihad
-------------------------------------------------------------------------------------------------------------
608
###########################################################################################################*/
609 21 mihad
 
610 2 mihad
/*-----------------------------------------------------------------------------------------------------------
611 21 mihad
[860h-868h]
612
        PCI bridge must ignore Type 1 configuration cycles (Master Abort) since they are used for PCI to PCI
613
        bridges. This is single function device, that means responding on configuration cycles to all functions
614
        (or responding only to function 0). Configuration address register for generating configuration cycles
615 2 mihad
        is prepared for all options (it includes Bus Number, Device, Function, Offset and Type).
616
        Interrupt acknowledge register stores interrupt vector data returned during Interrupt Acknowledge cycle.
617
-----------------------------------------------------------------------------------------------------------*/
618 21 mihad
`ifdef          HOST
619 2 mihad
                        reg             [23 : 2]        cnf_addr_bit23_2 ;
620
                        reg                                     cnf_addr_bit0 ;
621 21 mihad
`else // GUEST
622
                        wire    [23 : 2]        cnf_addr_bit23_2        = 22'h0 ;
623
                        wire                            cnf_addr_bit0           = 1'b0 ;
624
`endif
625 2 mihad
                        // reg  [31 : 0]        cnf_data ;              IMPLEMENTED elsewhere !!!!!
626
                        // reg  [31 : 0]        int_ack ;               IMPLEMENTED elsewhere !!!!!
627 21 mihad
 
628
 
629 2 mihad
/*###########################################################################################################
630
-------------------------------------------------------------------------------------------------------------
631 21 mihad
General Interrupt registers
632
        There are also some registers with NOT all bits implemented and therefor uses _bitX or _bitX2_X1 to
633
        sign which bit or range of bits are implemented.
634 2 mihad
-------------------------------------------------------------------------------------------------------------
635
###########################################################################################################*/
636 21 mihad
 
637 2 mihad
/*-----------------------------------------------------------------------------------------------------------
638 21 mihad
[FF8h-FFCh]
639 2 mihad
        Bit 31 in the Interrupt Control register is set by software and used to generate SOFT RESET. Other 4
640
        bits are used to enable interrupt generations.
641 21 mihad
        5 LSbits in the Interrupt Status register are indicating System Error Int, Parity Error Int, PCI & WB
642
        Error Int and Inerrupt respecively. System and Parity errors are implented only in HOST bridge
643
        implementations!
644 2 mihad
-----------------------------------------------------------------------------------------------------------*/
645
                        reg                                     icr_bit31 ;
646 21 mihad
`ifdef          HOST
647
                        reg             [4 : 3]         icr_bit4_3 ;
648
                        reg             [4 : 3]         isr_bit4_3 ;
649
                        reg             [2 : 0]          icr_bit2_0 ;
650
                        reg             [2 : 0]          isr_bit2_0 ;
651
`else // GUEST
652
                        wire    [4 : 3]         icr_bit4_3 = 2'h0 ;
653
                        wire    [4 : 3]         isr_bit4_3 = 2'h0 ;
654
                        reg             [2 : 0]          icr_bit2_0 ;
655
                        reg             [2 : 0]          isr_bit2_0 ;
656
`endif
657
 
658
 
659 2 mihad
/*###########################################################################################################
660
-------------------------------------------------------------------------------------------------------------
661
 
662
 
663
-----------------------------------------------------------------------------------------------------------*/
664 21 mihad
 
665
`ifdef NO_CNF_IMAGE // if IMAGE0 is assigned as general image space
666
 
667
                assign  r_conf_data_out = 32'h0000_0000 ;
668
 
669
`else
670
 
671
    always@(r_conf_address_in or
672
                status_bit15_11 or status_bit8 or command_bit8 or command_bit6 or command_bit2_0 or
673
                latency_timer or cache_line_size_reg or
674
                pci_ba0_bit31_12 or
675
                pci_img_ctrl0_bit2_1 or pci_am0 or pci_ta0 or pci_ba0_bit0 or
676
                pci_img_ctrl1_bit2_1 or pci_am1 or pci_ta1 or pci_ba1_bit31_12 or pci_ba1_bit0 or
677
                pci_img_ctrl2_bit2_1 or pci_am2 or pci_ta2 or pci_ba2_bit31_12 or pci_ba2_bit0 or
678
                pci_img_ctrl3_bit2_1 or pci_am3 or pci_ta3 or pci_ba3_bit31_12 or pci_ba3_bit0 or
679
                pci_img_ctrl4_bit2_1 or pci_am4 or pci_ta4 or pci_ba4_bit31_12 or pci_ba4_bit0 or
680
                pci_img_ctrl5_bit2_1 or pci_am5 or pci_ta5 or pci_ba5_bit31_12 or pci_ba5_bit0 or
681
                interrupt_line or
682
                pci_err_cs_bit31_24 or pci_err_cs_bit10 or pci_err_cs_bit9 or pci_err_cs_bit8 or pci_err_cs_bit0 or
683
                pci_err_addr or pci_err_data or
684
                wb_ba0_bit31_12 or wb_ba0_bit0 or
685
                wb_img_ctrl1_bit2_0 or wb_ba1_bit31_12 or wb_ba1_bit0 or wb_am1 or wb_ta1 or
686
                wb_img_ctrl2_bit2_0 or wb_ba2_bit31_12 or wb_ba2_bit0 or wb_am2 or wb_ta2 or
687
                wb_img_ctrl3_bit2_0 or wb_ba3_bit31_12 or wb_ba3_bit0 or wb_am3 or wb_ta3 or
688
                wb_img_ctrl4_bit2_0 or wb_ba4_bit31_12 or wb_ba4_bit0 or wb_am4 or wb_ta4 or
689
                wb_img_ctrl5_bit2_0 or wb_ba5_bit31_12 or wb_ba5_bit0 or wb_am5 or wb_ta5 or
690
                wb_err_cs_bit31_24 or /*wb_err_cs_bit10 or*/ wb_err_cs_bit9 or wb_err_cs_bit8 or wb_err_cs_bit0 or
691
                wb_err_addr or wb_err_data or
692
                cnf_addr_bit23_2 or cnf_addr_bit0 or icr_bit31 or icr_bit4_3 or icr_bit2_0 or isr_bit4_3 or isr_bit2_0
693
                )
694
    begin
695
        case (r_conf_address_in[8])
696
        1'b0 :
697
        begin
698
          case ({r_conf_address_in[7], r_conf_address_in[6]})
699
          2'b00 :
700
          begin
701
                // PCI header - configuration space
702
                case (r_conf_address_in[5:2])
703
                4'h0: r_conf_data_out = { r_device_id, r_vendor_id } ;
704
                4'h1: r_conf_data_out = { status_bit15_11, r_status_bit10_9, status_bit8, r_status_bit7, 1'h0, r_status_bit5,
705
                                                                         5'h00, 7'h00, command_bit8, 1'h0, command_bit6, 3'h0, command_bit2_0 } ;
706
                4'h2: r_conf_data_out = { r_class_code, r_revision_id } ;
707
                4'h3: r_conf_data_out = { 8'h00, r_header_type, latency_timer, cache_line_size_reg } ;
708
                4'h4:
709
                begin
710
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
711
                                                                                                                                 pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
712
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
713 45 mihad
                        r_conf_data_out[0] = pci_ba0_bit0 & pci_am0[31];
714 21 mihad
                end
715
                4'h5:
716
                begin
717
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
718
                                                                                                                                 pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
719
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
720 45 mihad
                        r_conf_data_out[0] = pci_ba1_bit0 & pci_am1[31];
721 21 mihad
                end
722
                4'h6:
723
                begin
724
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
725
                                                                                                                                 pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
726
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
727 45 mihad
                        r_conf_data_out[0] = pci_ba2_bit0 & pci_am2[31];
728 21 mihad
                end
729
                4'h7:
730
                begin
731
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
732
                                                                                                                                 pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
733
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
734 45 mihad
                        r_conf_data_out[0] = pci_ba3_bit0 & pci_am3[31];
735 21 mihad
                end
736
                4'h8:
737
                begin
738
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
739
                                                                                                                                 pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
740
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
741 45 mihad
                        r_conf_data_out[0] = pci_ba4_bit0 & pci_am4[31];
742 21 mihad
                end
743
                4'h9:
744
                begin
745
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
746
                                                                                                                                 pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
747
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
748 45 mihad
                        r_conf_data_out[0] = pci_ba5_bit0 & pci_am5[31];
749 21 mihad
                end
750
                4'hf: r_conf_data_out = { r_max_lat, r_min_gnt, r_interrupt_pin, interrupt_line } ;
751
                default : r_conf_data_out = 32'h0000_0000 ;
752
                endcase
753
          end
754
          default :
755
            r_conf_data_out = 32'h0000_0000 ;
756
          endcase
757
        end
758
        default :
759
        begin
760
                // PCI target - configuration space
761
                case (r_conf_address_in[7:2])
762
                `P_IMG_CTRL0_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl0_bit2_1, 1'h0 } ;
763
            `P_BA0_ADDR          :
764
                begin
765
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
766
                                                                                                                                 pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
767
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
768 45 mihad
                        r_conf_data_out[0] = pci_ba0_bit0 & pci_am0[31];
769 21 mihad
                end
770
            `P_AM0_ADDR          :
771
                begin
772
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
773
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
774
                end
775
            `P_TA0_ADDR          :
776
                begin
777
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
778
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
779
                end
780 2 mihad
            `P_IMG_CTRL1_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl1_bit2_1, 1'h0 } ;
781 21 mihad
            `P_BA1_ADDR          :
782
                begin
783
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
784
                                                                                                                                 pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
785
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
786 45 mihad
                        r_conf_data_out[0] = pci_ba1_bit0 & pci_am1[31];
787 21 mihad
                end
788
            `P_AM1_ADDR          :
789
                begin
790
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
791
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
792
                end
793
            `P_TA1_ADDR          :
794
                begin
795
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
796
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
797
                end
798 2 mihad
            `P_IMG_CTRL2_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl2_bit2_1, 1'h0 } ;
799 21 mihad
            `P_BA2_ADDR          :
800
                begin
801
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
802
                                                                                                                                 pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
803
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
804 45 mihad
                        r_conf_data_out[0] = pci_ba2_bit0 & pci_am2[31];
805 21 mihad
                end
806
            `P_AM2_ADDR          :
807
                begin
808
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
809
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
810
                end
811
            `P_TA2_ADDR          :
812
                begin
813
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
814
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
815
                end
816 2 mihad
            `P_IMG_CTRL3_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl3_bit2_1, 1'h0 } ;
817 21 mihad
            `P_BA3_ADDR          :
818
                begin
819
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
820
                                                                                                                                 pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
821
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
822 45 mihad
                        r_conf_data_out[0] = pci_ba3_bit0 & pci_am3[31];
823 21 mihad
                end
824
            `P_AM3_ADDR          :
825
                begin
826
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
827
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
828
                end
829
            `P_TA3_ADDR          :
830
                begin
831
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
832
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
833
                end
834 2 mihad
            `P_IMG_CTRL4_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl4_bit2_1, 1'h0 } ;
835 21 mihad
            `P_BA4_ADDR          :
836
                begin
837
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
838
                                                                                                                                 pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
839
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
840 45 mihad
                        r_conf_data_out[0] = pci_ba4_bit0 & pci_am4[31];
841 21 mihad
                end
842
            `P_AM4_ADDR          :
843
                begin
844
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
845
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
846
                end
847
            `P_TA4_ADDR          :
848
                begin
849
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
850
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
851
                end
852 2 mihad
            `P_IMG_CTRL5_ADDR: r_conf_data_out = { 29'h00000000, pci_img_ctrl5_bit2_1, 1'h0 } ;
853 21 mihad
            `P_BA5_ADDR          :
854
                begin
855
                        r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
856
                                                                                                                                 pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
857
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
858 45 mihad
                        r_conf_data_out[0] = pci_ba5_bit0 & pci_am5[31];
859 21 mihad
                end
860
            `P_AM5_ADDR          :
861
                begin
862
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
863
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
864
                end
865
            `P_TA5_ADDR          :
866
                begin
867
                r_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
868
                        r_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
869
                end
870
            `P_ERR_CS_ADDR       : r_conf_data_out = { pci_err_cs_bit31_24, 13'h0000, pci_err_cs_bit10, pci_err_cs_bit9,
871 2 mihad
                                                                                   pci_err_cs_bit8, 7'h00, pci_err_cs_bit0 } ;
872
            `P_ERR_ADDR_ADDR : r_conf_data_out = pci_err_addr ;
873
            `P_ERR_DATA_ADDR : r_conf_data_out = pci_err_data ;
874 21 mihad
                // WB slave - configuration space
875
                `WB_CONF_SPC_BAR_ADDR: r_conf_data_out = { wb_ba0_bit31_12, 11'h000, wb_ba0_bit0 } ;
876
                `W_IMG_CTRL1_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl1_bit2_0 } ;
877
                `W_BA1_ADDR              :
878
                begin
879
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba1_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
880
                                                                                                                                wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
881
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
882
                        r_conf_data_out[0] = wb_ba1_bit0 ;
883
                end
884
                `W_AM1_ADDR              :
885
                begin
886
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
887
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
888
                end
889
                `W_TA1_ADDR              :
890
                begin
891
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
892
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
893
                end
894
                `W_IMG_CTRL2_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl2_bit2_0 } ;
895
                `W_BA2_ADDR              :
896
                begin
897
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba2_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
898
                                                                                                                                wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
899
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
900
                        r_conf_data_out[0] = wb_ba2_bit0 ;
901
                end
902
                `W_AM2_ADDR              :
903
                begin
904
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
905
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
906
                end
907
                `W_TA2_ADDR              :
908
                begin
909
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
910
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
911
                end
912
                `W_IMG_CTRL3_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl3_bit2_0 } ;
913
                `W_BA3_ADDR              :
914
                begin
915
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba3_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
916
                                                                                                                                wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
917
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
918
                        r_conf_data_out[0] = wb_ba3_bit0 ;
919
                end
920
                `W_AM3_ADDR              :
921
                begin
922
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
923
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
924
                end
925
                `W_TA3_ADDR              :
926
                begin
927
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
928
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
929
                end
930
                `W_IMG_CTRL4_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl4_bit2_0 } ;
931
                `W_BA4_ADDR              :
932
                begin
933
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba4_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
934
                                                                                                                                wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
935
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
936
                        r_conf_data_out[0] = wb_ba4_bit0 ;
937
                end
938
                `W_AM4_ADDR              :
939
                begin
940
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
941
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
942
                end
943
                `W_TA4_ADDR              :
944
                begin
945
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
946
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
947
                end
948
                `W_IMG_CTRL5_ADDR: r_conf_data_out = { 29'h00000000, wb_img_ctrl5_bit2_0 } ;
949
                `W_BA5_ADDR              :
950
                begin
951
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba5_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
952
                                                                                                                                wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
953
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
954
                        r_conf_data_out[0] = wb_ba5_bit0 ;
955
                end
956
                `W_AM5_ADDR              :
957
                begin
958
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
959
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
960
                end
961
                `W_TA5_ADDR              :
962
                begin
963
                        r_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
964
                        r_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
965
                end
966
                `W_ERR_CS_ADDR   : r_conf_data_out = { wb_err_cs_bit31_24, /*13*/14'h0000, /*wb_err_cs_bit10,*/
967
                                                                                   wb_err_cs_bit9, wb_err_cs_bit8, 7'h00, wb_err_cs_bit0 } ;
968
                `W_ERR_ADDR_ADDR : r_conf_data_out = wb_err_addr ;
969
                `W_ERR_DATA_ADDR : r_conf_data_out = wb_err_data ;
970
 
971
                `CNF_ADDR_ADDR   : r_conf_data_out = { 8'h00, cnf_addr_bit23_2, 1'h0, cnf_addr_bit0 } ;
972
                // `CNF_DATA_ADDR: implemented elsewhere !!!
973
                // `INT_ACK_ADDR : implemented elsewhere !!!
974
            `ICR_ADDR            : r_conf_data_out = { icr_bit31, 26'h0000_000, icr_bit4_3, icr_bit2_0 } ;
975
            `ISR_ADDR            : r_conf_data_out = { 27'h0000_000, isr_bit4_3, isr_bit2_0 } ;
976
 
977
                default : r_conf_data_out = 32'h0000_0000 ;
978
                endcase
979
        end
980
        endcase
981
    end
982
 
983
`endif
984
 
985
always@(w_conf_address_in or
986
                status_bit15_11 or status_bit8 or command_bit8 or command_bit6 or command_bit2_0 or
987
                latency_timer or cache_line_size_reg or
988
                pci_ba0_bit31_12 or
989
                pci_img_ctrl0_bit2_1 or pci_am0 or pci_ta0 or pci_ba0_bit0 or
990
                pci_img_ctrl1_bit2_1 or pci_am1 or pci_ta1 or pci_ba1_bit31_12 or pci_ba1_bit0 or
991
                pci_img_ctrl2_bit2_1 or pci_am2 or pci_ta2 or pci_ba2_bit31_12 or pci_ba2_bit0 or
992
                pci_img_ctrl3_bit2_1 or pci_am3 or pci_ta3 or pci_ba3_bit31_12 or pci_ba3_bit0 or
993
                pci_img_ctrl4_bit2_1 or pci_am4 or pci_ta4 or pci_ba4_bit31_12 or pci_ba4_bit0 or
994
                pci_img_ctrl5_bit2_1 or pci_am5 or pci_ta5 or pci_ba5_bit31_12 or pci_ba5_bit0 or
995
                interrupt_line or
996
                pci_err_cs_bit31_24 or pci_err_cs_bit10 or pci_err_cs_bit9 or pci_err_cs_bit8 or pci_err_cs_bit0 or
997
                pci_err_addr or pci_err_data or
998
                wb_ba0_bit31_12 or wb_ba0_bit0 or
999
                wb_img_ctrl1_bit2_0 or wb_ba1_bit31_12 or wb_ba1_bit0 or wb_am1 or wb_ta1 or
1000
                wb_img_ctrl2_bit2_0 or wb_ba2_bit31_12 or wb_ba2_bit0 or wb_am2 or wb_ta2 or
1001
                wb_img_ctrl3_bit2_0 or wb_ba3_bit31_12 or wb_ba3_bit0 or wb_am3 or wb_ta3 or
1002
                wb_img_ctrl4_bit2_0 or wb_ba4_bit31_12 or wb_ba4_bit0 or wb_am4 or wb_ta4 or
1003
                wb_img_ctrl5_bit2_0 or wb_ba5_bit31_12 or wb_ba5_bit0 or wb_am5 or wb_ta5 or
1004
                wb_err_cs_bit31_24 or /*wb_err_cs_bit10 or*/ wb_err_cs_bit9 or wb_err_cs_bit8 or wb_err_cs_bit0 or
1005
                wb_err_addr or wb_err_data or
1006
                cnf_addr_bit23_2 or cnf_addr_bit0 or icr_bit31 or icr_bit4_3 or icr_bit2_0 or isr_bit4_3 or isr_bit2_0
1007
                )
1008
begin
1009
        case (w_conf_address_in[8])
1010
        1'b0 :
1011
        begin
1012
          case ({w_conf_address_in[7], w_conf_address_in[6]})
1013
          2'b00 :
1014
          begin
1015
                // PCI header - configuration space
1016
                case (w_conf_address_in[5:2])
1017
                4'h0:
1018
                begin
1019
                        w_conf_data_out = { r_device_id, r_vendor_id } ;
1020
                        w_reg_select_dec = 56'h00_0000_0000_0000 ; // Read-Only register
1021 2 mihad
                end
1022 21 mihad
                4'h1: // w_reg_select_dec bit 0
1023
                begin
1024
                        w_conf_data_out = { status_bit15_11, r_status_bit10_9, status_bit8, r_status_bit7, 1'h0, r_status_bit5,
1025
                                                                 5'h00, 7'h00, command_bit8, 1'h0, command_bit6, 3'h0, command_bit2_0 } ;
1026
                        w_reg_select_dec = 56'h00_0000_0000_0001 ;
1027
                end
1028
                4'h2:
1029
                begin
1030
                        w_conf_data_out = { r_class_code, r_revision_id } ;
1031
                        w_reg_select_dec = 56'h00_0000_0000_0000 ; // Read-Only register
1032
                end
1033
                4'h3: // w_reg_select_dec bit 1
1034
                begin
1035
                        w_conf_data_out = { 8'h00, r_header_type, latency_timer, cache_line_size_reg } ;
1036
                        w_reg_select_dec = 56'h00_0000_0000_0002 ;
1037
                end
1038
                4'h4: // w_reg_select_dec bit 4
1039
                begin
1040
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1041
                                                                                                                         pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1042
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1043 45 mihad
                w_conf_data_out[0] = pci_ba0_bit0 & pci_am0[31];
1044 21 mihad
                        w_reg_select_dec = 56'h00_0000_0000_0010 ; // The same for another address
1045
                end
1046
                4'h5: // w_reg_select_dec bit 8
1047
                begin
1048
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1049
                                                                                                                         pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1050
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1051 45 mihad
                w_conf_data_out[0] = pci_ba1_bit0 & pci_am1[31];
1052 21 mihad
                        w_reg_select_dec = 56'h00_0000_0000_0100 ; // The same for another address
1053
                end
1054
                4'h6: // w_reg_select_dec bit 12
1055
                begin
1056
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1057
                                                                                                                         pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1058
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1059 45 mihad
                w_conf_data_out[0] = pci_ba2_bit0 & pci_am2[31];
1060 21 mihad
                        w_reg_select_dec = 56'h00_0000_0000_1000 ; // The same for another address
1061
                end
1062
                4'h7: // w_reg_select_dec bit 16
1063
                begin
1064
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1065
                                                                                                                         pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1066
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1067 45 mihad
                w_conf_data_out[0] = pci_ba3_bit0 & pci_am3[31];
1068 21 mihad
                        w_reg_select_dec = 56'h00_0000_0001_0000 ; // The same for another address
1069
                end
1070
                4'h8: // w_reg_select_dec bit 20
1071
                begin
1072
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1073
                                                                                                                         pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1074
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1075 45 mihad
                w_conf_data_out[0] = pci_ba4_bit0 & pci_am4[31];
1076 21 mihad
                        w_reg_select_dec = 56'h00_0000_0010_0000 ; // The same for another address
1077
                end
1078
                4'h9: // w_reg_select_dec bit 24
1079
                begin
1080
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1081
                                                                                                                         pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1082
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1083 45 mihad
                w_conf_data_out[0] = pci_ba5_bit0 & pci_am5[31];
1084 21 mihad
                        w_reg_select_dec = 56'h00_0000_0100_0000 ; // The same for another address
1085
                end
1086
                4'hf: // w_reg_select_dec bit 2
1087
                begin
1088
                        w_conf_data_out = { r_max_lat, r_min_gnt, r_interrupt_pin, interrupt_line } ;
1089
                        w_reg_select_dec = 56'h00_0000_0000_0004 ;
1090
                end
1091
                default :
1092
                begin
1093
                        w_conf_data_out = 32'h0000_0000 ;
1094
                        w_reg_select_dec = 56'h00_0000_0000_0000 ;
1095
                end
1096 2 mihad
                endcase
1097 21 mihad
          end
1098
          default :
1099
          begin
1100
            w_conf_data_out = 32'h0000_0000 ;
1101
                w_reg_select_dec = 56'h00_0000_0000_0000 ;
1102
          end
1103
          endcase
1104 2 mihad
        end
1105 21 mihad
        default :
1106 2 mihad
        begin
1107 21 mihad
                // PCI target - configuration space
1108
                case (w_conf_address_in[7:2])
1109
                `P_IMG_CTRL0_ADDR:  // w_reg_select_dec bit 3
1110 2 mihad
                begin
1111 21 mihad
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl0_bit2_1, 1'h0 } ;
1112
                        w_reg_select_dec = 56'h00_0000_0000_0008 ;
1113 2 mihad
                end
1114 21 mihad
        `P_BA0_ADDR:   // w_reg_select_dec bit 4
1115 2 mihad
                begin
1116 21 mihad
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1117
                                                                                                                         pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1118
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1119 45 mihad
                w_conf_data_out[0] = pci_ba0_bit0 & pci_am0[31];
1120 21 mihad
                        w_reg_select_dec = 56'h00_0000_0000_0010 ; // The same for another address
1121 2 mihad
                end
1122 21 mihad
        `P_AM0_ADDR:   // w_reg_select_dec bit 5
1123
                begin
1124
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1125
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1126
                        w_reg_select_dec = 56'h00_0000_0000_0020 ;
1127
                end
1128
        `P_TA0_ADDR:   // w_reg_select_dec bit 6
1129
                begin
1130
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1131
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1132
                        w_reg_select_dec = 56'h00_0000_0000_0040 ;
1133
                end
1134
        `P_IMG_CTRL1_ADDR:   // w_reg_select_dec bit 7
1135
                begin
1136
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl1_bit2_1, 1'h0 } ;
1137
                        w_reg_select_dec = 56'h00_0000_0000_0080 ;
1138
                end
1139
        `P_BA1_ADDR:   // w_reg_select_dec bit 8
1140
                begin
1141
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1142
                                                                                                                         pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1143
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1144 45 mihad
                w_conf_data_out[0] = pci_ba1_bit0 & pci_am1[31];
1145 21 mihad
                        w_reg_select_dec = 56'h00_0000_0000_0100 ; // The same for another address
1146
                end
1147
        `P_AM1_ADDR:   // w_reg_select_dec bit 9
1148
                begin
1149
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1150
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1151
                        w_reg_select_dec = 56'h00_0000_0000_0200 ;
1152
                end
1153
        `P_TA1_ADDR:   // w_reg_select_dec bit 10
1154
                begin
1155
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1156
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1157
                        w_reg_select_dec = 56'h00_0000_0000_0400 ;
1158
                end
1159
        `P_IMG_CTRL2_ADDR:   // w_reg_select_dec bit 11
1160
                begin
1161
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl2_bit2_1, 1'h0 } ;
1162
                        w_reg_select_dec = 56'h00_0000_0000_0800 ;
1163
                end
1164
        `P_BA2_ADDR:   // w_reg_select_dec bit 12
1165
                begin
1166
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1167
                                                                                                                         pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1168
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1169 45 mihad
                w_conf_data_out[0] = pci_ba2_bit0 & pci_am2[31];
1170 21 mihad
                        w_reg_select_dec = 56'h00_0000_0000_1000 ; // The same for another address
1171
                end
1172
        `P_AM2_ADDR:   // w_reg_select_dec bit 13
1173
                begin
1174
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1175
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1176
                        w_reg_select_dec = 56'h00_0000_0000_2000 ;
1177
                end
1178
        `P_TA2_ADDR:   // w_reg_select_dec bit 14
1179
                begin
1180
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1181
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1182
                        w_reg_select_dec = 56'h00_0000_0000_4000 ;
1183
                end
1184
        `P_IMG_CTRL3_ADDR:   // w_reg_select_dec bit 15
1185
                begin
1186
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl3_bit2_1, 1'h0 } ;
1187
                        w_reg_select_dec = 56'h00_0000_0000_8000 ;
1188
                end
1189
        `P_BA3_ADDR:   // w_reg_select_dec bit 16
1190
                begin
1191
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1192
                                                                                                                         pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1193
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1194 45 mihad
                w_conf_data_out[0] = pci_ba3_bit0 & pci_am3[31];
1195 21 mihad
                        w_reg_select_dec = 56'h00_0000_0001_0000 ; // The same for another address
1196
                end
1197
        `P_AM3_ADDR:   // w_reg_select_dec bit 17
1198
                begin
1199
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1200
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1201
                        w_reg_select_dec = 56'h00_0000_0002_0000 ;
1202
                end
1203
        `P_TA3_ADDR:   // w_reg_select_dec bit 18
1204
                begin
1205
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1206
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1207
                        w_reg_select_dec = 56'h00_0000_0004_0000 ;
1208
                end
1209
        `P_IMG_CTRL4_ADDR:   // w_reg_select_dec bit 19
1210
                begin
1211
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl4_bit2_1, 1'h0 } ;
1212
                        w_reg_select_dec = 56'h00_0000_0008_0000 ;
1213
                end
1214
        `P_BA4_ADDR:   // w_reg_select_dec bit 20
1215
                begin
1216
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1217
                                                                                                                         pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1218
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1219 45 mihad
                w_conf_data_out[0] = pci_ba4_bit0 & pci_am4[31];
1220 21 mihad
                        w_reg_select_dec = 56'h00_0000_0010_0000 ; // The same for another address
1221
                end
1222
        `P_AM4_ADDR:   // w_reg_select_dec bit 21
1223
                begin
1224
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1225
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1226
                        w_reg_select_dec = 56'h00_0000_0020_0000 ;
1227
                end
1228
        `P_TA4_ADDR:   // w_reg_select_dec bit 22
1229
                begin
1230
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1231
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1232
                        w_reg_select_dec = 56'h00_0000_0040_0000 ;
1233
                end
1234
        `P_IMG_CTRL5_ADDR:   // w_reg_select_dec bit 23
1235
                begin
1236
                        w_conf_data_out = { 29'h00000000, pci_img_ctrl5_bit2_1, 1'h0 } ;
1237
                        w_reg_select_dec = 56'h00_0000_0080_0000 ;
1238
                end
1239
        `P_BA5_ADDR:   // w_reg_select_dec bit 24
1240
                begin
1241
                w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] &
1242
                                                                                                                         pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1243
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):1] = 0 ;
1244 45 mihad
                w_conf_data_out[0] = pci_ba5_bit0 & pci_am5[31];
1245 21 mihad
                        w_reg_select_dec = 56'h00_0000_0100_0000 ; // The same for another address
1246
                end
1247
        `P_AM5_ADDR:   // w_reg_select_dec bit 25
1248
                begin
1249
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1250
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1251
                        w_reg_select_dec = 56'h00_0000_0200_0000 ;
1252
                end
1253
        `P_TA5_ADDR:   // w_reg_select_dec bit 26
1254
                begin
1255
            w_conf_data_out[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] = pci_ta5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1256
                w_conf_data_out[(31-`PCI_NUM_OF_DEC_ADDR_LINES):0] = 0 ;
1257
                        w_reg_select_dec = 56'h00_0000_0400_0000 ;
1258
                end
1259
        `P_ERR_CS_ADDR:   // w_reg_select_dec bit 27
1260
                begin
1261
                        w_conf_data_out = { pci_err_cs_bit31_24, 13'h0000, pci_err_cs_bit10, pci_err_cs_bit9,
1262
                                                                                   pci_err_cs_bit8, 7'h00, pci_err_cs_bit0 } ;
1263
                        w_reg_select_dec = 56'h00_0000_0800_0000 ;
1264
                end
1265
        `P_ERR_ADDR_ADDR:   // w_reg_select_dec bit 28
1266
                begin
1267
                        w_conf_data_out = pci_err_addr ;
1268
                        w_reg_select_dec = 56'h00_0000_0000_0000 ; // = 56'h00_0000_1000_0000 ;
1269
                end
1270
        `P_ERR_DATA_ADDR:   // w_reg_select_dec bit 29
1271
                begin
1272
                        w_conf_data_out = pci_err_data ;
1273
                        w_reg_select_dec = 56'h00_0000_0000_0000 ; // = 56'h00_0000_2000_0000 ;
1274
                end
1275
                // WB slave - configuration space
1276
                `WB_CONF_SPC_BAR_ADDR:
1277
                begin
1278
                        w_conf_data_out = { wb_ba0_bit31_12, 11'h000, wb_ba0_bit0 } ;
1279
                        w_reg_select_dec = 56'h00_0000_0000_0000 ; // Read-Only register
1280
                end
1281
                `W_IMG_CTRL1_ADDR:   // w_reg_select_dec bit 30
1282
                begin
1283
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl1_bit2_0 } ;
1284
                        w_reg_select_dec = 56'h00_0000_4000_0000 ;
1285
                end
1286
                `W_BA1_ADDR:   // w_reg_select_dec bit 31
1287
                begin
1288
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba1_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1289
                                                                                                                        wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1290
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1291
                w_conf_data_out[0] = wb_ba1_bit0 ;
1292
                        w_reg_select_dec = 56'h00_0000_8000_0000 ;
1293
                end
1294
                `W_AM1_ADDR:   // w_reg_select_dec bit 32
1295
                begin
1296
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1297
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1298
                        w_reg_select_dec = 56'h00_0001_0000_0000 ;
1299
                end
1300
                `W_TA1_ADDR:   // w_reg_select_dec bit 33
1301
                begin
1302
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1303
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1304
                        w_reg_select_dec = 56'h00_0002_0000_0000 ;
1305
                end
1306
                `W_IMG_CTRL2_ADDR:   // w_reg_select_dec bit 34
1307
                begin
1308
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl2_bit2_0 } ;
1309
                        w_reg_select_dec = 56'h00_0004_0000_0000 ;
1310
                end
1311
                `W_BA2_ADDR:   // w_reg_select_dec bit 35
1312
                begin
1313
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba2_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1314
                                                                                                                        wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1315
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1316
                w_conf_data_out[0] = wb_ba2_bit0 ;
1317
                        w_reg_select_dec = 56'h00_0008_0000_0000 ;
1318
                end
1319
                `W_AM2_ADDR:   // w_reg_select_dec bit 36
1320
                begin
1321
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1322
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1323
                        w_reg_select_dec = 56'h00_0010_0000_0000 ;
1324
                end
1325
                `W_TA2_ADDR:   // w_reg_select_dec bit 37
1326
                begin
1327
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1328
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1329
                        w_reg_select_dec = 56'h00_0020_0000_0000 ;
1330
                end
1331
                `W_IMG_CTRL3_ADDR:   // w_reg_select_dec bit 38
1332
                begin
1333
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl3_bit2_0 } ;
1334
                        w_reg_select_dec = 56'h00_0040_0000_0000 ;
1335
                end
1336
                `W_BA3_ADDR:   // w_reg_select_dec bit 39
1337
                begin
1338
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba3_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1339
                                                                                                                        wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1340
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1341
                w_conf_data_out[0] = wb_ba3_bit0 ;
1342
                        w_reg_select_dec = 56'h00_0080_0000_0000 ;
1343
                end
1344
                `W_AM3_ADDR:   // w_reg_select_dec bit 40
1345
                begin
1346
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1347
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1348
                        w_reg_select_dec = 56'h00_0100_0000_0000 ;
1349
                end
1350
                `W_TA3_ADDR:   // w_reg_select_dec bit 41
1351
                begin
1352
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1353
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1354
                        w_reg_select_dec = 56'h00_0200_0000_0000 ;
1355
                end
1356
                `W_IMG_CTRL4_ADDR:   // w_reg_select_dec bit 42
1357
                begin
1358
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl4_bit2_0 } ;
1359
                        w_reg_select_dec = 56'h00_0400_0000_0000 ;
1360
                end
1361
                `W_BA4_ADDR:   // w_reg_select_dec bit 43
1362
                begin
1363
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba4_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1364
                                                                                                                        wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1365
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1366
                w_conf_data_out[0] = wb_ba4_bit0 ;
1367
                        w_reg_select_dec = 56'h00_0800_0000_0000 ;
1368
                end
1369
                `W_AM4_ADDR:   // w_reg_select_dec bit 44
1370
                begin
1371
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1372
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1373
                        w_reg_select_dec = 56'h00_1000_0000_0000 ;
1374
                end
1375
                `W_TA4_ADDR:   // w_reg_select_dec bit 45
1376
                begin
1377
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1378
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1379
                        w_reg_select_dec = 56'h00_2000_0000_0000 ;
1380
                end
1381
                `W_IMG_CTRL5_ADDR:   // w_reg_select_dec bit 46
1382
                begin
1383
                        w_conf_data_out = { 29'h00000000, wb_img_ctrl5_bit2_0 } ;
1384
                        w_reg_select_dec = 56'h00_4000_0000_0000 ;
1385
                end
1386
                `W_BA5_ADDR:   // w_reg_select_dec bit 47
1387
                begin
1388
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ba5_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] &
1389
                                                                                                                        wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1390
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):1]  = 0 ;
1391
                w_conf_data_out[0] = wb_ba5_bit0 ;
1392
                        w_reg_select_dec = 56'h00_8000_0000_0000 ;
1393
                end
1394
                `W_AM5_ADDR:   // w_reg_select_dec bit 48
1395
                begin
1396
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1397
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1398
                        w_reg_select_dec = 56'h01_0000_0000_0000 ;
1399
                end
1400
                `W_TA5_ADDR:   // w_reg_select_dec bit 49
1401
                begin
1402
                w_conf_data_out[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = wb_ta5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1403
                w_conf_data_out[(31-`WB_NUM_OF_DEC_ADDR_LINES):0]  = 0 ;
1404
                        w_reg_select_dec = 56'h02_0000_0000_0000 ;
1405
                end
1406
                `W_ERR_CS_ADDR:   // w_reg_select_dec bit 50
1407
                begin
1408
                        w_conf_data_out = { wb_err_cs_bit31_24, /*13*/14'h0000, /*wb_err_cs_bit10,*/
1409
                                                                                   wb_err_cs_bit9, wb_err_cs_bit8, 7'h00, wb_err_cs_bit0 } ;
1410
                        w_reg_select_dec = 56'h04_0000_0000_0000 ;
1411
                end
1412
                `W_ERR_ADDR_ADDR:   // w_reg_select_dec bit 51
1413
                begin
1414
                        w_conf_data_out = wb_err_addr ;
1415
                        w_reg_select_dec = 56'h08_0000_0000_0000 ;
1416
                end
1417
                `W_ERR_DATA_ADDR:   // w_reg_select_dec bit 52
1418
                begin
1419
                        w_conf_data_out = wb_err_data ;
1420
                        w_reg_select_dec = 56'h10_0000_0000_0000 ;
1421
                end
1422
                `CNF_ADDR_ADDR:   // w_reg_select_dec bit 53
1423
                begin
1424
                        w_conf_data_out = { 8'h00, cnf_addr_bit23_2, 1'h0, cnf_addr_bit0 } ;
1425
                        w_reg_select_dec = 56'h20_0000_0000_0000 ;
1426
                end
1427
                // `CNF_DATA_ADDR: implemented elsewhere !!!
1428
                // `INT_ACK_ADDR: implemented elsewhere !!!
1429
        `ICR_ADDR:   // w_reg_select_dec bit 54
1430
                begin
1431
                        w_conf_data_out = { icr_bit31, 26'h0000_000, icr_bit4_3, icr_bit2_0 } ;
1432
                        w_reg_select_dec = 56'h40_0000_0000_0000 ;
1433
                end
1434
        `ISR_ADDR:   // w_reg_select_dec bit 55
1435
                begin
1436
                        w_conf_data_out = { 27'h0000_000, isr_bit4_3, isr_bit2_0 } ;
1437
                        w_reg_select_dec = 56'h80_0000_0000_0000 ;
1438
                end
1439
                default:
1440
                begin
1441
                        w_conf_data_out = 32'h0000_0000 ;
1442
                        w_reg_select_dec = 56'h00_0000_0000_0000 ;
1443
                end
1444 2 mihad
                endcase
1445 21 mihad
        end
1446
        endcase
1447 2 mihad
end
1448
 
1449 21 mihad
// Reduced write data for BASE, MASK and TRANSLATION registers of PCI and WB images
1450
assign  w_conf_pdata_reduced[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)]        = w_conf_data_in[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
1451
assign  w_conf_pdata_reduced[(31-`PCI_NUM_OF_DEC_ADDR_LINES): 0] = 0 ;
1452
assign  w_conf_wdata_reduced[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] = w_conf_data_in[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
1453
assign  w_conf_wdata_reduced[(31-`WB_NUM_OF_DEC_ADDR_LINES): 0]  = 0 ;
1454
 
1455
always@(posedge w_clock or posedge reset)
1456
begin
1457 2 mihad
        // Here are implemented all registers that are reset with RESET signal otherwise they can be normaly written!!!
1458
        // Registers that are commented are implemented after this alwasy statement, because they are e.g. reset with
1459
        //   RESET signal, set with some status signal and they are erased with writting '1' into them !!!
1460
        if (reset)
1461
        begin
1462
                /*status_bit15_11 ; status_bit8 ;*/ command_bit8 <= 1'h0 ; command_bit6 <= 1'h0 ; command_bit2_0 <= 3'h0 ;
1463
                latency_timer <= 8'h00 ; cache_line_size_reg <= 8'h00 ;
1464
                // ALL pci_base address registers are the same as pci_baX registers !
1465
                interrupt_line <= 8'h00 ;
1466
 
1467 21 mihad
                `ifdef          HOST
1468
                  `ifdef        NO_CNF_IMAGE    // if PCI bridge is HOST and IMAGE0 is assigned as general image space
1469
                        `ifdef  PCI_IMAGE0
1470 2 mihad
                                        pci_img_ctrl0_bit2_1 <= 2'h0 ;
1471 21 mihad
                                        pci_ba0_bit31_12 <= 20'h0000_0 ;
1472
                                        pci_ba0_bit0 <= `PCI_BA0_MEM_IO ;
1473
                                        pci_am0 <= `PCI_AM0 ;
1474 2 mihad
                                        pci_ta0 <= 20'h0000_0 ;
1475 21 mihad
                        `endif
1476
                  `else
1477
                                        pci_ba0_bit31_12 <= 20'h0000_0 ;
1478
                  `endif
1479
                `else // GUEST
1480
                                        pci_ba0_bit31_12 <= 20'h0000_0 ;
1481 2 mihad
                `endif
1482 21 mihad
 
1483 2 mihad
                pci_img_ctrl1_bit2_1 <= 2'h0 ;
1484 21 mihad
                pci_ba1_bit31_12 <= 20'h0000_0 ;
1485
        `ifdef  HOST
1486
                pci_ba1_bit0 <= `PCI_BA1_MEM_IO ;
1487
        `endif
1488
                pci_am1 <= `PCI_AM1;
1489 2 mihad
                pci_ta1 <= 20'h0000_0 ;
1490
                `ifdef  PCI_IMAGE2
1491
                                pci_img_ctrl2_bit2_1 <= 2'h0 ;
1492 21 mihad
                                        pci_ba2_bit31_12 <= 20'h0000_0 ;
1493
                        `ifdef  HOST
1494
                                        pci_ba2_bit0 <= `PCI_BA2_MEM_IO ;
1495
                        `endif
1496
                                        pci_am2 <= `PCI_AM2;
1497 2 mihad
                                        pci_ta2 <= 20'h0000_0 ;
1498
                `endif
1499
                `ifdef  PCI_IMAGE3
1500
                                        pci_img_ctrl3_bit2_1 <= 2'h0 ;
1501 21 mihad
                                pci_ba3_bit31_12 <= 20'h0000_0 ;
1502
                `ifdef  HOST
1503
                                pci_ba3_bit0 <= `PCI_BA3_MEM_IO ;
1504
                `endif
1505
                                pci_am3 <= `PCI_AM3;
1506 2 mihad
                                        pci_ta3 <= 20'h0000_0 ;
1507
                `endif
1508
                `ifdef  PCI_IMAGE4
1509
                                        pci_img_ctrl4_bit2_1 <= 2'h0 ;
1510 21 mihad
                                        pci_ba4_bit31_12 <= 20'h0000_0 ;
1511
                        `ifdef  HOST
1512
                                        pci_ba4_bit0 <= `PCI_BA4_MEM_IO ;
1513
                        `endif
1514
                                        pci_am4 <= `PCI_AM4;
1515 2 mihad
                                        pci_ta4 <= 20'h0000_0 ;
1516
                `endif
1517
                `ifdef  PCI_IMAGE5
1518
                                        pci_img_ctrl5_bit2_1 <= 2'h0 ;
1519 21 mihad
                                        pci_ba5_bit31_12 <= 20'h0000_0 ;
1520
                        `ifdef  HOST
1521
                                        pci_ba5_bit0 <= `PCI_BA5_MEM_IO ;
1522
                        `endif
1523 45 mihad
                                        pci_am5 <= `PCI_AM5;
1524 2 mihad
                                        pci_ta5 <= 20'h0000_0 ;
1525
                `endif
1526 21 mihad
                /*pci_err_cs_bit31_24 ; pci_err_cs_bit10; pci_err_cs_bit9 ; pci_err_cs_bit8 ;*/ pci_err_cs_bit0 <= 1'h0 ;
1527 2 mihad
                /*pci_err_addr ;*/
1528
        /*pci_err_data ;*/
1529 21 mihad
                //
1530 2 mihad
                wb_img_ctrl1_bit2_0 <= 3'h0 ;
1531
                wb_ba1_bit31_12 <= 20'h0000_0 ; wb_ba1_bit0 <= 1'h0 ;
1532 21 mihad
                wb_am1 <= 20'h0000_0 ;
1533 2 mihad
                wb_ta1 <= 20'h0000_0 ;
1534
        `ifdef  WB_IMAGE2
1535
                                        wb_img_ctrl2_bit2_0 <= 3'h0 ;
1536
                                        wb_ba2_bit31_12 <= 20'h0000_0 ; wb_ba2_bit0 <= 1'h0 ;
1537 21 mihad
                                        wb_am2 <= 20'h0000_0 ;
1538 2 mihad
                                        wb_ta2 <= 20'h0000_0 ;
1539
                `endif
1540
                `ifdef  WB_IMAGE3
1541
                                        wb_img_ctrl3_bit2_0 <= 3'h0 ;
1542
                                        wb_ba3_bit31_12 <= 20'h0000_0 ; wb_ba3_bit0 <= 1'h0 ;
1543 21 mihad
                                        wb_am3 <= 20'h0000_0 ;
1544 2 mihad
                                        wb_ta3 <= 20'h0000_0 ;
1545
                `endif
1546
                `ifdef  WB_IMAGE4
1547
                                        wb_img_ctrl4_bit2_0 <= 3'h0 ;
1548
                                        wb_ba4_bit31_12 <= 20'h0000_0 ; wb_ba4_bit0 <= 1'h0 ;
1549 21 mihad
                                        wb_am4 <= 20'h0000_0 ;
1550 2 mihad
                                        wb_ta4 <= 20'h0000_0 ;
1551
                `endif
1552
                `ifdef  WB_IMAGE5
1553
                                        wb_img_ctrl5_bit2_0 <= 3'h0 ;
1554
                                wb_ba5_bit31_12 <= 20'h0000_0 ; wb_ba5_bit0 <= 1'h0 ;
1555 21 mihad
                                        wb_am5 <= 20'h0000_0 ;
1556 2 mihad
                                        wb_ta5 <= 20'h0000_0 ;
1557
                `endif
1558 21 mihad
                /*wb_err_cs_bit31_24 ; wb_err_cs_bit10 ; wb_err_cs_bit9 ; wb_err_cs_bit8 ;*/ wb_err_cs_bit0 <= 1'h0 ;
1559 2 mihad
                /*wb_err_addr ;*/
1560
                /*wb_err_data ;*/
1561 21 mihad
 
1562
                `ifdef          HOST
1563
                cnf_addr_bit23_2 <= 22'h0000_00 ; cnf_addr_bit0 <= 1'h0 ;
1564
                `endif
1565
 
1566
                icr_bit31 <= 1'h0 ;
1567
                `ifdef  HOST
1568
                        icr_bit2_0 <= 3'h0 ;
1569
                        icr_bit4_3 <= 2'h0 ;
1570
                `else
1571
                        icr_bit2_0[2:0] <= 3'h0 ;
1572
                `endif
1573
                /*isr_bit4_3 ; isr_bit2_0 ;*/
1574 2 mihad
        end
1575
/* -----------------------------------------------------------------------------------------------------------
1576
Following register bits should have asynchronous RESET & SET! That is why they are IMPLEMENTED separately
1577
after this ALWAYS block!!! (for every register bit, there are two D-FF implemented)
1578
                status_bit15_11[15] <= 1'b1 ;
1579
                status_bit15_11[14] <= 1'b1 ;
1580
                status_bit15_11[13] <= 1'b1 ;
1581
                status_bit15_11[12] <= 1'b1 ;
1582
                status_bit15_11[11] <= 1'b1 ;
1583
                status_bit8 <= 1'b1 ;
1584
                pci_err_cs_bit10 <= 1'b1 ;
1585 21 mihad
                pci_err_cs_bit9 <= 1'b1 ;
1586 2 mihad
                pci_err_cs_bit8 <= 1'b1 ;
1587
                pci_err_cs_bit31_24 <= { pci_error_be, pci_error_bc } ;
1588
                pci_err_addr <= pci_error_addr ;
1589
                pci_err_data <= pci_error_data ;
1590 21 mihad
                wb_err_cs_bit10 <= 1'b1 ;
1591
                wb_err_cs_bit9 <= 1'b1 ;
1592
                wb_err_cs_bit8 <= 1'b1 ;
1593 2 mihad
                wb_err_cs_bit31_24 <= { wb_error_be, wb_error_bc } ;
1594
                wb_err_addr <= wb_error_addr ;
1595
                wb_err_data <= wb_error_data ;
1596 21 mihad
                isr_bit4_0[4] <= 1'b1 & icr_bit4_0[4] ;
1597
                isr_bit4_0[3] <= 1'b1 & icr_bit4_0[3] ;
1598
                isr_bit4_0[2] <= 1'b1 & icr_bit4_0[2] ;
1599
                isr_bit4_0[1] <= 1'b1 & icr_bit4_0[1] ;
1600
                isr_bit4_0[0] <= 1'b1 & icr_bit4_0[0] ;
1601 2 mihad
-----------------------------------------------------------------------------------------------------------*/
1602
        // Here follows normal writting to registers (only to their valid bits) !
1603
        else
1604
        begin
1605 21 mihad
                if (w_we)
1606
                begin
1607 2 mihad
                                // PCI header - configuration space
1608 21 mihad
                                if (w_reg_select_dec[0]) // w_conf_address_in[5:2] = 4'h1:
1609 2 mihad
                                begin
1610 21 mihad
                                        if (~w_byte_en[1])
1611
                                                command_bit8 <= w_conf_data_in[8] ;
1612
                                        if (~w_byte_en[0])
1613 2 mihad
                                        begin
1614 21 mihad
                                                command_bit6 <= w_conf_data_in[6] ;
1615
                                                command_bit2_0 <= w_conf_data_in[2:0] ;
1616 2 mihad
                                        end
1617
                                end
1618 21 mihad
                                if (w_reg_select_dec[1]) // w_conf_address_in[5:2] = 4'h3:
1619 2 mihad
                                begin
1620 21 mihad
                                        if (~w_byte_en[1])
1621
                                                latency_timer <= w_conf_data_in[15:8] ;
1622
                                        if (~w_byte_en[0])
1623
                                                cache_line_size_reg <= w_conf_data_in[7:0] ;
1624 2 mihad
                                end
1625 21 mihad
//                  if (w_reg_select_dec[4]) // w_conf_address_in[5:2] = 4'h4:
1626
//                              Also used with IMAGE0
1627
 
1628
//                  if (w_reg_select_dec[8]) // w_conf_address_in[5:2] = 4'h5:
1629
//                              Also used with IMAGE1
1630
 
1631
//                  if (w_reg_select_dec[12]) // w_conf_address_in[5:2] = 4'h6:
1632
//                              Also used with IMAGE2
1633
 
1634
//                  if (w_reg_select_dec[16]) // w_conf_address_in[5:2] = 4'h7:
1635
//                              Also used with IMAGE3
1636
 
1637
//                  if (w_reg_select_dec[20]) // w_conf_address_in[5:2] = 4'h8:
1638
//                              Also used with IMAGE4
1639
 
1640
//                  if (w_reg_select_dec[24]) // w_conf_address_in[5:2] = 4'h9:
1641
//                              Also used with IMAGE5 and IMAGE6
1642
                                if (w_reg_select_dec[2]) // w_conf_address_in[5:2] = 4'hf:
1643 2 mihad
                                begin
1644 21 mihad
                                        if (~w_byte_en[0])
1645
                                                interrupt_line <= w_conf_data_in[7:0] ;
1646 2 mihad
                                end
1647 21 mihad
                                // PCI target - configuration space
1648
`ifdef          HOST
1649
  `ifdef        NO_CNF_IMAGE
1650
        `ifdef  PCI_IMAGE0      // if PCI bridge is HOST and IMAGE0 is assigned as general image space
1651
                                if (w_reg_select_dec[3]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL0_ADDR:
1652 2 mihad
                                begin
1653 21 mihad
                                        if (~w_byte_en[0])
1654
                                                pci_img_ctrl0_bit2_1 <= w_conf_data_in[2:1] ;
1655 2 mihad
                                end
1656 21 mihad
                    if (w_reg_select_dec[4]) // case (w_conf_address_in[7:2]) = `P_BA0_ADDR:
1657 2 mihad
                                begin
1658 21 mihad
                                        if (~w_byte_en[3])
1659
                                                pci_ba0_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1660
                                        if (~w_byte_en[2])
1661
                                                pci_ba0_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1662
                                        if (~w_byte_en[1])
1663
                                                pci_ba0_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1664
                                        if (~w_byte_en[0])
1665
                                                pci_ba0_bit0 <= w_conf_data_in[0] ;
1666 2 mihad
                                end
1667 21 mihad
                    if (w_reg_select_dec[5]) // case (w_conf_address_in[7:2]) = `P_AM0_ADDR:
1668 2 mihad
                                begin
1669 21 mihad
                                        if (~w_byte_en[3])
1670
                                                pci_am0[31:24] <= w_conf_pdata_reduced[31:24] ;
1671
                                        if (~w_byte_en[2])
1672
                                                pci_am0[23:16] <= w_conf_pdata_reduced[23:16] ;
1673
                                        if (~w_byte_en[1])
1674
                                                pci_am0[15:12] <= w_conf_pdata_reduced[15:12] ;
1675 2 mihad
                                end
1676 21 mihad
                    if (w_reg_select_dec[6]) // case (w_conf_address_in[7:2]) = `P_TA0_ADDR:
1677 2 mihad
                                begin
1678 21 mihad
                                        if (~w_byte_en[3])
1679
                                                pci_ta0[31:24] <= w_conf_pdata_reduced[31:24] ;
1680
                                        if (~w_byte_en[2])
1681
                                                pci_ta0[23:16] <= w_conf_pdata_reduced[23:16] ;
1682
                                        if (~w_byte_en[1])
1683
                                                pci_ta0[15:12] <= w_conf_pdata_reduced[15:12] ;
1684 2 mihad
                                end
1685 21 mihad
        `endif
1686
  `else
1687
                    if (w_reg_select_dec[4]) // case (w_conf_address_in[7:2]) = `P_BA0_ADDR:
1688 2 mihad
                                begin
1689 21 mihad
                                        if (~w_byte_en[3])
1690
                                                pci_ba0_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1691
                                        if (~w_byte_en[2])
1692
                                                pci_ba0_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1693
                                        if (~w_byte_en[1])
1694
                                                pci_ba0_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1695 2 mihad
                                end
1696 21 mihad
  `endif
1697
`else // GUEST
1698
                    if (w_reg_select_dec[4]) // case (w_conf_address_in[7:2]) = `P_BA0_ADDR:
1699 2 mihad
                                begin
1700 21 mihad
                                        if (~w_byte_en[3])
1701
                                                pci_ba0_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1702
                                        if (~w_byte_en[2])
1703
                                                pci_ba0_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1704
                                        if (~w_byte_en[1])
1705
                                                pci_ba0_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1706 2 mihad
                                end
1707
`endif
1708 21 mihad
                    if (w_reg_select_dec[7]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL1_ADDR:
1709 2 mihad
                                begin
1710 21 mihad
                                        if (~w_byte_en[0])
1711
                                                pci_img_ctrl1_bit2_1 <= w_conf_data_in[2:1] ;
1712 2 mihad
                                end
1713 21 mihad
                    if (w_reg_select_dec[8]) // case (w_conf_address_in[7:2]) = `P_BA1_ADDR:
1714 2 mihad
                                begin
1715 21 mihad
                                        if (~w_byte_en[3])
1716
                                                pci_ba1_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1717
                                        if (~w_byte_en[2])
1718
                                                pci_ba1_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1719
                                        if (~w_byte_en[1])
1720
                                                pci_ba1_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1721
        `ifdef  HOST
1722
                                        if (~w_byte_en[0])
1723
                                                pci_ba1_bit0 <= w_conf_data_in[0] ;
1724
        `endif
1725 2 mihad
                                end
1726 21 mihad
                    if (w_reg_select_dec[9]) // case (w_conf_address_in[7:2]) = `P_AM1_ADDR:
1727 2 mihad
                                begin
1728 21 mihad
                                        if (~w_byte_en[3])
1729
                                                pci_am1[31:24] <= w_conf_pdata_reduced[31:24] ;
1730
                                        if (~w_byte_en[2])
1731
                                                pci_am1[23:16] <= w_conf_pdata_reduced[23:16] ;
1732
                                        if (~w_byte_en[1])
1733
                                                pci_am1[15:12] <= w_conf_pdata_reduced[15:12] ;
1734 2 mihad
                                end
1735 21 mihad
                    if (w_reg_select_dec[10]) // case (w_conf_address_in[7:2]) = `P_TA1_ADDR:
1736 2 mihad
                                begin
1737 21 mihad
                                        if (~w_byte_en[3])
1738
                                                pci_ta1[31:24] <= w_conf_pdata_reduced[31:24] ;
1739
                                        if (~w_byte_en[2])
1740
                                                pci_ta1[23:16] <= w_conf_pdata_reduced[23:16] ;
1741
                                        if (~w_byte_en[1])
1742
                                                pci_ta1[15:12] <= w_conf_pdata_reduced[15:12] ;
1743 2 mihad
                                end
1744
`ifdef          PCI_IMAGE2
1745 21 mihad
                    if (w_reg_select_dec[11]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL2_ADDR:
1746 2 mihad
                                begin
1747 21 mihad
                                        if (~w_byte_en[0])
1748
                                                pci_img_ctrl2_bit2_1 <= w_conf_data_in[2:1] ;
1749 2 mihad
                                end
1750 21 mihad
                    if (w_reg_select_dec[12]) // case (w_conf_address_in[7:2]) = `P_BA2_ADDR:
1751 2 mihad
                                begin
1752 21 mihad
                                        if (~w_byte_en[3])
1753
                                                pci_ba2_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1754
                                        if (~w_byte_en[2])
1755
                                                pci_ba2_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1756
                                        if (~w_byte_en[1])
1757
                                                pci_ba2_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1758
        `ifdef  HOST
1759
                                        if (~w_byte_en[0])
1760
                                                pci_ba2_bit0 <= w_conf_data_in[0] ;
1761
        `endif
1762 2 mihad
                                end
1763 21 mihad
                    if (w_reg_select_dec[13]) // case (w_conf_address_in[7:2]) = `P_AM2_ADDR:
1764 2 mihad
                                begin
1765 21 mihad
                                        if (~w_byte_en[3])
1766
                                                pci_am2[31:24] <= w_conf_pdata_reduced[31:24] ;
1767
                                        if (~w_byte_en[2])
1768
                                                pci_am2[23:16] <= w_conf_pdata_reduced[23:16] ;
1769
                                        if (~w_byte_en[1])
1770
                                                pci_am2[15:12] <= w_conf_pdata_reduced[15:12] ;
1771 2 mihad
                                end
1772 21 mihad
                    if (w_reg_select_dec[14]) // case (w_conf_address_in[7:2]) = `P_TA2_ADDR:
1773 2 mihad
                                begin
1774 21 mihad
                                        if (~w_byte_en[3])
1775
                                                pci_ta2[31:24] <= w_conf_pdata_reduced[31:24] ;
1776
                                        if (~w_byte_en[2])
1777
                                                pci_ta2[23:16] <= w_conf_pdata_reduced[23:16] ;
1778
                                        if (~w_byte_en[1])
1779
                                                pci_ta2[15:12] <= w_conf_pdata_reduced[15:12] ;
1780 2 mihad
                                end
1781
`endif
1782
`ifdef          PCI_IMAGE3
1783 21 mihad
                    if (w_reg_select_dec[15]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL3_ADDR:
1784 2 mihad
                                begin
1785 21 mihad
                                        if (~w_byte_en[0])
1786
                                                pci_img_ctrl3_bit2_1 <= w_conf_data_in[2:1] ;
1787 2 mihad
                                end
1788 21 mihad
                    if (w_reg_select_dec[16]) // case (w_conf_address_in[7:2]) = `P_BA3_ADDR:
1789 2 mihad
                                begin
1790 21 mihad
                                        if (~w_byte_en[3])
1791
                                                pci_ba3_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1792
                                        if (~w_byte_en[2])
1793
                                                pci_ba3_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1794
                                        if (~w_byte_en[1])
1795
                                                pci_ba3_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1796
        `ifdef  HOST
1797
                                        if (~w_byte_en[0])
1798
                                                pci_ba3_bit0 <= w_conf_data_in[0] ;
1799
        `endif
1800 2 mihad
                                end
1801 21 mihad
                    if (w_reg_select_dec[17]) // case (w_conf_address_in[7:2]) = `P_AM3_ADDR:
1802 2 mihad
                                begin
1803 21 mihad
                                        if (~w_byte_en[3])
1804
                                                pci_am3[31:24] <= w_conf_pdata_reduced[31:24] ;
1805
                                        if (~w_byte_en[2])
1806
                                                pci_am3[23:16] <= w_conf_pdata_reduced[23:16] ;
1807
                                        if (~w_byte_en[1])
1808
                                                pci_am3[15:12] <= w_conf_pdata_reduced[15:12] ;
1809 2 mihad
                                end
1810 21 mihad
                    if (w_reg_select_dec[18]) // case (w_conf_address_in[7:2]) = `P_TA3_ADDR:
1811 2 mihad
                                begin
1812 21 mihad
                                        if (~w_byte_en[3])
1813
                                                pci_ta3[31:24] <= w_conf_pdata_reduced[31:24] ;
1814
                                        if (~w_byte_en[2])
1815
                                                pci_ta3[23:16] <= w_conf_pdata_reduced[23:16] ;
1816
                                        if (~w_byte_en[1])
1817
                                                pci_ta3[15:12] <= w_conf_pdata_reduced[15:12] ;
1818 2 mihad
                                end
1819
`endif
1820
`ifdef          PCI_IMAGE4
1821 21 mihad
                    if (w_reg_select_dec[19]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL4_ADDR:
1822 2 mihad
                                begin
1823 21 mihad
                                        if (~w_byte_en[0])
1824
                                                pci_img_ctrl4_bit2_1 <= w_conf_data_in[2:1] ;
1825 2 mihad
                                end
1826 21 mihad
                    if (w_reg_select_dec[20]) // case (w_conf_address_in[7:2]) = `P_BA4_ADDR:
1827 2 mihad
                                begin
1828 21 mihad
                                        if (~w_byte_en[3])
1829
                                                pci_ba4_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1830
                                        if (~w_byte_en[2])
1831
                                                pci_ba4_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1832
                                        if (~w_byte_en[1])
1833
                                                pci_ba4_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1834
        `ifdef  HOST
1835
                                        if (~w_byte_en[0])
1836
                                                pci_ba4_bit0 <= w_conf_data_in[0] ;
1837
        `endif
1838 2 mihad
                                end
1839 21 mihad
                    if (w_reg_select_dec[21]) // case (w_conf_address_in[7:2]) = `P_AM4_ADDR:
1840 2 mihad
                                begin
1841 21 mihad
                                        if (~w_byte_en[3])
1842
                                                pci_am4[31:24] <= w_conf_pdata_reduced[31:24] ;
1843
                                        if (~w_byte_en[2])
1844
                                                pci_am4[23:16] <= w_conf_pdata_reduced[23:16] ;
1845
                                        if (~w_byte_en[1])
1846
                                                pci_am4[15:12] <= w_conf_pdata_reduced[15:12] ;
1847 2 mihad
                                end
1848 21 mihad
                    if (w_reg_select_dec[22]) // case (w_conf_address_in[7:2]) = `P_TA4_ADDR:
1849 2 mihad
                                begin
1850 21 mihad
                                        if (~w_byte_en[3])
1851
                                                pci_ta4[31:24] <= w_conf_pdata_reduced[31:24] ;
1852
                                        if (~w_byte_en[2])
1853
                                                pci_ta4[23:16] <= w_conf_pdata_reduced[23:16] ;
1854
                                        if (~w_byte_en[1])
1855
                                                pci_ta4[15:12] <= w_conf_pdata_reduced[15:12] ;
1856 2 mihad
                                end
1857
`endif
1858
`ifdef          PCI_IMAGE5
1859 21 mihad
                    if (w_reg_select_dec[23]) // case (w_conf_address_in[7:2]) = `P_IMG_CTRL5_ADDR:
1860 2 mihad
                                begin
1861 21 mihad
                                        if (~w_byte_en[0])
1862
                                                pci_img_ctrl5_bit2_1 <= w_conf_data_in[2:1] ;
1863 2 mihad
                                end
1864 21 mihad
                    if (w_reg_select_dec[24]) // case (w_conf_address_in[7:2]) = `P_BA5_ADDR:
1865 2 mihad
                                begin
1866 21 mihad
                                        if (~w_byte_en[3])
1867
                                                pci_ba5_bit31_12[31:24] <= w_conf_pdata_reduced[31:24] ;
1868
                                        if (~w_byte_en[2])
1869
                                                pci_ba5_bit31_12[23:16] <= w_conf_pdata_reduced[23:16] ;
1870
                                        if (~w_byte_en[1])
1871
                                                pci_ba5_bit31_12[15:12] <= w_conf_pdata_reduced[15:12] ;
1872
        `ifdef  HOST
1873
                                        if (~w_byte_en[0])
1874
                                                pci_ba5_bit0 <= w_conf_data_in[0] ;
1875
        `endif
1876 2 mihad
                                end
1877 21 mihad
                    if (w_reg_select_dec[25]) // case (w_conf_address_in[7:2]) = `P_AM5_ADDR:
1878 2 mihad
                                begin
1879 21 mihad
                                        if (~w_byte_en[3])
1880
                                                pci_am5[31:24] <= w_conf_pdata_reduced[31:24] ;
1881
                                        if (~w_byte_en[2])
1882
                                                pci_am5[23:16] <= w_conf_pdata_reduced[23:16] ;
1883
                                        if (~w_byte_en[1])
1884
                                                pci_am5[15:12] <= w_conf_pdata_reduced[15:12] ;
1885 2 mihad
                                end
1886 21 mihad
                    if (w_reg_select_dec[26]) // case (w_conf_address_in[7:2]) = `P_TA5_ADDR:
1887 2 mihad
                                begin
1888 21 mihad
                                        if (~w_byte_en[3])
1889
                                                pci_ta5[31:24] <= w_conf_pdata_reduced[31:24] ;
1890
                                        if (~w_byte_en[2])
1891
                                                pci_ta5[23:16] <= w_conf_pdata_reduced[23:16] ;
1892
                                        if (~w_byte_en[1])
1893
                                                pci_ta5[15:12] <= w_conf_pdata_reduced[15:12] ;
1894 2 mihad
                                end
1895
`endif
1896 21 mihad
                    if (w_reg_select_dec[27]) // case (w_conf_address_in[7:2]) = `P_ERR_CS_ADDR:
1897 2 mihad
                                begin
1898 21 mihad
                                        if (~w_byte_en[0])
1899
                                                pci_err_cs_bit0 <= w_conf_data_in[0] ;
1900 2 mihad
                                end
1901
                        // WB slave - configuration space
1902 21 mihad
                                if (w_reg_select_dec[30]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL1_ADDR:
1903 2 mihad
                                begin
1904 21 mihad
                                        if (~w_byte_en[0])
1905
                                                wb_img_ctrl1_bit2_0 <= w_conf_data_in[2:0] ;
1906 2 mihad
                                end
1907 21 mihad
                                if (w_reg_select_dec[31]) // case (w_conf_address_in[7:2]) = `W_BA1_ADDR:
1908 2 mihad
                                begin
1909 21 mihad
                                        if (~w_byte_en[3])
1910
                                                wb_ba1_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
1911
                                        if (~w_byte_en[2])
1912
                                                wb_ba1_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
1913
                                        if (~w_byte_en[1])
1914
                                                wb_ba1_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
1915
                                        if (~w_byte_en[0])
1916
                                                wb_ba1_bit0 <= w_conf_data_in[0] ;
1917 2 mihad
                                end
1918 21 mihad
                                if (w_reg_select_dec[32]) // case (w_conf_address_in[7:2]) = `W_AM1_ADDR:
1919 2 mihad
                                begin
1920 21 mihad
                                        if (~w_byte_en[3])
1921
                                                wb_am1[31:24] <= w_conf_wdata_reduced[31:24] ;
1922
                                        if (~w_byte_en[2])
1923
                                                wb_am1[23:16] <= w_conf_wdata_reduced[23:16] ;
1924
                                        if (~w_byte_en[1])
1925
                                                wb_am1[15:12] <= w_conf_wdata_reduced[15:12] ;
1926 2 mihad
                                end
1927 21 mihad
                                if (w_reg_select_dec[33]) // case (w_conf_address_in[7:2]) = `W_TA1_ADDR:
1928 2 mihad
                                begin
1929 21 mihad
                                        if (~w_byte_en[3])
1930
                                                wb_ta1[31:24] <= w_conf_wdata_reduced[31:24] ;
1931
                                        if (~w_byte_en[2])
1932
                                                wb_ta1[23:16] <= w_conf_wdata_reduced[23:16] ;
1933
                                        if (~w_byte_en[1])
1934
                                                wb_ta1[15:12] <= w_conf_wdata_reduced[15:12] ;
1935 2 mihad
                                end
1936
`ifdef          WB_IMAGE2
1937 21 mihad
                                if (w_reg_select_dec[34]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL2_ADDR:
1938 2 mihad
                                begin
1939 21 mihad
                                        if (~w_byte_en[0])
1940
                                                wb_img_ctrl2_bit2_0 <= w_conf_data_in[2:0] ;
1941 2 mihad
                                end
1942 21 mihad
                                if (w_reg_select_dec[35]) // case (w_conf_address_in[7:2]) = `W_BA2_ADDR:
1943 2 mihad
                                begin
1944 21 mihad
                                        if (~w_byte_en[3])
1945
                                                wb_ba2_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
1946
                                        if (~w_byte_en[2])
1947
                                                wb_ba2_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
1948
                                        if (~w_byte_en[1])
1949
                                                wb_ba2_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
1950
                                        if (~w_byte_en[0])
1951
                                                wb_ba2_bit0 <= w_conf_data_in[0] ;
1952 2 mihad
                                end
1953 21 mihad
                                if (w_reg_select_dec[36]) // case (w_conf_address_in[7:2]) = `W_AM2_ADDR:
1954 2 mihad
                                begin
1955 21 mihad
                                        if (~w_byte_en[3])
1956
                                                wb_am2[31:24] <= w_conf_wdata_reduced[31:24] ;
1957
                                        if (~w_byte_en[2])
1958
                                                wb_am2[23:16] <= w_conf_wdata_reduced[23:16] ;
1959
                                        if (~w_byte_en[1])
1960
                                                wb_am2[15:12] <= w_conf_wdata_reduced[15:12] ;
1961 2 mihad
                                end
1962 21 mihad
                                if (w_reg_select_dec[37]) // case (w_conf_address_in[7:2]) = `W_TA2_ADDR:
1963 2 mihad
                                begin
1964 21 mihad
                                        if (~w_byte_en[3])
1965
                                                wb_ta2[31:24] <= w_conf_wdata_reduced[31:24] ;
1966
                                        if (~w_byte_en[2])
1967
                                                wb_ta2[23:16] <= w_conf_wdata_reduced[23:16] ;
1968
                                        if (~w_byte_en[1])
1969
                                                wb_ta2[15:12] <= w_conf_wdata_reduced[15:12] ;
1970 2 mihad
                                end
1971
`endif
1972
`ifdef          WB_IMAGE3
1973 21 mihad
                                if (w_reg_select_dec[38]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL3_ADDR:
1974 2 mihad
                                begin
1975 21 mihad
                                        if (~w_byte_en[0])
1976
                                                wb_img_ctrl3_bit2_0 <= w_conf_data_in[2:0] ;
1977 2 mihad
                                end
1978 21 mihad
                                if (w_reg_select_dec[39]) // case (w_conf_address_in[7:2]) = `W_BA3_ADDR:
1979 2 mihad
                                begin
1980 21 mihad
                                        if (~w_byte_en[3])
1981
                                                wb_ba3_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
1982
                                        if (~w_byte_en[2])
1983
                                                wb_ba3_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
1984
                                        if (~w_byte_en[1])
1985
                                                wb_ba3_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
1986
                                        if (~w_byte_en[0])
1987
                                                wb_ba3_bit0 <= w_conf_data_in[0] ;
1988 2 mihad
                                end
1989 21 mihad
                                if (w_reg_select_dec[40]) // case (w_conf_address_in[7:2]) = `W_AM3_ADDR:
1990 2 mihad
                                begin
1991 21 mihad
                                        if (~w_byte_en[3])
1992
                                                wb_am3[31:24] <= w_conf_wdata_reduced[31:24] ;
1993
                                        if (~w_byte_en[2])
1994
                                                wb_am3[23:16] <= w_conf_wdata_reduced[23:16] ;
1995
                                        if (~w_byte_en[1])
1996
                                                wb_am3[15:12] <= w_conf_wdata_reduced[15:12] ;
1997 2 mihad
                                end
1998 21 mihad
                                if (w_reg_select_dec[41]) // case (w_conf_address_in[7:2]) = `W_TA3_ADDR:
1999 2 mihad
                                begin
2000 21 mihad
                                        if (~w_byte_en[3])
2001
                                                wb_ta3[31:24] <= w_conf_wdata_reduced[31:24] ;
2002
                                        if (~w_byte_en[2])
2003
                                                wb_ta3[23:16] <= w_conf_wdata_reduced[23:16] ;
2004
                                        if (~w_byte_en[1])
2005
                                                wb_ta3[15:12] <= w_conf_wdata_reduced[15:12] ;
2006 2 mihad
                                end
2007
`endif
2008
`ifdef          WB_IMAGE4
2009 21 mihad
                                if (w_reg_select_dec[42]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL4_ADDR:
2010 2 mihad
                                begin
2011 21 mihad
                                        if (~w_byte_en[0])
2012
                                                wb_img_ctrl4_bit2_0 <= w_conf_data_in[2:0] ;
2013 2 mihad
                                end
2014 21 mihad
                                if (w_reg_select_dec[43]) // case (w_conf_address_in[7:2]) = `W_BA4_ADDR:
2015 2 mihad
                                begin
2016 21 mihad
                                        if (~w_byte_en[3])
2017
                                                wb_ba4_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
2018
                                        if (~w_byte_en[2])
2019
                                                wb_ba4_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
2020
                                        if (~w_byte_en[1])
2021
                                                wb_ba4_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
2022
                                        if (~w_byte_en[0])
2023
                                                wb_ba4_bit0 <= w_conf_data_in[0] ;
2024 2 mihad
                                end
2025 21 mihad
                                if (w_reg_select_dec[44]) // case (w_conf_address_in[7:2]) = `W_AM4_ADDR:
2026 2 mihad
                                begin
2027 21 mihad
                                        if (~w_byte_en[3])
2028
                                                wb_am4[31:24] <= w_conf_wdata_reduced[31:24] ;
2029
                                        if (~w_byte_en[2])
2030
                                                wb_am4[23:16] <= w_conf_wdata_reduced[23:16] ;
2031
                                        if (~w_byte_en[1])
2032
                                                wb_am4[15:12] <= w_conf_wdata_reduced[15:12] ;
2033 2 mihad
                                end
2034 21 mihad
                                if (w_reg_select_dec[45]) // case (w_conf_address_in[7:2]) = `W_TA4_ADDR:
2035 2 mihad
                                begin
2036 21 mihad
                                        if (~w_byte_en[3])
2037
                                                wb_ta4[31:24] <= w_conf_wdata_reduced[31:24] ;
2038
                                        if (~w_byte_en[2])
2039
                                                wb_ta4[23:16] <= w_conf_wdata_reduced[23:16] ;
2040
                                        if (~w_byte_en[1])
2041
                                                wb_ta4[15:12] <= w_conf_wdata_reduced[15:12] ;
2042 2 mihad
                                end
2043
`endif
2044
`ifdef          WB_IMAGE5
2045 21 mihad
                                if (w_reg_select_dec[46]) // case (w_conf_address_in[7:2]) = `W_IMG_CTRL5_ADDR:
2046 2 mihad
                                begin
2047 21 mihad
                                        if (~w_byte_en[0])
2048
                                                wb_img_ctrl5_bit2_0 <= w_conf_data_in[2:0] ;
2049 2 mihad
                                end
2050 21 mihad
                                if (w_reg_select_dec[47]) // case (w_conf_address_in[7:2]) = `W_BA5_ADDR:
2051 2 mihad
                                begin
2052 21 mihad
                                        if (~w_byte_en[3])
2053
                                                wb_ba5_bit31_12[31:24] <= w_conf_wdata_reduced[31:24] ;
2054
                                        if (~w_byte_en[2])
2055
                                                wb_ba5_bit31_12[23:16] <= w_conf_wdata_reduced[23:16] ;
2056
                                        if (~w_byte_en[1])
2057
                                                wb_ba5_bit31_12[15:12] <= w_conf_wdata_reduced[15:12] ;
2058
                                        if (~w_byte_en[0])
2059
                                                wb_ba5_bit0 <= w_conf_data_in[0] ;
2060 2 mihad
                                end
2061 21 mihad
                                if (w_reg_select_dec[48]) // case (w_conf_address_in[7:2]) = `W_AM5_ADDR:
2062 2 mihad
                                begin
2063 21 mihad
                                        if (~w_byte_en[3])
2064
                                                wb_am5[31:24] <= w_conf_wdata_reduced[31:24] ;
2065
                                        if (~w_byte_en[2])
2066
                                                wb_am5[23:16] <= w_conf_wdata_reduced[23:16] ;
2067
                                        if (~w_byte_en[1])
2068
                                                wb_am5[15:12] <= w_conf_wdata_reduced[15:12] ;
2069 2 mihad
                                end
2070 21 mihad
                                if (w_reg_select_dec[49]) // case (w_conf_address_in[7:2]) = `W_TA5_ADDR:
2071 2 mihad
                                begin
2072 21 mihad
                                        if (~w_byte_en[3])
2073
                                                wb_ta5[31:24] <= w_conf_wdata_reduced[31:24] ;
2074
                                        if (~w_byte_en[2])
2075
                                                wb_ta5[23:16] <= w_conf_wdata_reduced[23:16] ;
2076
                                        if (~w_byte_en[1])
2077
                                                wb_ta5[15:12] <= w_conf_wdata_reduced[15:12] ;
2078 2 mihad
                                end
2079
`endif
2080 21 mihad
                                if (w_reg_select_dec[50]) // case (w_conf_address_in[7:2]) = `W_ERR_CS_ADDR:
2081 2 mihad
                                begin
2082 21 mihad
                                        if (~w_byte_en[0])
2083
                                                wb_err_cs_bit0 <= w_conf_data_in[0] ;
2084 2 mihad
                                end
2085
 
2086 21 mihad
`ifdef  HOST
2087
                                if (w_reg_select_dec[53]) // case (w_conf_address_in[7:2]) = `CNF_ADDR_ADDR:
2088 2 mihad
                                begin
2089 21 mihad
                                        if (~w_byte_en[2])
2090
                                                cnf_addr_bit23_2[23:16] <= w_conf_data_in[23:16] ;
2091
                                        if (~w_byte_en[1])
2092
                                                cnf_addr_bit23_2[15:8] <= w_conf_data_in[15:8] ;
2093
                                        if (~w_byte_en[0])
2094 2 mihad
                                        begin
2095 21 mihad
                                                cnf_addr_bit23_2[7:2] <= w_conf_data_in[7:2] ;
2096
                                                cnf_addr_bit0 <= w_conf_data_in[0] ;
2097 2 mihad
                                        end
2098
                                end
2099 21 mihad
`endif
2100
                                // `CNF_DATA_ADDR: implemented elsewhere !!!
2101 2 mihad
                                // `INT_ACK_ADDR : implemented elsewhere !!!
2102 21 mihad
                    if (w_reg_select_dec[54]) // case (w_conf_address_in[7:2]) = `ICR_ADDR:
2103 2 mihad
                                begin
2104 21 mihad
                                        if (~w_byte_en[3])
2105
                                                icr_bit31 <= w_conf_data_in[31] ;
2106
                                        if (~w_byte_en[0])
2107
`ifdef  HOST
2108
                                                icr_bit4_3 <= w_conf_data_in[4:3] ;
2109
                                                icr_bit2_0 <= w_conf_data_in[2:0] ;
2110
`else
2111
                                                icr_bit2_0[2:0] <= w_conf_data_in[2:0] ;
2112
`endif
2113 2 mihad
                                end
2114
                end
2115 21 mihad
        end
2116 2 mihad
end
2117
 
2118
// This signals are synchronous resets for registers, whic occures when asynchronous RESET is '1' or
2119 21 mihad
// data '1' is synchronously written into them!
2120 2 mihad
reg                     delete_status_bit15 ;
2121
reg                     delete_status_bit14 ;
2122
reg                     delete_status_bit13 ;
2123
reg                     delete_status_bit12 ;
2124
reg                     delete_status_bit11 ;
2125
reg                     delete_status_bit8 ;
2126 21 mihad
reg                     delete_pci_err_cs_bit8 ;
2127 2 mihad
reg                     delete_wb_err_cs_bit8 ;
2128 21 mihad
reg                     delete_isr_bit4 ;
2129 2 mihad
reg                     delete_isr_bit3 ;
2130
reg                     delete_isr_bit2 ;
2131
reg                     delete_isr_bit1 ;
2132
 
2133
// This are aditional register bits, which are resets when their value is '1' !!!
2134 21 mihad
always@(w_we or w_reg_select_dec or w_conf_data_in or w_byte_en)
2135 2 mihad
begin
2136 21 mihad
// If '1' is written into, then it also sets signals to '1'
2137
        case ({w_we, w_reg_select_dec[0], w_reg_select_dec[27], w_reg_select_dec[50], w_reg_select_dec[55]})
2138
        {1'b1, 4'b1000} :
2139 2 mihad
        begin
2140 21 mihad
                delete_status_bit15     <= w_conf_data_in[31] & !w_byte_en[3] ;
2141
                delete_status_bit14     <= w_conf_data_in[30] & !w_byte_en[3] ;
2142
                delete_status_bit13     <= w_conf_data_in[29] & !w_byte_en[3] ;
2143
                delete_status_bit12     <= w_conf_data_in[28] & !w_byte_en[3] ;
2144
                delete_status_bit11     <= w_conf_data_in[27] & !w_byte_en[3] ;
2145
                delete_status_bit8      <= w_conf_data_in[24] & !w_byte_en[3] ;
2146
                delete_pci_err_cs_bit8  <= 1'b0 ;
2147
                delete_wb_err_cs_bit8   <= 1'b0 ;
2148
                delete_isr_bit4                 <= 1'b0 ;
2149
                delete_isr_bit3                 <= 1'b0 ;
2150
                delete_isr_bit2                 <= 1'b0 ;
2151
                delete_isr_bit1                 <= 1'b0 ;
2152 2 mihad
        end
2153 21 mihad
        {1'b1, 4'b0100} :
2154
        begin
2155
                delete_status_bit15     <= 1'b0 ;
2156
                delete_status_bit14     <= 1'b0 ;
2157
                delete_status_bit13     <= 1'b0 ;
2158
                delete_status_bit12     <= 1'b0 ;
2159
                delete_status_bit11     <= 1'b0 ;
2160
                delete_status_bit8      <= 1'b0 ;
2161
                delete_pci_err_cs_bit8  <= w_conf_data_in[8]  & !w_byte_en[1] ;
2162
                delete_wb_err_cs_bit8   <= 1'b0 ;
2163
                delete_isr_bit4                 <= 1'b0 ;
2164
                delete_isr_bit3                 <= 1'b0 ;
2165
                delete_isr_bit2                 <= 1'b0 ;
2166
                delete_isr_bit1                 <= 1'b0 ;
2167
        end
2168
        {1'b1, 4'b0010} :
2169
        begin
2170
                delete_status_bit15     <= 1'b0 ;
2171
                delete_status_bit14     <= 1'b0 ;
2172
                delete_status_bit13     <= 1'b0 ;
2173
                delete_status_bit12     <= 1'b0 ;
2174
                delete_status_bit11     <= 1'b0 ;
2175
                delete_status_bit8      <= 1'b0 ;
2176
                delete_pci_err_cs_bit8  <= 1'b0 ;
2177
                delete_wb_err_cs_bit8   <= w_conf_data_in[8]  & !w_byte_en[1] ;
2178
                delete_isr_bit4                 <= 1'b0 ;
2179
                delete_isr_bit3                 <= 1'b0 ;
2180
                delete_isr_bit2                 <= 1'b0 ;
2181
                delete_isr_bit1                 <= 1'b0 ;
2182
        end
2183
        {1'b1, 4'b0001} :
2184
        begin
2185
                delete_status_bit15     <= 1'b0 ;
2186
                delete_status_bit14     <= 1'b0 ;
2187
                delete_status_bit13     <= 1'b0 ;
2188
                delete_status_bit12     <= 1'b0 ;
2189
                delete_status_bit11     <= 1'b0 ;
2190
                delete_status_bit8      <= 1'b0 ;
2191
                delete_pci_err_cs_bit8  <= 1'b0 ;
2192
                delete_wb_err_cs_bit8   <= 1'b0 ;
2193
                delete_isr_bit4                 <= w_conf_data_in[4] & !w_byte_en[0] ;
2194
                delete_isr_bit3                 <= w_conf_data_in[3] & !w_byte_en[0] ;
2195
                delete_isr_bit2                 <= w_conf_data_in[2] & !w_byte_en[0] ;
2196
                delete_isr_bit1                 <= w_conf_data_in[1] & !w_byte_en[0] ;
2197
        end
2198
        default :
2199
        begin
2200
                delete_status_bit15     <= 1'b0 ;
2201
                delete_status_bit14     <= 1'b0 ;
2202
                delete_status_bit13     <= 1'b0 ;
2203
                delete_status_bit12     <= 1'b0 ;
2204
                delete_status_bit11     <= 1'b0 ;
2205
                delete_status_bit8      <= 1'b0 ;
2206
                delete_pci_err_cs_bit8  <= 1'b0 ;
2207
                delete_wb_err_cs_bit8   <= 1'b0 ;
2208
                delete_isr_bit4                 <= 1'b0 ;
2209
                delete_isr_bit3                 <= 1'b0 ;
2210
                delete_isr_bit2                 <= 1'b0 ;
2211
                delete_isr_bit1                 <= 1'b0 ;
2212
        end
2213
        endcase
2214
end
2215
 
2216
// STATUS BITS of PCI Header status register
2217
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
2218
        // Set and clear FF
2219
        always@(posedge pci_clk or posedge reset)
2220
        begin
2221
                if (reset) // Asynchronous reset
2222
                        status_bit15_11[15] <= 1'b0 ;
2223
                else
2224 2 mihad
                begin
2225 21 mihad
                        if (perr_in) // Synchronous set
2226
                                status_bit15_11[15] <= 1'b1 ;
2227
                        else if (delete_status_bit15) // Synchronous reset
2228
                                status_bit15_11[15] <= 1'b0 ;
2229
                end
2230
        end
2231
        // Set and clear FF
2232
        always@(posedge pci_clk or posedge reset)
2233
        begin
2234
                if (reset) // Asynchronous reset
2235
                        status_bit15_11[14] <= 1'b0 ;
2236
                else
2237
                begin
2238
                        if (serr_in) // Synchronous set
2239
                                status_bit15_11[14] <= 1'b1 ;
2240
                        else if (delete_status_bit14) // Synchronous reset
2241
                                status_bit15_11[14] <= 1'b0 ;
2242
                end
2243
        end
2244
        // Set and clear FF
2245
        always@(posedge pci_clk or posedge reset)
2246
        begin
2247
                if (reset) // Asynchronous reset
2248
                        status_bit15_11[13] <= 1'b0 ;
2249
                else
2250
                begin
2251
                        if (master_abort_recv) // Synchronous set
2252
                                status_bit15_11[13] <= 1'b1 ;
2253
                        else if (delete_status_bit13) // Synchronous reset
2254
                                status_bit15_11[13] <= 1'b0 ;
2255
                end
2256
        end
2257
        // Set and clear FF
2258
        always@(posedge pci_clk or posedge reset)
2259
        begin
2260
                if (reset) // Asynchronous reset
2261
                        status_bit15_11[12] <= 1'b0 ;
2262
                else
2263
                begin
2264
                        if (target_abort_recv) // Synchronous set
2265
                                status_bit15_11[12] <= 1'b1 ;
2266
                        else if (delete_status_bit12) // Synchronous reset
2267
                                status_bit15_11[12] <= 1'b0 ;
2268
                end
2269
        end
2270
        // Set and clear FF
2271
        always@(posedge pci_clk or posedge reset)
2272
        begin
2273
                if (reset) // Asynchronous reset
2274
                        status_bit15_11[11] <= 1'b0 ;
2275
                else
2276
                begin
2277
                        if (target_abort_set) // Synchronous set
2278
                                status_bit15_11[11] <= 1'b1 ;
2279
                        else if (delete_status_bit11) // Synchronous reset
2280
                                status_bit15_11[11] <= 1'b0 ;
2281
                end
2282
        end
2283
        // Set and clear FF
2284
        always@(posedge pci_clk or posedge reset)
2285
        begin
2286
                if (reset) // Asynchronous reset
2287
                        status_bit8 <= 1'b0 ;
2288
                else
2289
                begin
2290
                        if (master_data_par_err) // Synchronous set
2291
                                status_bit8 <= 1'b1 ;
2292
                        else if (delete_status_bit8) // Synchronous reset
2293
                                status_bit8 <= 1'b0 ;
2294
                end
2295
        end
2296
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
2297
  `ifdef HOST
2298
        reg             [15:11] set_status_bit15_11;
2299
        reg             set_status_bit8;
2300
        wire    delete_set_status_bit15;
2301
        wire    delete_set_status_bit14;
2302
        wire    delete_set_status_bit13;
2303
        wire    delete_set_status_bit12;
2304
        wire    delete_set_status_bit11;
2305
        wire    delete_set_status_bit8;
2306
        wire    block_set_status_bit15;
2307
        wire    block_set_status_bit14;
2308
        wire    block_set_status_bit13;
2309
        wire    block_set_status_bit12;
2310
        wire    block_set_status_bit11;
2311
        wire    block_set_status_bit8;
2312
        // Synchronization module for clearing FF between two clock domains
2313
        SYNC_MODULE                     sync_status_15
2314
        (
2315
                .set_clk_in             (pci_clk),
2316
                .delete_clk_in  (wb_clk),
2317
                .reset_in               (reset),
2318
                .delete_set_out (delete_set_status_bit15),
2319
                .block_set_out  (block_set_status_bit15),
2320
                .delete_in              (delete_status_bit15)
2321
        );
2322
        // Setting FF
2323
        always@(posedge pci_clk or posedge reset)
2324
        begin
2325
                if (reset) // Asynchronous reset
2326
                        set_status_bit15_11[15] <= 1'b0 ;
2327
                else
2328
                begin
2329
                        if (perr_in) // Synchronous set
2330
                                set_status_bit15_11[15] <= 1'b1 ;
2331
                        else if (delete_set_status_bit15) // Synchronous reset
2332
                                set_status_bit15_11[15] <= 1'b0 ;
2333
                end
2334
        end
2335
        // Synchronization module for clearing FF between two clock domains
2336
        SYNC_MODULE                     sync_status_14
2337
        (
2338
                .set_clk_in             (pci_clk),
2339
                .delete_clk_in  (wb_clk),
2340
                .reset_in               (reset),
2341
                .delete_set_out (delete_set_status_bit14),
2342
                .block_set_out  (block_set_status_bit14),
2343
                .delete_in              (delete_status_bit14)
2344
        );
2345
        // Setting FF
2346
        always@(posedge pci_clk or posedge reset)
2347
        begin
2348
                if (reset) // Asynchronous reset
2349
                        set_status_bit15_11[14] <= 1'b0 ;
2350
                else
2351
                begin
2352
                        if (serr_in) // Synchronous set
2353
                                set_status_bit15_11[14] <= 1'b1 ;
2354
                        else if (delete_set_status_bit14) // Synchronous reset
2355
                                set_status_bit15_11[14] <= 1'b0 ;
2356
                end
2357
        end
2358
        // Synchronization module for clearing FF between two clock domains
2359
        SYNC_MODULE                     sync_status_13
2360
        (
2361
                .set_clk_in             (pci_clk),
2362
                .delete_clk_in  (wb_clk),
2363
                .reset_in               (reset),
2364
                .delete_set_out (delete_set_status_bit13),
2365
                .block_set_out  (block_set_status_bit13),
2366
                .delete_in              (delete_status_bit13)
2367
        );
2368
        // Setting FF
2369
        always@(posedge pci_clk or posedge reset)
2370
        begin
2371
                if (reset) // Asynchronous reset
2372
                        set_status_bit15_11[13] <= 1'b0 ;
2373
                else
2374
                begin
2375
                        if (master_abort_recv) // Synchronous set
2376
                                set_status_bit15_11[13] <= 1'b1 ;
2377
                        else if (delete_set_status_bit13) // Synchronous reset
2378
                                set_status_bit15_11[13] <= 1'b0 ;
2379
                end
2380
        end
2381
        // Synchronization module for clearing FF between two clock domains
2382
        SYNC_MODULE                     sync_status_12
2383
        (
2384
                .set_clk_in             (pci_clk),
2385
                .delete_clk_in  (wb_clk),
2386
                .reset_in               (reset),
2387
                .delete_set_out (delete_set_status_bit12),
2388
                .block_set_out  (block_set_status_bit12),
2389
                .delete_in              (delete_status_bit12)
2390
        );
2391
        // Setting FF
2392
        always@(posedge pci_clk or posedge reset)
2393
        begin
2394
                if (reset) // Asynchronous reset
2395
                        set_status_bit15_11[12] <= 1'b0 ;
2396
                else
2397
                begin
2398
                        if (target_abort_recv) // Synchronous set
2399
                                set_status_bit15_11[12] <= 1'b1 ;
2400
                        else if (delete_set_status_bit12) // Synchronous reset
2401
                                set_status_bit15_11[12] <= 1'b0 ;
2402
                end
2403
        end
2404
        // Synchronization module for clearing FF between two clock domains
2405
        SYNC_MODULE                     sync_status_11
2406
        (
2407
                .set_clk_in             (pci_clk),
2408
                .delete_clk_in  (wb_clk),
2409
                .reset_in               (reset),
2410
                .delete_set_out (delete_set_status_bit11),
2411
                .block_set_out  (block_set_status_bit11),
2412
                .delete_in              (delete_status_bit11)
2413
        );
2414
        // Setting FF
2415
        always@(posedge pci_clk or posedge reset)
2416
        begin
2417
                if (reset) // Asynchronous reset
2418
                        set_status_bit15_11[11] <= 1'b0 ;
2419
                else
2420
                begin
2421
                        if (target_abort_set) // Synchronous set
2422
                                set_status_bit15_11[11] <= 1'b1 ;
2423
                        else if (delete_set_status_bit11) // Synchronous reset
2424
                                set_status_bit15_11[11] <= 1'b0 ;
2425
                end
2426
        end
2427
        // Synchronization module for clearing FF between two clock domains
2428
        SYNC_MODULE                     sync_status_8
2429
        (
2430
                .set_clk_in             (pci_clk),
2431
                .delete_clk_in  (wb_clk),
2432
                .reset_in               (reset),
2433
                .delete_set_out (delete_set_status_bit8),
2434
                .block_set_out  (block_set_status_bit8),
2435
                .delete_in              (delete_status_bit8)
2436
        );
2437
        // Setting FF
2438
        always@(posedge pci_clk or posedge reset)
2439
        begin
2440
                if (reset) // Asynchronous reset
2441
                        set_status_bit8 <= 1'b0 ;
2442
                else
2443
                begin
2444
                        if (master_data_par_err) // Synchronous set
2445
                                set_status_bit8 <= 1'b1 ;
2446
                        else if (delete_set_status_bit8) // Synchronous reset
2447
                                set_status_bit8 <= 1'b0 ;
2448
                end
2449
        end
2450
        wire [5:0] status_bits   =       {set_status_bit15_11[15] && !block_set_status_bit15,
2451
                                                                 set_status_bit15_11[14] && !block_set_status_bit14,
2452
                                                                 set_status_bit15_11[13] && !block_set_status_bit13,
2453
                                                                 set_status_bit15_11[12] && !block_set_status_bit12,
2454
                                                                 set_status_bit15_11[11] && !block_set_status_bit11,
2455
                                                                 set_status_bit8                 && !block_set_status_bit8      } ;
2456
        wire [5:0] meta_status_bits ;
2457
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
2458
        synchronizer_flop   #(6) status_bits_sync
2459
        (
2460
            .data_in        (status_bits),
2461
            .clk_out        (wb_clk),
2462
            .sync_data_out  (meta_status_bits),
2463
            .async_reset    (reset)
2464
        ) ;
2465
        always@(posedge wb_clk or posedge reset)
2466
        begin
2467
            if (reset)
2468
            begin
2469
                status_bit15_11[15:11]  <= 5'b0 ;
2470
                status_bit8                             <= 1'b0 ;
2471
            end
2472
            else
2473
            begin
2474
                status_bit15_11[15:11]  <= meta_status_bits[5:1] ;
2475
                status_bit8                             <= meta_status_bits[0] ;
2476
            end
2477
        end
2478
  `else // GUEST
2479
        // Set and clear FF
2480
        always@(posedge pci_clk or posedge reset)
2481
        begin
2482
                if (reset) // Asynchronous reset
2483
                        status_bit15_11[15] <= 1'b0 ;
2484
                else
2485
                begin
2486
                        if (perr_in) // Synchronous set
2487
                                status_bit15_11[15] <= 1'b1 ;
2488
                        else if (delete_status_bit15) // Synchronous reset
2489
                                status_bit15_11[15] <= 1'b0 ;
2490
                end
2491
        end
2492
        // Set and clear FF
2493
        always@(posedge pci_clk or posedge reset)
2494
        begin
2495
                if (reset) // Asynchronous reset
2496
                        status_bit15_11[14] <= 1'b0 ;
2497
                else
2498
                begin
2499
                        if (serr_in) // Synchronous set
2500
                                status_bit15_11[14] <= 1'b1 ;
2501
                        else if (delete_status_bit14) // Synchronous reset
2502
                                status_bit15_11[14] <= 1'b0 ;
2503
                end
2504
        end
2505
        // Set and clear FF
2506
        always@(posedge pci_clk or posedge reset)
2507
        begin
2508
                if (reset) // Asynchronous reset
2509
                        status_bit15_11[13] <= 1'b0 ;
2510
                else
2511
                begin
2512
                        if (master_abort_recv) // Synchronous set
2513
                                status_bit15_11[13] <= 1'b1 ;
2514
                        else if (delete_status_bit13) // Synchronous reset
2515
                                status_bit15_11[13] <= 1'b0 ;
2516
                end
2517
        end
2518
        // Set and clear FF
2519
        always@(posedge pci_clk or posedge reset)
2520
        begin
2521
                if (reset) // Asynchronous reset
2522
                        status_bit15_11[12] <= 1'b0 ;
2523
                else
2524
                begin
2525
                        if (target_abort_recv) // Synchronous set
2526
                                status_bit15_11[12] <= 1'b1 ;
2527
                        else if (delete_status_bit12) // Synchronous reset
2528
                                status_bit15_11[12] <= 1'b0 ;
2529
                end
2530
        end
2531
        // Set and clear FF
2532
        always@(posedge pci_clk or posedge reset)
2533
        begin
2534
                if (reset) // Asynchronous reset
2535
                        status_bit15_11[11] <= 1'b0 ;
2536
                else
2537
                begin
2538
                        if (target_abort_set) // Synchronous set
2539
                                status_bit15_11[11] <= 1'b1 ;
2540
                        else if (delete_status_bit11) // Synchronous reset
2541
                                status_bit15_11[11] <= 1'b0 ;
2542
                end
2543
        end
2544
        // Set and clear FF
2545
        always@(posedge pci_clk or posedge reset)
2546
        begin
2547
                if (reset) // Asynchronous reset
2548
                        status_bit8 <= 1'b0 ;
2549
                else
2550
                begin
2551
                        if (master_data_par_err) // Synchronous set
2552
                                status_bit8 <= 1'b1 ;
2553
                        else if (delete_status_bit8) // Synchronous reset
2554
                                status_bit8 <= 1'b0 ;
2555
                end
2556
        end
2557
  `endif
2558
`endif
2559
 
2560
// STATUS BITS of P_ERR_CS - PCI error control and status register
2561
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
2562
        // Set and clear FF
2563
        always@(posedge pci_clk or posedge reset)
2564
        begin
2565
                if (reset) // Asynchronous reset
2566
                        pci_err_cs_bit8 <= 1'b0 ;
2567
                else
2568
                begin
2569
                        if (pci_error_sig && pci_err_cs_bit0) // Synchronous set
2570
                                pci_err_cs_bit8 <= 1'b1 ;
2571
                        else if (delete_pci_err_cs_bit8) // Synchronous reset
2572
                                pci_err_cs_bit8 <= 1'b0 ;
2573
                end
2574
        end
2575
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
2576
  `ifdef HOST
2577
        // Set and clear FF
2578
        always@(posedge wb_clk or posedge reset)
2579
        begin
2580
                if (reset) // Asynchronous reset
2581
                        pci_err_cs_bit8 <= 1'b0 ;
2582
                else
2583
                begin
2584
                        if (pci_error_sig && pci_err_cs_bit0) // Synchronous set
2585
                                pci_err_cs_bit8 <= 1'b1 ;
2586
                        else if (delete_pci_err_cs_bit8) // Synchronous reset
2587
                                pci_err_cs_bit8 <= 1'b0 ;
2588
                end
2589
        end
2590
  `else // GUEST
2591
        reg             set_pci_err_cs_bit8;
2592
        wire    delete_set_pci_err_cs_bit8;
2593
        wire    block_set_pci_err_cs_bit8;
2594
        // Synchronization module for clearing FF between two clock domains
2595
        SYNC_MODULE                     sync_pci_err_cs_8
2596
        (
2597
                .set_clk_in             (wb_clk),
2598
                .delete_clk_in  (pci_clk),
2599
                .reset_in               (reset),
2600
                .delete_set_out (delete_set_pci_err_cs_bit8),
2601
                .block_set_out  (block_set_pci_err_cs_bit8),
2602
                .delete_in              (delete_pci_err_cs_bit8)
2603
        );
2604
        // Setting FF
2605
        always@(posedge wb_clk or posedge reset)
2606
        begin
2607
                if (reset) // Asynchronous reset
2608
                        set_pci_err_cs_bit8 <= 1'b0 ;
2609
                else
2610
                begin
2611
                        if (pci_error_sig && pci_err_cs_bit0) // Synchronous set
2612
                                set_pci_err_cs_bit8 <= 1'b1 ;
2613
                        else if (delete_set_pci_err_cs_bit8) // Synchronous reset
2614
                                set_pci_err_cs_bit8 <= 1'b0 ;
2615
                end
2616
        end
2617
        wire    pci_err_cs_bits = set_pci_err_cs_bit8 && !block_set_pci_err_cs_bit8 ;
2618
        wire    meta_pci_err_cs_bits ;
2619
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
2620
        synchronizer_flop   pci_err_cs_bits_sync
2621
        (
2622
            .data_in        (pci_err_cs_bits),
2623
            .clk_out        (pci_clk),
2624
            .sync_data_out  (meta_pci_err_cs_bits),
2625
            .async_reset    (reset)
2626
        ) ;
2627
        always@(posedge pci_clk or posedge reset)
2628
        begin
2629
            if (reset)
2630
                pci_err_cs_bit8 <= 1'b0 ;
2631
            else
2632
                pci_err_cs_bit8 <= meta_pci_err_cs_bits ;
2633
        end
2634
  `endif
2635
`endif
2636
        // Set and clear FF
2637
        always@(posedge wb_clk or posedge reset)
2638
        begin
2639
                if (reset) // Asynchronous reset
2640
                        pci_err_cs_bit10 <= 1'b0 ;
2641
                else
2642
                begin
2643
                        if (pci_error_sig) // Synchronous report
2644
                                pci_err_cs_bit10 <= pci_error_rty_exp ;
2645
                end
2646
        end
2647
        // Set and clear FF
2648
        always@(posedge wb_clk or posedge reset)
2649
        begin
2650
                if (reset) // Asynchronous reset
2651
                        pci_err_cs_bit9 <= 1'b0 ;
2652
                else
2653
                begin
2654
                        if (pci_error_sig) // Synchronous report
2655
                                pci_err_cs_bit9 <= pci_error_es ;
2656
                end
2657
        end
2658
        // Set and clear FF
2659
        always@(posedge wb_clk or posedge reset)
2660
        begin
2661
                if (reset) // Asynchronous reset
2662
            begin
2663
                        pci_err_cs_bit31_24 <= 8'h00 ;
2664
                        pci_err_addr <= 32'h0000_0000 ;
2665
                        pci_err_data <= 32'h0000_0000 ;
2666
            end
2667
                else
2668
                        if (pci_error_sig) // Synchronous report
2669 2 mihad
                        begin
2670 21 mihad
                                pci_err_cs_bit31_24 <= { pci_error_be, pci_error_bc } ;
2671
                                pci_err_addr <= pci_error_addr ;
2672
                                pci_err_data <= pci_error_data ;
2673 2 mihad
                        end
2674 21 mihad
        end
2675
 
2676
// STATUS BITS of W_ERR_CS - WB error control and status register
2677
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
2678
        // Set and clear FF
2679
        always@(posedge pci_clk or posedge reset)
2680
        begin
2681
                if (reset) // Asynchronous reset
2682
                        wb_err_cs_bit8 <= 1'b0 ;
2683
                else
2684
                begin
2685
                        if (wb_error_sig && wb_err_cs_bit0) // Synchronous set
2686
                                wb_err_cs_bit8 <= 1'b1 ;
2687
                        else if (delete_wb_err_cs_bit8) // Synchronous reset
2688
                                wb_err_cs_bit8 <= 1'b0 ;
2689 2 mihad
                end
2690 21 mihad
        end
2691
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
2692
  `ifdef HOST
2693
        reg             set_wb_err_cs_bit8;
2694
        wire    delete_set_wb_err_cs_bit8;
2695
        wire    block_set_wb_err_cs_bit8;
2696
        // Synchronization module for clearing FF between two clock domains
2697
        SYNC_MODULE                     sync_wb_err_cs_8
2698
        (
2699
                .set_clk_in             (pci_clk),
2700
                .delete_clk_in  (wb_clk),
2701
                .reset_in               (reset),
2702
                .delete_set_out (delete_set_wb_err_cs_bit8),
2703
                .block_set_out  (block_set_wb_err_cs_bit8),
2704
                .delete_in              (delete_wb_err_cs_bit8)
2705
        );
2706
        // Setting FF
2707
        always@(posedge pci_clk or posedge reset)
2708
        begin
2709
                if (reset) // Asynchronous reset
2710
                        set_wb_err_cs_bit8 <= 1'b0 ;
2711
                else
2712 2 mihad
                begin
2713 21 mihad
                        if (wb_error_sig && wb_err_cs_bit0) // Synchronous set
2714
                                set_wb_err_cs_bit8 <= 1'b1 ;
2715
                        else if (delete_set_wb_err_cs_bit8) // Synchronous reset
2716
                                set_wb_err_cs_bit8 <= 1'b0 ;
2717
                end
2718
        end
2719
        wire    wb_err_cs_bits = set_wb_err_cs_bit8 && !block_set_wb_err_cs_bit8 ;
2720
        wire    meta_wb_err_cs_bits ;
2721
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
2722
        synchronizer_flop   wb_err_cs_bits_sync
2723
        (
2724
            .data_in        (wb_err_cs_bits),
2725
            .clk_out        (wb_clk),
2726
            .sync_data_out  (meta_wb_err_cs_bits),
2727
            .async_reset    (reset)
2728
        ) ;
2729
        always@(posedge wb_clk or posedge reset)
2730
        begin
2731
            if (reset)
2732
                wb_err_cs_bit8  <= 1'b0 ;
2733
            else
2734
                wb_err_cs_bit8  <= meta_wb_err_cs_bits ;
2735
        end
2736
  `else // GUEST
2737
        // Set and clear FF
2738
        always@(posedge pci_clk or posedge reset)
2739
        begin
2740
                if (reset) // Asynchronous reset
2741
                        wb_err_cs_bit8 <= 1'b0 ;
2742
                else
2743
                begin
2744
                        if (wb_error_sig && wb_err_cs_bit0) // Synchronous set
2745
                                wb_err_cs_bit8 <= 1'b1 ;
2746
                        else if (delete_wb_err_cs_bit8) // Synchronous reset
2747
                                wb_err_cs_bit8 <= 1'b0 ;
2748
                end
2749
        end
2750
  `endif
2751
`endif
2752
/*      // Set and clear FF
2753
        always@(posedge pci_clk or posedge reset)
2754
        begin
2755
                if (reset) // Asynchronous reset
2756
                        wb_err_cs_bit10 <= 1'b0 ;
2757
                else
2758
                begin
2759
                        if (wb_error_sig) // Synchronous report
2760
                                wb_err_cs_bit10 <= wb_error_rty_exp ;
2761
                end
2762
        end */
2763
        // Set and clear FF
2764
        always@(posedge pci_clk or posedge reset)
2765
        begin
2766
                if (reset) // Asynchronous reset
2767
                        wb_err_cs_bit9 <= 1'b0 ;
2768
                else
2769
                begin
2770
                        if (wb_error_sig) // Synchronous report
2771
                                wb_err_cs_bit9 <= wb_error_es ;
2772
                end
2773
        end
2774
        // Set and clear FF
2775
        always@(posedge pci_clk or posedge reset)
2776
        begin
2777
                if (reset) // Asynchronous reset
2778
            begin
2779
                        wb_err_cs_bit31_24 <= 8'h00 ;
2780
                        wb_err_addr <= 32'h0000_0000 ;
2781
                        wb_err_data <= 32'h0000_0000 ;
2782
            end
2783
                else
2784
                        if (wb_error_sig)
2785 2 mihad
                        begin
2786 21 mihad
                                wb_err_cs_bit31_24 <= { wb_error_be, wb_error_bc } ;
2787
                                wb_err_addr <= wb_error_addr ;
2788
                                wb_err_data <= wb_error_data ;
2789 2 mihad
                        end
2790
        end
2791
 
2792 21 mihad
// SERR_INT and PERR_INT STATUS BITS of ISR - interrupt status register
2793
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
2794
  `ifdef HOST
2795
        // Set and clear FF
2796
        always@(posedge pci_clk or posedge reset)
2797
        begin
2798
                if (reset) // Asynchronous reset
2799
                        isr_bit4_3[4] <= 1'b0 ;
2800
                else
2801 2 mihad
                begin
2802 21 mihad
                        if (isr_sys_err_int && icr_bit4_3[4]) // Synchronous set
2803
                                isr_bit4_3[4] <= 1'b1 ;
2804
                        else if (delete_isr_bit4) // Synchronous reset
2805
                                isr_bit4_3[4] <= 1'b0 ;
2806 2 mihad
                end
2807 21 mihad
        end
2808
        // Set and clear FF
2809
        always@(posedge pci_clk or posedge reset)
2810
        begin
2811
                if (reset) // Asynchronous reset
2812
                        isr_bit4_3[3] <= 1'b0 ;
2813
                else
2814
                begin
2815
                        if (isr_par_err_int && icr_bit4_3[3]) // Synchronous set
2816
                                isr_bit4_3[3] <= 1'b1 ;
2817
                        else if (delete_isr_bit3) // Synchronous reset
2818
                                isr_bit4_3[3] <= 1'b0 ;
2819
                end
2820
        end
2821
  `endif
2822
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
2823
  `ifdef HOST
2824
        reg             [4:3]   set_isr_bit4_3;
2825
        wire    delete_set_isr_bit4;
2826
        wire    delete_set_isr_bit3;
2827
        wire    block_set_isr_bit4;
2828
        wire    block_set_isr_bit3;
2829
        // Synchronization module for clearing FF between two clock domains
2830
        SYNC_MODULE                     sync_isr_4
2831
        (
2832
                .set_clk_in             (pci_clk),
2833
                .delete_clk_in  (wb_clk),
2834
                .reset_in               (reset),
2835
                .delete_set_out (delete_set_isr_bit4),
2836
                .block_set_out  (block_set_isr_bit4),
2837
                .delete_in              (delete_isr_bit4)
2838
        );
2839
        // Setting FF
2840
        always@(posedge pci_clk or posedge reset)
2841
        begin
2842
                if (reset) // Asynchronous reset
2843
                        set_isr_bit4_3[4] <= 1'b0 ;
2844
                else
2845
                begin
2846
                        if (isr_sys_err_int && icr_bit4_3[4]) // Synchronous set
2847
                                set_isr_bit4_3[4] <= 1'b1 ;
2848
                        else if (delete_set_isr_bit4) // Synchronous reset
2849
                                set_isr_bit4_3[4] <= 1'b0 ;
2850
                end
2851
        end
2852
        // Synchronization module for clearing FF between two clock domains
2853
        SYNC_MODULE                     sync_isr_3
2854
        (
2855
                .set_clk_in             (pci_clk),
2856
                .delete_clk_in  (wb_clk),
2857
                .reset_in               (reset),
2858
                .delete_set_out (delete_set_isr_bit3),
2859
                .block_set_out  (block_set_isr_bit3),
2860
                .delete_in              (delete_isr_bit3)
2861
        );
2862
        // Setting FF
2863
        always@(posedge pci_clk or posedge reset)
2864
        begin
2865
                if (reset) // Asynchronous reset
2866
                        set_isr_bit4_3[3] <= 1'b0 ;
2867
                else
2868
                begin
2869
                        if (isr_par_err_int && icr_bit4_3[3]) // Synchronous set
2870
                                set_isr_bit4_3[3] <= 1'b1 ;
2871
                        else if (delete_set_isr_bit3) // Synchronous reset
2872
                                set_isr_bit4_3[3] <= 1'b0 ;
2873
                end
2874
        end
2875
        wire [4:3] isr_bits4_3  =       {set_isr_bit4_3[4] && !block_set_isr_bit4,
2876
                                                                 set_isr_bit4_3[3] && !block_set_isr_bit3       } ;
2877
        wire [4:3] meta_isr_bits4_3 ;
2878
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
2879
        synchronizer_flop   #(2) isr_bits_sync
2880
        (
2881
            .data_in        (isr_bits4_3),
2882
            .clk_out        (wb_clk),
2883
            .sync_data_out  (meta_isr_bits4_3),
2884
            .async_reset    (reset)
2885
        ) ;
2886
        always@(posedge wb_clk or posedge reset)
2887
        begin
2888
            if (reset)
2889
                isr_bit4_3[4:3] <= 2'b0 ;
2890
            else
2891
                isr_bit4_3[4:3] <= meta_isr_bits4_3[4:3] ;
2892
        end
2893
  `endif
2894
`endif
2895 2 mihad
 
2896 21 mihad
// PCI_EINT and WB_EINT STATUS BITS of ISR - interrupt status register
2897
`ifdef SYNCHRONEOUS_CLOCK_DOMAINS
2898
  // WB_EINT STATUS BIT
2899
        // Set and clear FF
2900
        always@(posedge pci_clk or posedge reset)
2901
        begin
2902
                if (reset) // Asynchronous reset
2903
                        isr_bit2_0[1] <= 1'b0 ;
2904
                else
2905 2 mihad
                begin
2906 21 mihad
                        if (wb_error_sig && icr_bit2_0[1] && wb_err_cs_bit0) // Synchronous set
2907
                                isr_bit2_0[1] <= 1'b1 ;
2908
                        else if (delete_isr_bit1) // Synchronous reset
2909
                                isr_bit2_0[1] <= 1'b0 ;
2910 2 mihad
                end
2911 21 mihad
        end
2912
  // PCI_EINT STATUS BIT
2913
        // Set and clear FF
2914
        always@(posedge pci_clk or posedge reset)
2915
        begin
2916
                if (reset) // Asynchronous reset
2917
                        isr_bit2_0[2] <= 1'b0 ;
2918
                else
2919
                begin
2920
                        if (pci_error_sig && icr_bit2_0[2] && pci_err_cs_bit0) // Synchronous set
2921
                                isr_bit2_0[2] <= 1'b1 ;
2922
                        else if (delete_isr_bit2) // Synchronous reset
2923
                                isr_bit2_0[2] <= 1'b0 ;
2924
                end
2925
        end
2926
`else // not SYNCHRONEOUS_CLOCK_DOMAINS
2927
  `ifdef HOST
2928
  // WB_EINT STATUS BIT
2929
        reg             set_isr_bit1;
2930
        wire    delete_set_isr_bit1;
2931
        wire    block_set_isr_bit1;
2932
        // Synchronization module for clearing FF between two clock domains
2933
        SYNC_MODULE                     sync_isr_1
2934
        (
2935
                .set_clk_in             (pci_clk),
2936
                .delete_clk_in  (wb_clk),
2937
                .reset_in               (reset),
2938
                .delete_set_out (delete_set_isr_bit1),
2939
                .block_set_out  (block_set_isr_bit1),
2940
                .delete_in              (delete_isr_bit1)
2941
        );
2942
        // Setting FF
2943
        always@(posedge pci_clk or posedge reset)
2944
        begin
2945
                if (reset) // Asynchronous reset
2946
                        set_isr_bit1 <= 1'b0 ;
2947
                else
2948
                begin
2949
                        if (wb_error_sig && icr_bit2_0[1] && wb_err_cs_bit0) // Synchronous set
2950
                                set_isr_bit1 <= 1'b1 ;
2951
                        else if (delete_set_isr_bit1) // Synchronous reset
2952
                                set_isr_bit1 <= 1'b0 ;
2953
                end
2954
        end
2955
        wire    isr_bit1        = set_isr_bit1 && !block_set_isr_bit1 ;
2956
        wire    meta_isr_bit1 ;
2957
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
2958
        synchronizer_flop   isr_bit1_sync
2959
        (
2960
            .data_in        (isr_bit1),
2961
            .clk_out        (wb_clk),
2962
            .sync_data_out  (meta_isr_bit1),
2963
            .async_reset    (reset)
2964
        ) ;
2965
        always@(posedge wb_clk or posedge reset)
2966
        begin
2967
            if (reset)
2968
                isr_bit2_0[1]   <= 1'b0 ;
2969
            else
2970
                isr_bit2_0[1]   <= meta_isr_bit1 ;
2971
        end
2972
  // PCI_EINT STATUS BIT
2973
        // Set and clear FF
2974
        always@(posedge wb_clk or posedge reset)
2975
        begin
2976
                if (reset) // Asynchronous reset
2977
                        isr_bit2_0[2] <= 1'b0 ;
2978
                else
2979
                begin
2980
                        if (pci_error_sig && icr_bit2_0[2] && pci_err_cs_bit0) // Synchronous set
2981
                                isr_bit2_0[2] <= 1'b1 ;
2982
                        else if (delete_isr_bit2) // Synchronous reset
2983
                                isr_bit2_0[2] <= 1'b0 ;
2984
                end
2985
        end
2986
  `else // GUEST
2987
  // WB_EINT STATUS BIT
2988
        // Set and clear FF
2989
        always@(posedge pci_clk or posedge reset)
2990
        begin
2991
                if (reset) // Asynchronous reset
2992
                        isr_bit2_0[1] <= 1'b0 ;
2993
                else
2994
                begin
2995
                        if (wb_error_sig && icr_bit2_0[1] && wb_err_cs_bit0) // Synchronous set
2996
                                isr_bit2_0[1] <= 1'b1 ;
2997
                        else if (delete_isr_bit1) // Synchronous reset
2998
                                isr_bit2_0[1] <= 1'b0 ;
2999
                end
3000
        end
3001
  // PCI_EINT STATUS BIT
3002
        reg             set_isr_bit2;
3003
        wire    delete_set_isr_bit2;
3004
        wire    block_set_isr_bit2;
3005
        // Synchronization module for clearing FF between two clock domains
3006
        SYNC_MODULE                     sync_isr_2
3007
        (
3008
                .set_clk_in             (wb_clk),
3009
                .delete_clk_in  (pci_clk),
3010
                .reset_in               (reset),
3011
                .delete_set_out (delete_set_isr_bit2),
3012
                .block_set_out  (block_set_isr_bit2),
3013
                .delete_in              (delete_isr_bit2)
3014
        );
3015
        // Setting FF
3016
        always@(posedge wb_clk or posedge reset)
3017
        begin
3018
                if (reset) // Asynchronous reset
3019
                        set_isr_bit2 <= 1'b0 ;
3020
                else
3021
                begin
3022
                        if (pci_error_sig && icr_bit2_0[2] && pci_err_cs_bit0) // Synchronous set
3023
                                set_isr_bit2 <= 1'b1 ;
3024
                        else if (delete_set_isr_bit2) // Synchronous reset
3025
                                set_isr_bit2 <= 1'b0 ;
3026
                end
3027
        end
3028
        wire    isr_bit2        = set_isr_bit2 && !block_set_isr_bit2 ;
3029
        wire    meta_isr_bit2 ;
3030
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3031
        synchronizer_flop   isr_bit2_sync
3032
        (
3033
            .data_in        (isr_bit2),
3034
            .clk_out        (pci_clk),
3035
            .sync_data_out  (meta_isr_bit2),
3036
            .async_reset    (reset)
3037
        ) ;
3038
        always@(posedge pci_clk or posedge reset)
3039
        begin
3040
            if (reset)
3041
                isr_bit2_0[2]   <= 1'b0 ;
3042
            else
3043
                isr_bit2_0[2]   <= meta_isr_bit2 ;
3044
        end
3045
  `endif
3046
`endif
3047 2 mihad
 
3048 21 mihad
// INT BIT of ISR - interrupt status register
3049
`ifdef HOST
3050
        wire    isr_int_prop_bit = isr_int_prop && icr_bit2_0[0] ;
3051
        wire    meta_isr_int_prop_bit ;
3052
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3053
        synchronizer_flop   isr_bit0_sync
3054
        (
3055
            .data_in        (isr_int_prop_bit),
3056
            .clk_out        (wb_clk),
3057
            .sync_data_out  (meta_isr_int_prop_bit),
3058
            .async_reset    (reset)
3059
        ) ;
3060
        always@(posedge wb_clk or posedge reset)
3061
        begin
3062
            if (reset)
3063
                isr_bit2_0[0]    <= 1'b0 ;
3064
            else
3065
                isr_bit2_0[0]    <= meta_isr_int_prop_bit ;
3066
        end
3067
`else // GUEST
3068
  `ifdef SYNCHRONEOUS_CLOCK_DOMAINS
3069
        wire    isr_int_prop_bit = isr_int_prop && icr_bit2_0[0] ;
3070
        always@(posedge pci_clk or posedge reset)
3071
        begin
3072
            if (reset)
3073
                isr_bit2_0[0]    <= 1'b0 ;
3074
            else
3075
                isr_bit2_0[0]    <= isr_int_prop_bit ;
3076
        end
3077
  `else // not SYNCHRONEOUS_CLOCK_DOMAINS
3078
        wire    isr_int_prop_bit = isr_int_prop && icr_bit2_0[0] ;
3079
        wire    meta_isr_int_prop_bit ;
3080
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3081
        synchronizer_flop   isr_bit0_sync
3082
        (
3083
            .data_in        (isr_int_prop_bit),
3084
            .clk_out        (pci_clk),
3085
            .sync_data_out  (meta_isr_int_prop_bit),
3086
            .async_reset    (reset)
3087
        ) ;
3088
        always@(posedge pci_clk or posedge reset)
3089
        begin
3090
            if (reset)
3091
                isr_bit2_0[0]    <= 1'b0 ;
3092
            else
3093
                isr_bit2_0[0]    <= meta_isr_int_prop_bit ;
3094
        end
3095
  `endif
3096
`endif
3097 2 mihad
 
3098 21 mihad
// INT PIN
3099
wire    int_in;
3100
wire    int_meta;
3101
reg             interrupt_out;
3102
`ifdef HOST
3103
 `ifdef SYNCHRONEOUS_CLOCK_DOMAINS
3104
        assign  int_in = isr_int_prop_bit || isr_bit2_0[1] || isr_bit2_0[2] || isr_bit4_3[3]  || isr_bit4_3[4];
3105
 `else // not SYNCHRONEOUS_CLOCK_DOMAINS
3106
        assign  int_in = isr_int_prop_bit || isr_bit1      || isr_bit2_0[2] || isr_bits4_3[3] || isr_bits4_3[4];
3107
 `endif
3108
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3109
        synchronizer_flop   int_pin_sync
3110
        (
3111
            .data_in        (int_in),
3112
            .clk_out        (wb_clk),
3113
            .sync_data_out  (int_meta),
3114
            .async_reset    (reset)
3115
        ) ;
3116
        always@(posedge wb_clk or posedge reset)
3117
        begin
3118
            if (reset)
3119
                interrupt_out   <= 1'b0 ;
3120
            else
3121
                interrupt_out   <= int_meta ;
3122
        end
3123
`else // GUEST
3124
 `ifdef SYNCHRONEOUS_CLOCK_DOMAINS
3125
        assign  int_in = isr_int_prop_bit || isr_bit2_0[1] || isr_bit2_0[2];
3126
 `else // not SYNCHRONEOUS_CLOCK_DOMAINS
3127
        assign  int_in = isr_int_prop_bit || isr_bit2_0[1] || isr_bit2;
3128
 `endif
3129
        // interemediate stage to clk synchronization flip - flops - this ones are prone to metastability
3130
        synchronizer_flop   int_pin_sync
3131
        (
3132
            .data_in        (int_in),
3133
            .clk_out        (pci_clk),
3134
            .sync_data_out  (int_meta),
3135
            .async_reset    (reset)
3136
        ) ;
3137
        always@(posedge pci_clk or posedge reset)
3138
        begin
3139
            if (reset)
3140
                interrupt_out   <= 1'b0 ;
3141
            else
3142
                interrupt_out   <= int_meta ;
3143
        end
3144
`endif
3145 2 mihad
 
3146
/*-----------------------------------------------------------------------------------------------------------
3147 21 mihad
        OUTPUTs from registers !!!
3148 2 mihad
-----------------------------------------------------------------------------------------------------------*/
3149 21 mihad
 
3150
// if bridge is HOST then write clock is equal to WB clock, and synchronization of outputs has to be done
3151
`ifdef  HOST
3152
  wire [3:0] command_bits = {command_bit8, command_bit6, command_bit2_0[1:0]} ;
3153
  wire [3:0] meta_command_bits ;
3154
  reg  [3:0] sync_command_bits ;
3155
  synchronizer_flop   #(4)  command_bits_sync
3156
  (
3157
      .data_in        (command_bits),
3158
      .clk_out        (pci_clk),
3159
      .sync_data_out  (meta_command_bits),
3160
      .async_reset    (reset)
3161
  ) ;
3162
  always@(posedge pci_clk or posedge reset)
3163
  begin
3164
      if (reset)
3165
          sync_command_bits <= 4'b0 ;
3166
      else
3167
          sync_command_bits <= meta_command_bits ;
3168
  end
3169
  wire  sync_command_bit8 = sync_command_bits[3] ;
3170
  wire  sync_command_bit6 = sync_command_bits[2] ;
3171
  wire  sync_command_bit1 = sync_command_bits[1] ;
3172
  wire  sync_command_bit0 = sync_command_bits[0] ;
3173
  wire  sync_command_bit2 = command_bit2_0[2] ;
3174
`else   // GUEST
3175
  wire       command_bit = command_bit2_0[2] ;
3176
  wire       meta_command_bit ;
3177
  reg        sync_command_bit ;
3178
  synchronizer_flop   command_bit_sync
3179
  (
3180
      .data_in        (command_bit),
3181
      .clk_out        (pci_clk),
3182
      .sync_data_out  (meta_command_bit),
3183
      .async_reset    (reset)
3184
  ) ;
3185
  always@(posedge pci_clk or posedge reset)
3186
  begin
3187
      if (reset)
3188
          sync_command_bit <= 1'b0 ;
3189
      else
3190
          sync_command_bit <= meta_command_bit ;
3191
  end
3192
  wire  sync_command_bit8 = command_bit8 ;
3193
  wire  sync_command_bit6 = command_bit6 ;
3194
  wire  sync_command_bit1 = command_bit2_0[1] ;
3195
  wire  sync_command_bit0 = command_bit2_0[0] ;
3196
  wire  sync_command_bit2 = sync_command_bit ;
3197
`endif
3198 2 mihad
// PCI header outputs from command register
3199 21 mihad
assign          serr_enable = sync_command_bit8 ;                                       // to PCI clock
3200
assign          perr_response = sync_command_bit6 ;                     // to PCI clock
3201
assign          pci_master_enable = sync_command_bit2 ;                 // to WB clock
3202
assign          memory_space_enable = sync_command_bit1 ;                       // to PCI clock
3203
assign          io_space_enable = sync_command_bit0 ;                           // to PCI clock
3204
 
3205
// if bridge is HOST then write clock is equal to WB clock, and synchronization of outputs has to be done
3206
        // We don't support cache line sizes smaller that 4 and it must have last two bits zero!!!
3207
wire    cache_lsize_not_zero = ((cache_line_size_reg[7] || cache_line_size_reg[6] || cache_line_size_reg[5] ||
3208
                                                                 cache_line_size_reg[4] || cache_line_size_reg[3] || cache_line_size_reg[2]) &&
3209
                                                                (!cache_line_size_reg[1] && !cache_line_size_reg[0]) );
3210
`ifdef  HOST
3211
  wire [7:2] cache_lsize_to_pci_bits = { cache_line_size_reg[7:2] } ;
3212
  wire [7:2] meta_cache_lsize_to_pci_bits ;
3213
  reg  [7:2] sync_cache_lsize_to_pci_bits ;
3214
  synchronizer_flop   #(6)  cache_lsize_to_pci_bits_sync
3215
  (
3216
      .data_in        (cache_lsize_to_pci_bits),
3217
      .clk_out        (pci_clk),
3218
      .sync_data_out  (meta_cache_lsize_to_pci_bits),
3219
      .async_reset    (reset)
3220
  ) ;
3221
  always@(posedge pci_clk or posedge reset)
3222
  begin
3223
      if (reset)
3224
          sync_cache_lsize_to_pci_bits <= 6'b0 ;
3225
      else
3226
          sync_cache_lsize_to_pci_bits <= meta_cache_lsize_to_pci_bits ;
3227
  end
3228
  wire [7:2] sync_cache_line_size_to_pci_reg    = sync_cache_lsize_to_pci_bits[7:2] ;
3229
  wire [7:2] sync_cache_line_size_to_wb_reg             = cache_line_size_reg[7:2] ;
3230
  wire           sync_cache_lsize_not_zero_to_wb        = cache_lsize_not_zero ;
3231
// Latency timer is sinchronized only to PCI clock when bridge implementation is HOST
3232
  wire [7:0] latency_timer_bits = latency_timer ;
3233
  wire [7:0] meta_latency_timer_bits ;
3234
  reg  [7:0] sync_latency_timer_bits ;
3235
  synchronizer_flop   #(8)  latency_timer_bits_sync
3236
  (
3237
      .data_in        (latency_timer_bits),
3238
      .clk_out        (pci_clk),
3239
      .sync_data_out  (meta_latency_timer_bits),
3240
      .async_reset    (reset)
3241
  ) ;
3242
  always@(posedge pci_clk or posedge reset)
3243
  begin
3244
      if (reset)
3245
          sync_latency_timer_bits <= 8'b0 ;
3246
      else
3247
          sync_latency_timer_bits <= meta_latency_timer_bits ;
3248
  end
3249
  wire [7:0] sync_latency_timer = sync_latency_timer_bits ;
3250
`else   // GUEST
3251
  wire [8:2] cache_lsize_to_wb_bits = { cache_lsize_not_zero, cache_line_size_reg[7:2] } ;
3252
  wire [8:2] meta_cache_lsize_to_wb_bits ;
3253
  reg  [8:2] sync_cache_lsize_to_wb_bits ;
3254
  synchronizer_flop   #(7)  cache_lsize_to_wb_bits_sync
3255
  (
3256
      .data_in        (cache_lsize_to_wb_bits),
3257
      .clk_out        (wb_clk),
3258
      .sync_data_out  (meta_cache_lsize_to_wb_bits),
3259
      .async_reset    (reset)
3260
  ) ;
3261
  always@(posedge wb_clk or posedge reset)
3262
  begin
3263
      if (reset)
3264
          sync_cache_lsize_to_wb_bits <= 7'b0 ;
3265
      else
3266
          sync_cache_lsize_to_wb_bits <= meta_cache_lsize_to_wb_bits ;
3267
  end
3268
  wire [7:2] sync_cache_line_size_to_pci_reg    = cache_line_size_reg[7:2] ;
3269
  wire [7:2] sync_cache_line_size_to_wb_reg             = sync_cache_lsize_to_wb_bits[7:2] ;
3270
  wire           sync_cache_lsize_not_zero_to_wb        = sync_cache_lsize_to_wb_bits[8] ;
3271
// Latency timer
3272
  wire [7:0] sync_latency_timer = latency_timer ;
3273
`endif
3274 2 mihad
// PCI header output from cache_line_size, latency timer and interrupt pin
3275 21 mihad
assign          cache_line_size_to_pci          = {sync_cache_line_size_to_pci_reg, 2'h0} ;  // [7 : 0] to PCI clock
3276
assign          cache_line_size_to_wb           = {sync_cache_line_size_to_wb_reg, 2'h0} ;   // [7 : 0] to WB clock
3277
assign          cache_lsize_not_zero_to_wb      = sync_cache_lsize_not_zero_to_wb ;
3278
 
3279
assign          latency_tim[7 : 0]     = sync_latency_timer ;                    // to PCI clock
3280
//assign                int_pin[2 : 0]         = r_interrupt_pin ;
3281
assign          int_out                            = interrupt_out ;
3282 2 mihad
// PCI output from image registers
3283 21 mihad
//   base address, address mask, translation address and control registers are sinchronized in PCI_DECODER.V module
3284
assign          pci_base_addr0 = pci_ba0_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3285
assign          pci_base_addr1 = pci_ba1_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3286
assign          pci_base_addr2 = pci_ba2_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3287
assign          pci_base_addr3 = pci_ba3_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3288
assign          pci_base_addr4 = pci_ba4_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3289
assign          pci_base_addr5 = pci_ba5_bit31_12[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3290 2 mihad
assign          pci_memory_io0 = pci_ba0_bit0 ;
3291
assign          pci_memory_io1 = pci_ba1_bit0 ;
3292
assign          pci_memory_io2 = pci_ba2_bit0 ;
3293
assign          pci_memory_io3 = pci_ba3_bit0 ;
3294
assign          pci_memory_io4 = pci_ba4_bit0 ;
3295
assign          pci_memory_io5 = pci_ba5_bit0 ;
3296 21 mihad
assign          pci_addr_mask0 = pci_am0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3297
assign          pci_addr_mask1 = pci_am1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3298
assign          pci_addr_mask2 = pci_am2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3299
assign          pci_addr_mask3 = pci_am3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3300
assign          pci_addr_mask4 = pci_am4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3301
assign          pci_addr_mask5 = pci_am5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3302
assign          pci_tran_addr0 = pci_ta0[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3303
assign          pci_tran_addr1 = pci_ta1[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3304
assign          pci_tran_addr2 = pci_ta2[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3305
assign          pci_tran_addr3 = pci_ta3[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3306
assign          pci_tran_addr4 = pci_ta4[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3307
assign          pci_tran_addr5 = pci_ta5[31:(32-`PCI_NUM_OF_DEC_ADDR_LINES)] ;
3308
assign          pci_img_ctrl0[2 : 1] = pci_img_ctrl0_bit2_1 ;
3309
assign          pci_img_ctrl1[2 : 1] = pci_img_ctrl1_bit2_1 ;
3310
assign          pci_img_ctrl2[2 : 1] = pci_img_ctrl2_bit2_1 ;
3311
assign          pci_img_ctrl3[2 : 1] = pci_img_ctrl3_bit2_1 ;
3312
assign          pci_img_ctrl4[2 : 1] = pci_img_ctrl4_bit2_1 ;
3313
assign          pci_img_ctrl5[2 : 1] = pci_img_ctrl5_bit2_1 ;
3314 2 mihad
// WISHBONE output from image registers
3315 21 mihad
//   base address, address mask, translation address and control registers are sinchronized in DECODER.V module
3316
assign          wb_base_addr0 = wb_ba0_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3317
assign          wb_base_addr1 = wb_ba1_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3318
assign          wb_base_addr2 = wb_ba2_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3319
assign          wb_base_addr3 = wb_ba3_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3320
assign          wb_base_addr4 = wb_ba4_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3321
assign          wb_base_addr5 = wb_ba5_bit31_12[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3322 2 mihad
assign          wb_memory_io0 = wb_ba0_bit0 ;
3323
assign          wb_memory_io1 = wb_ba1_bit0 ;
3324
assign          wb_memory_io2 = wb_ba2_bit0 ;
3325
assign          wb_memory_io3 = wb_ba3_bit0 ;
3326
assign          wb_memory_io4 = wb_ba4_bit0 ;
3327
assign          wb_memory_io5 = wb_ba5_bit0 ;
3328 21 mihad
assign          wb_addr_mask0 = wb_am0[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3329
assign          wb_addr_mask1 = wb_am1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3330
assign          wb_addr_mask2 = wb_am2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3331
assign          wb_addr_mask3 = wb_am3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3332
assign          wb_addr_mask4 = wb_am4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3333
assign          wb_addr_mask5 = wb_am5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3334
assign          wb_tran_addr0 = wb_ta0[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3335
assign          wb_tran_addr1 = wb_ta1[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3336
assign          wb_tran_addr2 = wb_ta2[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3337
assign          wb_tran_addr3 = wb_ta3[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3338
assign          wb_tran_addr4 = wb_ta4[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3339
assign          wb_tran_addr5 = wb_ta5[31:(32-`WB_NUM_OF_DEC_ADDR_LINES)] ;
3340
assign          wb_img_ctrl0[2 : 0] = wb_img_ctrl0_bit2_0 ;
3341
assign          wb_img_ctrl1[2 : 0] = wb_img_ctrl1_bit2_0 ;
3342
assign          wb_img_ctrl2[2 : 0] = wb_img_ctrl2_bit2_0 ;
3343
assign          wb_img_ctrl3[2 : 0] = wb_img_ctrl3_bit2_0 ;
3344
assign          wb_img_ctrl4[2 : 0] = wb_img_ctrl4_bit2_0 ;
3345
assign          wb_img_ctrl5[2 : 0] = wb_img_ctrl5_bit2_0 ;
3346
// GENERAL output from conf. cycle generation register & int. control register
3347
assign          config_addr[23 : 0] = { cnf_addr_bit23_2, 1'b0, cnf_addr_bit0 } ;
3348
assign          icr_soft_res = icr_bit31 ;
3349 2 mihad
 
3350 21 mihad
 
3351
endmodule
3352 45 mihad
 

powered by: WebSVN 2.1.0

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