@@ -124,7 +124,7 @@ module mprj_ctrl #(
124124 wire xfer_sel;
125125 wire busy;
126126 wire [`MPRJ_IO_PADS- 1 :0 ] io_ctrl_sel;
127- wire [31 :0 ] iomem_rdata_pre;
127+ reg [31 :0 ] iomem_rdata_pre;
128128
129129 wire [`MPRJ_IO_PADS- 1 :0 ] mgmt_gpio_in;
130130
@@ -165,23 +165,41 @@ module mprj_ctrl #(
165165
166166 assign selected = xfer_sel || pwr_data_sel || (| io_data_sel) || (| io_ctrl_sel);
167167
168- assign iomem_rdata_pre = (selected == 0 ) ? 'b0 :
169- (xfer_sel) ? {31'b0 , busy} :
170- (pwr_data_sel) ? {{(32 - `MPRJ_PWR_PADS){1'b0 }},
171- pwr_ctrl_out} : 'bz;
172-
173- generate
174- for (i= 0 ; i< IO_WORDS; i= i+ 1 ) begin
175- assign iomem_rdata_pre = (io_data_sel[i]) ?
176- {{(31 - `rtop){1'b0 }}, mgmt_gpio_in[`wtop:`wbot]} : 'bz;
177- end
168+ wire [31 :0 ] io_data_arr[0 :IO_WORDS- 1 ];
169+ wire [31 :0 ] io_ctrl_arr[0 :`MPRJ_IO_PADS- 1 ];
170+ generate
171+ for (i= 0 ; i< IO_WORDS; i= i+ 1 ) begin
172+ assign io_data_arr[i] = {{(31 - `rtop){1'b0 }}, mgmt_gpio_in[`wtop:`wbot]};
178173
179- for (i = 0 ; i < `MPRJ_IO_PADS; i = i + 1 ) begin
180- assign iomem_rdata_pre = (io_ctrl_sel[i]) ?
181- {{(32 - IO_CTRL_BITS){1'b0 }}, io_ctrl[i]} : 'bz ;
182- end
174+ end
175+ for (i = 0 ; i < `MPRJ_IO_PADS; i = i + 1 ) begin
176+ assign io_ctrl_arr[i] = {{(32 - IO_CTRL_BITS){1'b0 }}, io_ctrl[i]};
177+ end
183178 endgenerate
184179
180+
181+ integer j;
182+ always @ * begin
183+ iomem_rdata_pre = 'b0;
184+ if (xfer_sel) begin
185+ iomem_rdata_pre = {31'b0 , busy};
186+ end else if (pwr_data_sel) begin
187+ iomem_rdata_pre = {{(32 - `MPRJ_PWR_PADS){1'b0 }}, pwr_ctrl_out};
188+ end else if (| io_data_sel) begin
189+ for (j= 0 ; j< IO_WORDS; j= j+ 1 ) begin
190+ if (io_data_sel[j]) begin
191+ iomem_rdata_pre = io_data_arr[j];
192+ end
193+ end
194+ end else begin
195+ for (j= 0 ; j< `MPRJ_IO_PADS; j= j+ 1 ) begin
196+ if (io_ctrl_sel[j]) begin
197+ iomem_rdata_pre = io_ctrl_arr[j];
198+ end
199+ end
200+ end
201+ end
202+
185203 // General I/O transfer
186204
187205 always @(posedge clk) begin
@@ -207,7 +225,6 @@ module mprj_ctrl #(
207225 xfer_ctrl <= 0 ;
208226 pwr_ctrl_out <= 0 ;
209227 end else begin
210- iomem_ready <= 0 ;
211228 if (iomem_valid && ! iomem_ready && iomem_addr[31 :8 ] == BASE_ADR[31 :8 ]) begin
212229 if (xfer_sel) begin
213230 if (iomem_wstrb[0 ]) xfer_ctrl <= iomem_wdata[0 ];
0 commit comments