@@ -70,9 +70,14 @@ module axi_adapter #(
70
70
input logic s_cpuif_wr_err
71
71
);
72
72
73
+ localparam LowerAddrBits = $clog2 (CsrDataWidth/ 8 );
74
+ localparam AxiCSRDataShift = $clog2 (AxiDataWidth/ CsrDataWidth);
75
+ localparam UpperAddrBits = LowerAddrBits + AxiCSRDataShift;
76
+ localparam ShiftWidth = $clog2 (CsrDataWidth);
77
+
73
78
axi_if # (
74
79
.AW (CsrAddrWidth),
75
- .DW (CsrDataWidth ),
80
+ .DW (AxiDataWidth ),
76
81
.UW (AxiDataWidth),
77
82
.IW (AxiIdWidth)
78
83
) axi (
@@ -131,19 +136,21 @@ module axi_adapter #(
131
136
logic cpuif_req_stall;
132
137
logic i3c_req_write;
133
138
logic i3c_req_last;
134
- logic [CsrDataWidth- 1 : 0 ] i3c_req_wdata;
139
+ logic [AxiDataWidth- 1 : 0 ] i3c_req_wdata;
140
+ logic [AxiDataWidth- 1 : 0 ] i3c_req_wbiten;
135
141
logic [AxiDataWidth/ 8 - 1 : 0 ] i3c_req_wstrb;
136
142
logic [2 : 0 ] i3c_req_size;
137
143
logic [AxiAddrWidth- 1 : 0 ] i3c_req_addr;
138
- logic [CsrDataWidth - 1 : 0 ] i3c_req_rdata;
144
+ logic [AxiDataWidth - 1 : 0 ] i3c_req_rdata;
139
145
logic [AxiIdWidth- 1 : 0 ] i3c_req_id;
140
- logic [CsrDataWidth - 1 : 0 ] i3c_req_user;
146
+ logic [AxiDataWidth - 1 : 0 ] i3c_req_user;
141
147
142
148
// Instantiate AXI subordinate to component interface module
143
- axi_sub # (
149
+ i3c_axi_sub # (
144
150
.AW (CsrAddrWidth),
145
- .DW (CsrDataWidth),
146
- .UW (AxiDataWidth),
151
+ .AG ($clog2 (CsrDataWidth/ 8 )),
152
+ .DW (AxiDataWidth),
153
+ .UW (AxiUserWidth),
147
154
.IW (AxiIdWidth)
148
155
) axi_sif_i3c (
149
156
.clk (clk_i),
@@ -172,7 +179,7 @@ module axi_adapter #(
172
179
genvar i;
173
180
for (i = 0 ; i < AxiDataWidth / 8 ; i = i + 1 ) begin : g_replicate_strb_bits
174
181
always_comb begin
175
- s_cpuif_wr_biten [i* 8 + : 8 ] = i3c_req_wstrb[i] ? 8'hFF : 8'h00 ;
182
+ i3c_req_wbiten [i* 8 + : 8 ] = i3c_req_wstrb[i] ? 8'hFF : 8'h00 ;
176
183
end
177
184
end
178
185
@@ -186,9 +193,22 @@ module axi_adapter #(
186
193
s_cpuif_req = i3c_req_dv & ~ i3c_req_hld_ext;
187
194
s_cpuif_req_is_wr = i3c_req_write;
188
195
s_cpuif_addr = i3c_req_addr[CsrAddrWidth- 1 : 0 ];
189
- s_cpuif_wr_data = i3c_req_wdata;
190
- i3c_req_rdata = s_cpuif_rd_data;
191
196
end
197
+ generate
198
+ if (AxiDataWidth === CsrDataWidth) begin
199
+ assign s_cpuif_wr_biten = i3c_req_wbiten;
200
+ assign s_cpuif_wr_data = i3c_req_wdata;
201
+ assign i3c_req_rdata = s_cpuif_rd_data;
202
+ end else if (AxiDataWidth >= CsrDataWidth) begin
203
+ assign s_cpuif_wr_biten = i3c_req_wbiten >> { i3c_req_addr[UpperAddrBits- 1 : LowerAddrBits],{ ShiftWidth{ 1'b0 }}} ;
204
+ assign s_cpuif_wr_data = i3c_req_wdata >> { i3c_req_addr[UpperAddrBits- 1 : LowerAddrBits],{ ShiftWidth{ 1'b0 }}} ;
205
+ assign i3c_req_rdata = s_cpuif_rd_data << { i3c_req_addr[UpperAddrBits- 1 : LowerAddrBits],{ ShiftWidth{ 1'b0 }}} ;
206
+ `ifndef SYNTHESIS
207
+ end else begin
208
+ $error (" No implementation for CSR width > interface width" );
209
+ `endif
210
+ end
211
+ endgenerate
192
212
193
213
always_ff @ (posedge clk_i or negedge rst_ni) begin
194
214
if (~ rst_ni) begin
0 commit comments