1.1 diff -r 11aef665a5d8 -r 522426d22baa rtl/verilog/slave_reg.v 1.2 --- a/rtl/verilog/slave_reg.v Fri Aug 13 10:43:05 2010 +0100 1.3 +++ b/rtl/verilog/slave_reg.v Sat Aug 06 01:48:48 2011 +0100 1.4 @@ -1,234 +1,475 @@ 1.5 -// ============================================================================= 1.6 -// COPYRIGHT NOTICE 1.7 -// Copyright 2006 (c) Lattice Semiconductor Corporation 1.8 -// ALL RIGHTS RESERVED 1.9 -// This confidential and proprietary software may be used only as authorised by 1.10 -// a licensing agreement from Lattice Semiconductor Corporation. 1.11 -// The entire notice above must be reproduced on all authorized copies and 1.12 -// copies may only be made to the extent permitted by a licensing agreement from 1.13 -// Lattice Semiconductor Corporation. 1.14 +// ================================================================== 1.15 +// >>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< 1.16 +// ------------------------------------------------------------------ 1.17 +// Copyright (c) 2006-2011 by Lattice Semiconductor Corporation 1.18 +// ALL RIGHTS RESERVED 1.19 +// ------------------------------------------------------------------ 1.20 +// 1.21 +// IMPORTANT: THIS FILE IS AUTO-GENERATED BY THE LATTICEMICO SYSTEM. 1.22 +// 1.23 +// Permission: 1.24 +// 1.25 +// Lattice Semiconductor grants permission to use this code 1.26 +// pursuant to the terms of the Lattice Semiconductor Corporation 1.27 +// Open Source License Agreement. 1.28 +// 1.29 +// Disclaimer: 1.30 // 1.31 -// Lattice Semiconductor Corporation TEL : 1-800-Lattice (USA and Canada) 1.32 -// 5555 NE Moore Court 408-826-6000 (other locations) 1.33 -// Hillsboro, OR 97124 web : http://www.latticesemi.com/ 1.34 -// U.S.A email: techsupport@latticesemi.com 1.35 -// =============================================================================/ 1.36 +// Lattice Semiconductor provides no warranty regarding the use or 1.37 +// functionality of this code. It is the user's responsibility to 1.38 +// verify the user’s design for consistency and functionality through 1.39 +// the use of formal verification methods. 1.40 +// 1.41 +// -------------------------------------------------------------------- 1.42 +// 1.43 +// Lattice Semiconductor Corporation 1.44 +// 5555 NE Moore Court 1.45 +// Hillsboro, OR 97214 1.46 +// U.S.A 1.47 +// 1.48 +// TEL: 1-800-Lattice (USA and Canada) 1.49 +// 503-286-8001 (other locations) 1.50 +// 1.51 +// web: http://www.latticesemi.com/ 1.52 +// email: techsupport@latticesemi.com 1.53 +// 1.54 +// -------------------------------------------------------------------- 1.55 // FILE DETAILS 1.56 // Project : LM32 DMA Component 1.57 // File : slave_reg.v 1.58 // Title : DMA Slave controller 1.59 // Dependencies : None 1.60 +// : 1.61 // Version : 7.0 1.62 // : Initial Release 1.63 +// : 1.64 // Version : 7.0SP2, 3.0 1.65 -// 1. Read and Write channel of DMA controller are working in parallel, 1.66 -// due to that now as soon as FIFO is not empty write channel of the DMA 1.67 -// controller start writing data to the slave. 1.68 -// 2. Burst Size supported by DMA controller is increased to support bigger 1.69 -// burst (from current value of 4 and 8 to 16 and 32). Now 4 different type 1.70 -// of burst sizes are supported by the DMA controller 4, 8, 16 and 32. 1.71 -// For this Burst Size field of the control register is increased to 2 bits. 1.72 -// 3. Glitch is removed on the S_ACK_O signal. 1.73 +// : 1. Read and Write channel of DMA controller are working in 1.74 +// : parallel, due to that now as soon as FIFO is not empty 1.75 +// : write channel of the DMA controller start writing data 1.76 +// : to the slave. 1.77 +// : 2. Burst Size supported by DMA controller is increased to 1.78 +// : support bigger burst (from current value of 4 and 8 to 1.79 +// : 16 and 32). Now 4 different type of burst sizes are 1.80 +// : supported by the DMA controller 4, 8, 16 and 32. For 1.81 +// : this Burst Size field of the control register is 1.82 +// : increased to 2 bits. 1.83 +// : 3. Glitch is removed on the S_ACK_O signal. 1.84 +// : 1.85 // Version : 3.1 1.86 -// : Make DMA Engine compliant to Rule 3.100 of Wishbone Spec 1.87 -// : which defines alignement of bytes in sub-word transfers. 1.88 +// : 1. Make DMA Engine compliant to Rule 3.100 of Wishbone Spec 1.89 +// : which defines alignement of bytes in sub-word transfers. 1.90 +// : 2. Removed glitch that did not pause the burst write when 1.91 +// : the read burst was paused by the "read slave". 1.92 +// : 1.93 +// Version : 3.2 1.94 +// : 1. Support for 8/32-bit WISHBONE Data Bus. The Control and 1.95 +// : Read/Write Ports can be independently configured. 1.96 +// : 2. Support for burst size of 64. 1.97 +// : 1.98 +// Version : 3.3 1.99 +// : 1. Interrupt can be release by writing 0 to IE bit in the 1.100 +// : status register. 1.101 // ============================================================================= 1.102 1.103 `ifndef SLAVE_REG_FILE 1.104 `define SLAVE_REG_FILE 1.105 `include "system_conf.v" 1.106 module SLAVE_REG 1.107 - #(parameter LENGTH_WIDTH = 16, 1.108 + #(parameter S_WB_DAT_WIDTH = 32, 1.109 + parameter S_WB_ADR_WIDTH = 32, 1.110 + parameter MA_WB_DAT_WIDTH = 32, 1.111 + parameter MA_WB_ADR_WIDTH = 32, 1.112 + parameter RETRY_TIMEOUT = 16, 1.113 parameter FIFO_IMPLEMENTATION = "EBR") 1.114 - ( 1.115 - //slave port 1.116 - S_ADR_I, //32bits 1.117 - S_DAT_I, //32bits 1.118 - S_WE_I, 1.119 - S_STB_I, 1.120 - S_CYC_I, 1.121 - S_CTI_I, 1.122 - S_DAT_O, //32bits 1.123 - S_ACK_O, 1.124 - S_INT_O, 1.125 - //Master Address 1.126 -// MA_SEL_O, 1.127 -// MB_SEL_O, 1.128 - M_SEL_O, 1.129 - //internal signals 1.130 - reg_start, 1.131 - reg_status, 1.132 - reg_interrupt, 1.133 - reg_busy, 1.134 - data_length, 1.135 - reg_cntlg, 1.136 - reg_bt2,reg_bt1,reg_bt0, 1.137 - incr_unit, 1.138 - reg_s_con, 1.139 - reg_d_con, 1.140 - reg_00_data, 1.141 - reg_04_data, 1.142 - //system clock and reset 1.143 - CLK_I, 1.144 - RST_I 1.145 - ); 1.146 - 1.147 - input [31:0] S_ADR_I; 1.148 - input [31:0] S_DAT_I; //32bits 1.149 - input S_WE_I; 1.150 - input S_STB_I; 1.151 - input S_CYC_I; 1.152 - input [2:0] S_CTI_I; 1.153 - output [31:0] S_DAT_O; //32bits 1.154 - output S_ACK_O; 1.155 - output S_INT_O; //interrupt signal 1.156 - //Master Address 1.157 - output [3:0] M_SEL_O; 1.158 -// output [3:0] MA_SEL_O; 1.159 -// output [3:0] MB_SEL_O; 1.160 - //internal signals 1.161 - output reg_start; 1.162 - input reg_status; 1.163 - input reg_interrupt; 1.164 - input reg_busy; 1.165 - output [LENGTH_WIDTH-1:0] data_length; 1.166 - input reg_cntlg; 1.167 - output reg_bt2,reg_bt1,reg_bt0; 1.168 - output [2:0] incr_unit; 1.169 - output reg_s_con; 1.170 - output reg_d_con; 1.171 - output [31:0] reg_00_data; 1.172 - output [31:0] reg_04_data; 1.173 - 1.174 - //system clock and reset 1.175 - input CLK_I; 1.176 - input RST_I; 1.177 - 1.178 - parameter UDLY = 1; 1.179 - 1.180 - reg [31:0] reg_00_data; 1.181 - reg [31:0] reg_04_data; 1.182 - reg [LENGTH_WIDTH-1:0] reg_08_data; 1.183 - reg [6:0] reg_0c_data; 1.184 - 1.185 - reg [3:0] M_SEL_O; 1.186 -// wire [3:0] MA_SEL_O = M_SEL_O; 1.187 -// wire [3:0] MB_SEL_O = M_SEL_O; 1.188 - wire [LENGTH_WIDTH-1:0] data_length = reg_08_data; 1.189 - 1.190 - wire reg_bt2, reg_bt1, reg_bt0, reg_incw, reg_inchw, reg_d_con, reg_s_con; 1.191 - assign {reg_bt2,reg_bt1,reg_bt0,reg_incw,reg_inchw,reg_d_con,reg_s_con} = reg_0c_data; 1.192 - wire [2:0] incr_unit = reg_incw ? 4 : reg_inchw ? 2 : 1; 1.193 - 1.194 - wire [8:0] burst_incr_unit = reg_bt2 ? (reg_bt1 ? (reg_bt0 ? incr_unit<<5 : incr_unit<<4) : (reg_bt0 ? incr_unit<<3 : incr_unit<<2)) : incr_unit; 1.195 - reg reg_ie; 1.196 - wire [2:0] read_10_data = {reg_status,reg_ie,reg_busy}; 1.197 - 1.198 - wire reg_wr_rd = S_CYC_I && S_STB_I; 1.199 - 1.200 - wire master_idle = !reg_busy; 1.201 - reg s_ack_o_pre; 1.202 - wire S_ACK_O = s_ack_o_pre && S_CYC_I && S_STB_I; 1.203 + ( 1.204 + input CLK_I, 1.205 + input RST_I, 1.206 + 1.207 + // Slave port 1.208 + input [S_WB_ADR_WIDTH-1:0] S_ADR_I, 1.209 + input [S_WB_DAT_WIDTH-1:0] S_DAT_I, 1.210 + input [S_WB_DAT_WIDTH/8-1:0] S_SEL_I, 1.211 + input S_WE_I, 1.212 + input S_STB_I, 1.213 + input S_CYC_I, 1.214 + input [2:0] S_CTI_I, 1.215 + output [S_WB_DAT_WIDTH-1:0] S_DAT_O, 1.216 + output reg S_ACK_O, 1.217 + output reg S_INT_O, 1.218 + 1.219 + output reg reg_start, 1.220 + input reg_status, 1.221 + input reg_interrupt, 1.222 + input reg_busy, 1.223 + output reg reg_bt3, reg_bt2, reg_bt1, reg_bt0, 1.224 + output reg reg_s_con, reg_d_con, 1.225 + output reg reg_incw, reg_inchw, 1.226 + output reg [7:0] reg_rdelay, 1.227 + output reg [31:0] reg_00_data, 1.228 + output reg [31:0] reg_04_data, 1.229 + output reg [31:0] reg_08_data 1.230 + ); 1.231 + 1.232 + parameter UDLY = 1; 1.233 + 1.234 + reg [31:0] reg_00_data_nxt, reg_04_data_nxt, reg_08_data_nxt; 1.235 + reg [7:0] reg_0c_data, reg_0c_data_nxt; 1.236 + 1.237 + always @(/*AUTOSENSE*/reg_0c_data) 1.238 + begin 1.239 + //reg_rdelay = reg_0c_data[23:16]; 1.240 + reg_rdelay = RETRY_TIMEOUT; 1.241 + reg_bt3 = reg_0c_data[7]; 1.242 + reg_bt2 = reg_0c_data[6]; 1.243 + reg_bt1 = reg_0c_data[5]; 1.244 + reg_bt0 = reg_0c_data[4]; 1.245 + reg_incw = reg_0c_data[3]; 1.246 + reg_inchw = reg_0c_data[2]; 1.247 + reg_d_con = reg_0c_data[1]; 1.248 + reg_s_con = reg_0c_data[0]; 1.249 + end 1.250 + 1.251 + reg [2:0] read_10_data; 1.252 + reg reg_ie; 1.253 + always @(/*AUTOSENSE*/reg_busy or reg_ie or reg_status) 1.254 + begin 1.255 + read_10_data[2] = reg_status; 1.256 + read_10_data[1] = reg_ie; 1.257 + read_10_data[0] = reg_busy; 1.258 + end 1.259 + 1.260 + wire master_idle, reg_wr_rd, reg_wr, reg_rd; 1.261 + assign master_idle = ~reg_busy; 1.262 + assign reg_wr_rd = S_CYC_I & S_STB_I; 1.263 + assign reg_wr = reg_wr_rd & master_idle & S_WE_I & S_ACK_O; 1.264 + assign reg_rd = reg_wr_rd & ~S_WE_I & S_ACK_O; 1.265 + 1.266 + reg s_ack_o_pre, s_ack_o_pre_nxt; 1.267 + always @(/*AUTOSENSE*/S_CYC_I or S_STB_I or S_WE_I or master_idle 1.268 + or reg_wr_rd or s_ack_o_pre) 1.269 + begin 1.270 + if ((s_ack_o_pre == 1'b0) 1.271 + && ((master_idle && reg_wr_rd) 1.272 + || ((master_idle == 1'b0) && reg_wr_rd && (S_WE_I == 1'b0)))) 1.273 + s_ack_o_pre_nxt = 1'b1; 1.274 + else 1.275 + s_ack_o_pre_nxt = 1'b0; 1.276 + 1.277 + S_ACK_O = s_ack_o_pre && S_CYC_I && S_STB_I; 1.278 + end 1.279 1.280 always @(posedge CLK_I or posedge RST_I) 1.281 - if(RST_I) 1.282 - s_ack_o_pre <= #UDLY 1'b0; 1.283 - else if(((master_idle && reg_wr_rd) || (!master_idle && reg_wr_rd && !S_WE_I)) && (!s_ack_o_pre)) 1.284 - s_ack_o_pre <= #UDLY 1'b1; 1.285 - else 1.286 - s_ack_o_pre <= #UDLY 1'b0; 1.287 - 1.288 - 1.289 - //register write and read 1.290 - wire reg_wr = reg_wr_rd && S_WE_I && master_idle && S_ACK_O; 1.291 - wire reg_rd = reg_wr_rd && !S_WE_I && S_ACK_O; 1.292 - 1.293 - wire dw00_cs = (!(|S_ADR_I[5:2])); 1.294 - wire dw04_cs = (S_ADR_I[5:2] == 4'h1); 1.295 - wire dw08_cs = (S_ADR_I[5:2] == 4'h2); 1.296 - wire dw0c_cs = (S_ADR_I[5:2] == 4'h3); 1.297 - wire dw10_cs = (S_ADR_I[5:2] == 4'h4); 1.298 + if (RST_I) 1.299 + s_ack_o_pre <= #UDLY 1'b0; 1.300 + else 1.301 + s_ack_o_pre <= #UDLY s_ack_o_pre_nxt; 1.302 + 1.303 + wire dw00_cs, dw04_cs, dw08_cs, dw0c_cs, dw10_cs; 1.304 + assign dw00_cs = (S_ADR_I[5:2] == 4'h0); 1.305 + assign dw04_cs = (S_ADR_I[5:2] == 4'h1); 1.306 + assign dw08_cs = (S_ADR_I[5:2] == 4'h2); 1.307 + assign dw0c_cs = (S_ADR_I[5:2] == 4'h3); 1.308 + assign dw10_cs = (S_ADR_I[5:2] == 4'h4); 1.309 + 1.310 + wire [31:0] S_DAT_O_int = (dw00_cs 1.311 + ? reg_00_data 1.312 + : (dw04_cs 1.313 + ? reg_04_data 1.314 + : (dw08_cs 1.315 + ? reg_08_data 1.316 + : (dw0c_cs 1.317 + ? {4{reg_0c_data}} 1.318 + : (dw10_cs 1.319 + ? {4{5'h0,read_10_data}} 1.320 + : 32'h0))))); 1.321 + generate 1.322 + if (S_WB_DAT_WIDTH == 8) begin 1.323 + 1.324 + assign S_DAT_O = ((S_ADR_I[1:0] == 2'b00) 1.325 + ? S_DAT_O_int[31:24] 1.326 + : ((S_ADR_I[1:0] == 2'b01) 1.327 + ? S_DAT_O_int[23:16] 1.328 + : ((S_ADR_I[1:0] == 2'b10) 1.329 + ? S_DAT_O_int[15:8] 1.330 + : S_DAT_O_int[7:0]))); 1.331 + 1.332 + end 1.333 + else begin 1.334 + 1.335 + assign S_DAT_O = S_DAT_O_int; 1.336 + 1.337 + end 1.338 + endgenerate 1.339 + 1.340 + 1.341 + 1.342 + // Interrupt 1.343 + generate 1.344 + if (S_WB_DAT_WIDTH == 8) begin 1.345 + 1.346 + always @(posedge CLK_I or posedge RST_I) 1.347 + begin 1.348 + if(RST_I) 1.349 + S_INT_O <= #UDLY 1'b0; 1.350 + else if(reg_interrupt && reg_ie) 1.351 + S_INT_O <= #UDLY 1'b1; 1.352 + else if(dw10_cs && (reg_rd || (reg_wr && (S_DAT_I[1] == 1'b0)))) 1.353 + S_INT_O <= #UDLY 1'b0; 1.354 + end 1.355 + 1.356 + end 1.357 + else begin 1.358 + 1.359 + always @(posedge CLK_I or posedge RST_I) 1.360 + begin 1.361 + if(RST_I) 1.362 + S_INT_O <= #UDLY 1'b0; 1.363 + else if(reg_interrupt && reg_ie) 1.364 + S_INT_O <= #UDLY 1'b1; 1.365 + else if(dw10_cs && (reg_rd || (reg_wr && (S_DAT_I[25] == 1'b0)))) 1.366 + S_INT_O <= #UDLY 1'b0; 1.367 + end 1.368 + 1.369 + end 1.370 + endgenerate 1.371 + 1.372 + // reg_00 1.373 + generate 1.374 + if (S_WB_DAT_WIDTH == 8) begin 1.375 1.376 - //S_DAT_O 1.377 - wire [31:0] S_DAT_O = dw00_cs ? reg_00_data : 1.378 - dw04_cs ? reg_04_data : 1.379 - dw08_cs ? reg_08_data : 1.380 - dw0c_cs ? {24'h0,1'h0,reg_0c_data} : 1.381 - dw10_cs ? {24'h0,5'h0,read_10_data} : 32'h0; 1.382 + always @(/*AUTOSENSE*/S_ADR_I or S_DAT_I or dw00_cs 1.383 + or reg_00_data or reg_wr) 1.384 + begin 1.385 + if (dw00_cs && reg_wr) begin 1.386 + casez (S_ADR_I[1:0]) 1.387 + 2'b00: reg_00_data_nxt = { S_DAT_I[7:0], reg_00_data[23: 0]}; 1.388 + 2'b01: reg_00_data_nxt = {reg_00_data[31:24], S_DAT_I[7:0], reg_00_data[15: 0]}; 1.389 + 2'b10: reg_00_data_nxt = {reg_00_data[31:16], S_DAT_I[7:0], reg_00_data[ 7: 0]}; 1.390 + 2'b11: reg_00_data_nxt = {reg_00_data[31: 8], S_DAT_I[7:0] }; 1.391 + 1.392 + default: 1.393 + reg_00_data_nxt = reg_00_data; 1.394 + endcase 1.395 + end 1.396 + else 1.397 + reg_00_data_nxt = reg_00_data; 1.398 + end 1.399 + 1.400 + end 1.401 + else begin 1.402 + 1.403 + always @(/*AUTOSENSE*/S_DAT_I or S_SEL_I or dw00_cs 1.404 + or reg_00_data or reg_wr) 1.405 + begin 1.406 + if (dw00_cs && reg_wr) begin 1.407 + casez (S_SEL_I) 1.408 + 4'b1000: reg_00_data_nxt = { S_DAT_I[31:24], reg_00_data[23:0]}; 1.409 + 4'b0100: reg_00_data_nxt = {reg_00_data[31:24], S_DAT_I[23:16], reg_00_data[15:0]}; 1.410 + 4'b0010: reg_00_data_nxt = {reg_00_data[31:16], S_DAT_I[15: 8], reg_00_data[ 7:0]}; 1.411 + 4'b0001: reg_00_data_nxt = {reg_00_data[31: 8], S_DAT_I[ 7: 0] }; 1.412 + 4'b1111: reg_00_data_nxt = S_DAT_I[31: 0] ; 1.413 + 1.414 + default: 1.415 + reg_00_data_nxt = reg_00_data; 1.416 + endcase 1.417 + end 1.418 + else 1.419 + reg_00_data_nxt = reg_00_data; 1.420 + end 1.421 + 1.422 + end 1.423 + endgenerate 1.424 + 1.425 + always @(posedge CLK_I or posedge RST_I) 1.426 + if (RST_I) 1.427 + reg_00_data <= #UDLY 32'b0; 1.428 + else 1.429 + reg_00_data <= #UDLY reg_00_data_nxt; 1.430 + 1.431 + 1.432 + 1.433 + // reg_04 1.434 + generate 1.435 + if (S_WB_DAT_WIDTH == 8) begin 1.436 1.437 - always @(posedge CLK_I or posedge RST_I) 1.438 - if(RST_I) 1.439 - M_SEL_O <= #UDLY 4'h0; 1.440 - else if(data_length < incr_unit) 1.441 - case(data_length[2:0]) 1.442 - 1: M_SEL_O <= #UDLY 4'h8; 1.443 - 2: M_SEL_O <= #UDLY 4'hc; 1.444 - 3: M_SEL_O <= #UDLY 4'he; 1.445 - default:M_SEL_O <= #UDLY 4'hf; 1.446 - endcase 1.447 - else 1.448 - case(incr_unit) 1.449 - 1: M_SEL_O <= #UDLY 4'h8; 1.450 - 2: M_SEL_O <= #UDLY 4'hc; 1.451 - 4: M_SEL_O <= #UDLY 4'hf; 1.452 - default:M_SEL_O <= #UDLY 4'hf; 1.453 - endcase 1.454 - //interrupt 1.455 - reg S_INT_O; 1.456 + always @(/*AUTOSENSE*/S_ADR_I or S_DAT_I or dw04_cs 1.457 + or reg_04_data or reg_wr) 1.458 + begin 1.459 + if (dw04_cs && reg_wr) begin 1.460 + casez (S_ADR_I[1:0]) 1.461 + 2'b00: reg_04_data_nxt = { S_DAT_I[7:0], reg_04_data[23: 0]}; 1.462 + 2'b01: reg_04_data_nxt = {reg_04_data[31:24], S_DAT_I[7:0], reg_04_data[15: 0]}; 1.463 + 2'b10: reg_04_data_nxt = {reg_04_data[31:16], S_DAT_I[7:0], reg_04_data[ 7: 0]}; 1.464 + 2'b11: reg_04_data_nxt = {reg_04_data[31: 8], S_DAT_I[7:0] }; 1.465 + 1.466 + default: 1.467 + reg_04_data_nxt = reg_04_data; 1.468 + endcase 1.469 + end 1.470 + else 1.471 + reg_04_data_nxt = reg_04_data; 1.472 + end 1.473 + 1.474 + end 1.475 + else begin 1.476 + 1.477 + always @(/*AUTOSENSE*/S_DAT_I or S_SEL_I or dw04_cs 1.478 + or reg_04_data or reg_wr) 1.479 + begin 1.480 + if (dw04_cs && reg_wr) begin 1.481 + casez (S_SEL_I) 1.482 + 4'b1000: reg_04_data_nxt = { S_DAT_I[31:24], reg_04_data[23:0]}; 1.483 + 4'b0100: reg_04_data_nxt = {reg_04_data[31:24], S_DAT_I[23:16], reg_04_data[15:0]}; 1.484 + 4'b0010: reg_04_data_nxt = {reg_04_data[31:16], S_DAT_I[15: 8], reg_04_data[ 7:0]}; 1.485 + 4'b0001: reg_04_data_nxt = {reg_04_data[31: 8], S_DAT_I[ 7: 0] }; 1.486 + 4'b1111: reg_04_data_nxt = { S_DAT_I[31: 0] }; 1.487 + 1.488 + default: 1.489 + reg_04_data_nxt = reg_04_data; 1.490 + endcase 1.491 + end 1.492 + else 1.493 + reg_04_data_nxt = reg_04_data; 1.494 + end 1.495 + 1.496 + end 1.497 + endgenerate 1.498 + 1.499 always @(posedge CLK_I or posedge RST_I) 1.500 - if(RST_I) 1.501 - S_INT_O <= #UDLY 1'b0; 1.502 - else if(reg_interrupt && reg_ie) 1.503 - S_INT_O <= #UDLY 1'b1; 1.504 - else if(dw10_cs && reg_rd) 1.505 - S_INT_O <= #UDLY 1'b0; 1.506 + if (RST_I) 1.507 + reg_04_data <= #UDLY 32'b0; 1.508 + else 1.509 + reg_04_data <= #UDLY reg_04_data_nxt; 1.510 + 1.511 + 1.512 + 1.513 + // reg_08 1.514 + generate 1.515 + if (S_WB_DAT_WIDTH == 8) begin 1.516 1.517 - //reg_00 1.518 - always @(posedge CLK_I or posedge RST_I) 1.519 - if(RST_I) 1.520 - reg_00_data <= #UDLY 32'h0; 1.521 - else if(dw00_cs && reg_wr) 1.522 - reg_00_data <= #UDLY S_DAT_I; 1.523 - 1.524 - //reg_04 1.525 - always @(posedge CLK_I or posedge RST_I) 1.526 - if(RST_I) 1.527 - reg_04_data <= #UDLY 32'h0; 1.528 - else if(dw04_cs && reg_wr) 1.529 - reg_04_data <= #UDLY S_DAT_I; 1.530 - 1.531 - //reg_08 1.532 + always @(/*AUTOSENSE*/S_ADR_I or S_DAT_I or dw08_cs 1.533 + or reg_08_data or reg_wr) 1.534 + if (dw08_cs && reg_wr) begin 1.535 + casez (S_ADR_I[1:0]) 1.536 + 2'b00: reg_08_data_nxt = { S_DAT_I[7:0], reg_08_data[23: 0]}; 1.537 + 2'b01: reg_08_data_nxt = {reg_08_data[31:24], S_DAT_I[7:0], reg_08_data[15: 0]}; 1.538 + 2'b10: reg_08_data_nxt = {reg_08_data[31:16], S_DAT_I[7:0], reg_08_data[ 7: 0]}; 1.539 + 2'b11: reg_08_data_nxt = {reg_08_data[31: 8], S_DAT_I[7:0] }; 1.540 + 1.541 + default: 1.542 + reg_08_data_nxt = reg_08_data; 1.543 + endcase 1.544 + end 1.545 + 1.546 + end 1.547 + else begin 1.548 + 1.549 + always @(/*AUTOSENSE*/S_DAT_I or S_SEL_I or dw08_cs 1.550 + or reg_08_data or reg_wr) 1.551 + if (dw08_cs && reg_wr) begin 1.552 + casez (S_SEL_I) 1.553 + 4'b1000: reg_08_data_nxt = { S_DAT_I[31:24], reg_08_data[23:0]}; 1.554 + 4'b0100: reg_08_data_nxt = {reg_08_data[31:24], S_DAT_I[23:16], reg_08_data[15:0]}; 1.555 + 4'b0010: reg_08_data_nxt = {reg_08_data[31:16], S_DAT_I[15: 8], reg_08_data[ 7:0]}; 1.556 + 4'b0001: reg_08_data_nxt = {reg_08_data[31: 8], S_DAT_I[ 7: 0] }; 1.557 + 4'b1111: reg_08_data_nxt = { S_DAT_I[31: 0] }; 1.558 + 1.559 + default: 1.560 + reg_08_data_nxt = reg_08_data; 1.561 + endcase 1.562 + end 1.563 + 1.564 + end 1.565 + endgenerate 1.566 + 1.567 always @(posedge CLK_I or posedge RST_I) 1.568 - if(RST_I) 1.569 - reg_08_data <= #UDLY 32'h0; 1.570 - else if(reg_cntlg) 1.571 - reg_08_data <= #UDLY (reg_08_data < burst_incr_unit) ? 'h0 : (reg_08_data - burst_incr_unit); 1.572 - else if(dw08_cs && reg_wr) 1.573 - reg_08_data <= #UDLY S_DAT_I; 1.574 - 1.575 - //reg_0c 1.576 + if (RST_I) 1.577 + reg_08_data <= #UDLY 0; 1.578 + else 1.579 + reg_08_data <= #UDLY reg_08_data_nxt[31:0]; 1.580 + 1.581 + 1.582 + 1.583 + // reg_0c 1.584 + generate 1.585 + if (S_WB_DAT_WIDTH == 8) begin 1.586 + 1.587 + always @(/*AUTOSENSE*/S_DAT_I or dw0c_cs or reg_0c_data 1.588 + or reg_wr) 1.589 + if (dw0c_cs && reg_wr) 1.590 + reg_0c_data_nxt = S_DAT_I[7:0]; 1.591 + else 1.592 + reg_0c_data_nxt = reg_0c_data; 1.593 + 1.594 + end 1.595 + else begin 1.596 + 1.597 + always @(/*AUTOSENSE*/S_DAT_I or S_SEL_I or dw0c_cs 1.598 + or reg_0c_data or reg_wr) 1.599 + if (dw0c_cs && reg_wr) 1.600 + reg_0c_data_nxt = S_DAT_I[31:24]; 1.601 + else 1.602 + reg_0c_data_nxt = reg_0c_data; 1.603 + 1.604 + end 1.605 + endgenerate 1.606 + 1.607 always @(posedge CLK_I or posedge RST_I) 1.608 - if(RST_I) 1.609 - reg_0c_data <= #UDLY 7'h0; 1.610 - else if(dw0c_cs && reg_wr) 1.611 - reg_0c_data <= #UDLY S_DAT_I[6:0]; 1.612 - 1.613 - //reg_10 1.614 - reg reg_start; 1.615 + if (RST_I) 1.616 + reg_0c_data <= #UDLY 8'b0; 1.617 + else 1.618 + reg_0c_data <= #UDLY reg_0c_data_nxt; 1.619 + 1.620 + 1.621 + 1.622 + // reg_10 1.623 + reg reg_ie_nxt, reg_start_nxt; 1.624 + generate 1.625 + if (S_WB_DAT_WIDTH == 8) begin 1.626 + 1.627 + always @(/*AUTOSENSE*/S_DAT_I or dw10_cs or reg_ie or reg_wr) 1.628 + if (dw10_cs && reg_wr) 1.629 + begin 1.630 + reg_ie_nxt = S_DAT_I[1]; 1.631 + reg_start_nxt = S_DAT_I[3]; 1.632 + end 1.633 + else 1.634 + begin 1.635 + reg_ie_nxt = reg_ie; 1.636 + reg_start_nxt = 1'b0; 1.637 + end 1.638 + 1.639 + end 1.640 + else begin 1.641 + 1.642 + always @(/*AUTOSENSE*/S_DAT_I or S_SEL_I or dw10_cs or reg_ie 1.643 + or reg_wr) 1.644 + if (dw10_cs && reg_wr) 1.645 + begin 1.646 + reg_ie_nxt = S_DAT_I[25]; 1.647 + reg_start_nxt = S_DAT_I[27]; 1.648 + end 1.649 + else 1.650 + begin 1.651 + reg_ie_nxt = reg_ie; 1.652 + reg_start_nxt = 1'b0; 1.653 + end 1.654 + 1.655 + end 1.656 + endgenerate 1.657 + 1.658 always @(posedge CLK_I or posedge RST_I) 1.659 - if(RST_I) 1.660 + if (RST_I) 1.661 begin 1.662 - reg_ie <= #UDLY 1'b0; 1.663 - reg_start <= #UDLY 1'b0; 1.664 - end 1.665 - else if(dw10_cs && reg_wr) 1.666 + reg_ie <= #UDLY 1'b0; 1.667 + reg_start <= #UDLY 1'b0; 1.668 + end 1.669 + else 1.670 begin 1.671 - reg_ie <= #UDLY S_DAT_I[1]; 1.672 - reg_start <= #UDLY S_DAT_I[3]; 1.673 + reg_ie <= #UDLY reg_ie_nxt; 1.674 + reg_start <= #UDLY reg_start_nxt; 1.675 end 1.676 - else 1.677 - begin 1.678 - reg_start <= #UDLY 1'b0; 1.679 - end 1.680 + 1.681 endmodule // SLAVE_REG 1.682 `endif // SLAVE_REG_FILE