x393  1.0
FPGAcodeforElphelNC393camera
simul_axi_hp_rd.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
41 module simul_axi_hp_rd #(
42  parameter [1:0] HP_PORT=0
43 )(
44  input rst,
45  // AXI signals
46  input aclk,
47  output aresetn, // do not use?
48  // read address
49  input [31:0] araddr,
50  input arvalid,
51  output arready,
52  input [ 5:0] arid,
53  input [ 1:0] arlock,
54  input [ 3:0] arcache,
55  input [ 2:0] arprot,
56  input [ 3:0] arlen,
57  input [ 1:0] arsize,
58  input [ 1:0] arburst,
59  input [ 3:0] arqos,
60  // read data
61  output [63:0] rdata,
62  output rvalid,
63  input rready,
64  output [ 5:0] rid,
65  output rlast,
66  output [ 1:0] rresp,
67  // PL extra (non-AXI) signals
68  output [ 7:0] rcount,
69  output [ 2:0] racount,
71  // Simulation signals - use same aclk
72  output [31:0] sim_rd_address,
73  output [ 5:0] sim_rid,
74  input sim_rd_valid,
75  output sim_rd_ready,
76  input [63:0] sim_rd_data,
77  output [ 2:0] sim_rd_cap,
78  output [ 3:0] sim_rd_qos,
79  input [ 1:0] sim_rd_resp,
80  input [31:0] reg_addr,
81  input reg_wr,
82  input reg_rd,
83  input [31:0] reg_din,
84  output [31:0] reg_dout,
85  output reg_dvalid // register output data valid
86 );
87  localparam AFI_BASECTRL= 32'hf8008000+ (HP_PORT << 12);
88  localparam AFI_RDCHAN_CTRL= AFI_BASECTRL + 'h00;
90  localparam AFI_RDQOS= AFI_BASECTRL + 'h8;
92  localparam AFI_RDDEBUG= AFI_BASECTRL + 'h10; // SuppressThisWarning VEditor - not yet used
93 
94 
95  localparam VALID_ARLOCK = 2'b0; // TODO
96  localparam VALID_ARCACHE = 4'b0011; //
97  localparam VALID_ARPROT = 3'b000;
98  localparam VALID_ARLOCK_MASK = 2'b11; // TODO
99  localparam VALID_ARCACHE_MASK = 4'b0011; //
100  localparam VALID_ARPROT_MASK = 3'b010;
101 
102  assign aresetn= ~rst; // probably not needed at all - docs say "do not use"
103 
106  reg rdFabricQosEn = 0;
107  reg rd32BitEn = 0; // verify it i 0
108  reg [2:0] rdIssueCap1 = 0;
109  reg [2:0] rdIssueCap0 = 7;
110  reg [3:0] rdStaticQos = 0;
111 
112  wire [3:0] rd_qos_in;
113  wire [3:0] rd_qos_out;
114 /*
115  wire aw_nempty;
116  wire w_nempty;
117  wire enough_data; // enough data to start a new burst
118  wire [11:3] next_wr_address; // bits that are incrtemented in 64-bit mode (higher are kept according to AXI 4KB inc. limit)
119  reg [31:0] write_address;
120  wire fifo_wd_rd; // read data fifo
121  wire last_confirmed_write;
122 */
123 
124  wire [5:0] arid_out; // verify it matches wid_out when outputting data
125  wire [1:0] arburst_out;
126  wire [1:0] arsize_out; // verify it is 3'h3
127  wire [3:0] arlen_out;
128  wire [31:0] araddr_out;
129  wire ar_nempty;
130  wire r_nempty;
131  reg [7:0] fifo_with_requested=0; // fill level of data FIFO if all the requested data will arrive and nothing read
135  reg was_data_fifo_read; // previos cycle was reading data from FIFO
136  reg was_data_fifo_write;// previos cycle was writing data to FIFO
137  reg was_addr_fifo_write; // previos cycle was writing addressto FIFO
138 
139  wire read_in_progress_w; // should go inactive last confirmed upstream cycle
141  reg [3:0] read_left;
142  reg [1:0] rburst;
143  reg [3:0] rlen;
144  wire [11:3] next_rd_address; // bits that are incrtemented in 64-bit mode (higher are kept according to AXI 4KB inc. limit)
145  reg [31:0] read_address;
146 
148  wire last_read;
149 
150 
151 // sim_rd_address =
154  assign rd_qos_in = rdFabricQosEn?(arqos & {4{arvalid}}) : rdStaticQos;
155  //awqos & {4{awvalid}}
156  assign aresetn= ~rst; // probably not needed at all - docs say "do not use"
157  //Supported control register fields
159  {24'b0,rcount}:
160  ( (reg_rd && (reg_addr==AFI_RDCHAN_CTRL))?
163  {25'b0,rdIssueCap1,1'b0,rdIssueCap0}:
164  ( (reg_rd && (reg_addr==AFI_RDQOS))?
165  {28'b0,rdStaticQos}:32'bz)));
166  assign reg_dvalid = (reg_rd && ((reg_addr==AFI_RDDATAFIFO_LEVEL) ||
169  (reg_addr==AFI_RDQOS))) ? 1 : 0;
170  always @ (posedge aclk or posedge rst) begin
171  if (rst) begin
172  rdQosHeadOfCmdQEn <= 0;
173  rdFabricOutCmdEn <= 0;
174  rdFabricQosEn <= 1;
175  rd32BitEn <= 0;
176  end else if (reg_wr && (reg_addr==AFI_RDCHAN_CTRL)) begin
179  rdFabricQosEn <= reg_din[1];
180  rd32BitEn <= reg_din[0];
181  end
182  if (rst) begin
183  rdIssueCap1 <= 0;
184  rdIssueCap0 <= 7;
185  end else if (reg_wr && (reg_addr==AFI_RDCHAN_ISSUINGCAP)) begin
186  rdIssueCap1 <= reg_din[6:4];
187  rdIssueCap0 <= reg_din[2:0];
188  end
189  if (rst) begin
190  rdStaticQos <= 0;
191  end else if (reg_wr && (reg_addr==AFI_RDQOS)) begin
192  rdStaticQos <= reg_din[3:0];
193  end
194  end
195 
196  assign fifo_data_rd = rvalid && rready;
197  assign next_with_requested= fifo_with_requested + {4'b0,arlen_out[3:0]} + {7'h0,~fifo_data_rd};
198  assign start_read_burst_w= ar_nempty && (next_with_requested <= 8'h80) &&
200  assign read_in_progress_w= ar_nempty && (next_with_requested <= 8'h80) ||
202 // assign rvalid= (|rcount[7:1]) || (rcount[0] && !was_data_fifo_read);
203  assign rvalid= r_nempty && ((|rcount[7:1]) || !was_data_fifo_read);
204  assign arready= !racount[2] && (!racount[1] || !racount[0] || !was_addr_fifo_write);
205  assign last_read = (read_left==0);
207  // AXI: Bursts should not cross 4KB boundaries (... and to limit size of the address incrementer)
208  // in 64 bit mode - low 3 bits are preserved, next 9 are incremented
209  assign next_rd_address[11:3] =
210  rburst[1]?
211  (rburst[0]? {9'bx}:((read_address[11:3] + 1) & {5'h1f, ~rlen[3:0]})):
212  (rburst[0]? (read_address[11:3]+1):(read_address[11:3]));
213  assign sim_rd_address = read_address;
214  assign sim_rid = arid_out;
215  // Current model policy is not to initiate a new burst (read from simulation port) if it may overflow FIFO
216  // - maybe the real module is done this way to aggregate external accesses.
217  // So 'assign sim_rd_ready = read_in_progress;' should be sufficient, but if that will chnage - below is
218  // full vesion that does not depend on the assumption.
219  assign sim_rd_ready = read_in_progress &&
220  !rcount[7] && (!(&rcount[6:0]) || !was_data_fifo_write);
221 
222  always @ (posedge aclk) begin
223  if (start_read_burst_w) begin
224  if (arsize_out != 2'h3) begin
225  $display ("%m: at time %t ERROR: arsize_out=%h, currently only 'h3 (8 bytes) is valid",$time,arsize_out);
226  $stop;
227  end
228  end
229  if (arvalid && arready) begin
230  if (((arlock ^ VALID_ARLOCK) & VALID_ARLOCK_MASK) != 0) begin
231  $display ("%m: at time %t ERROR: arlock = %h, valid %h with mask %h",$time, arlock, VALID_ARLOCK, VALID_ARLOCK_MASK);
232  $stop;
233  end
234  if (((arcache ^ VALID_ARCACHE) & VALID_ARCACHE_MASK) != 0) begin
235  $display ("%m: at time %t ERROR: arcache = %h, valid %h with mask %h",$time, arcache, VALID_ARCACHE, VALID_ARCACHE_MASK);
236  $stop;
237  end
238  if (((arprot ^ VALID_ARPROT) & VALID_ARPROT_MASK) != 0) begin
239  $display ("%m: at time %t ERROR: arprot = %h, valid %h with mask %h",$time, arprot, VALID_ARPROT, VALID_ARPROT_MASK);
240  $stop;
241  end
242  end
243  end
244 
245  always @ (posedge aclk or posedge rst) begin
246  if (rst) fifo_with_requested <= 0;
249 
250  if (rst) was_data_fifo_read <= 0;
251  else was_data_fifo_read <= rvalid && rready;
252 
253  if (rst) was_addr_fifo_write <= 0;
255 
256  if (rst) was_data_fifo_write <= 0;
258 
259 
260  if (rst) rburst[1:0] <= 0;
261  else if (start_read_burst_w) rburst[1:0] <= arburst_out[1:0];
262 
263  if (rst) rlen[3:0] <= 0;
264  else if (start_read_burst_w) rlen[3:0] <= arlen_out[3:0];
265 
266  if (rst) read_in_progress <= 0;
268 
269  if (rst) read_left <= 0;
270  else if (start_read_burst_w) read_left <= arlen_out[3:0]; // precedence over inc
271  else if (sim_rd_valid && sim_rd_ready) read_left <= read_left-1; //SuppressThisWarning ISExst Result of 32-bit expression is truncated to fit in 4-bit target.
272 
273  if (rst) read_address <= 32'bx;
274  else if (start_read_burst_w) read_address <= araddr_out; // precedence over inc
276 
277 
278  end
279 
280 
281 fifo_same_clock_fill #( .DATA_WIDTH(50),.DATA_DEPTH(2)) // read - 4, write - 32?
282  raddr_i (
283  .rst (rst),
284  .clk (aclk),
285  .sync_rst (1'b0),
286  .we (arvalid && arready),
288  .data_in ({arid[5:0], arburst[1:0], arsize[1:0], arlen[3:0], araddr[31:0], rd_qos_in[3:0]}),
289  .data_out ({arid_out[5:0], arburst_out[1:0],arsize_out[1:0],arlen_out[3:0],araddr_out[31:0], rd_qos_out[3:0]}),
290  .nempty (ar_nempty),
291  .half_full (), //aw_half_full),
292  .under (), //waddr_under), // output reg
293  .over (), //waddr_over), // output reg
294  .wcount (), //waddr_wcount), // output[3:0] reg
295  .rcount (), //waddr_rcount), // output[3:0] reg
296  .wnum_in_fifo (racount), // output[3:0]
297  .rnum_in_fifo () // output[3:0]
298  );
299 
300 fifo_same_clock_fill #( .DATA_WIDTH(73),.DATA_DEPTH(7)) // read - 4, write - 32?
301  rdata_i (
302  .rst (rst),
303  .clk (aclk),
304  .sync_rst (1'b0),
306  .re (rvalid && rready),
307  .data_in ({last_read, arid_out[5:0], sim_rd_resp[1:0], sim_rd_data[63:0]}),
308  .data_out ({rlast, rid[5:0], rresp[1:0], rdata[63:0]}),
309  .nempty (r_nempty), //r_nempty),
310  .half_full (), //aw_half_full),
311  .under (), //waddr_under),
312  .over (), //waddr_over),
313  .wcount (), //waddr_wcount),
314  .rcount (), //waddr_rcount),
315  .wnum_in_fifo (),
316  .rnum_in_fifo (rcount)
317  );
318 
319 
320 
321 endmodule
322 
8946next_rd_addresswire[11:3]
8947read_addressreg[31:0]
8910AFI_RDDATAFIFO_LEVELAFI_BASECTRL + 'hc
8911AFI_RDDEBUGAFI_BASECTRL + 'h10
8916VALID_ARCACHE_MASK4'b0011
[31:0] 8904reg_dout
8927arid_outwire[5:0]
[ 1:0] 8899sim_rd_resp
[31:0] 8900reg_addr
8930arlen_outwire[3:0]
8924rdStaticQosreg[3:0]
[31:0] 8892sim_rd_address
[DATA_WIDTH-1:0] 10452data_in
8929arsize_outwire[1:0]
rdata_i fifo_same_clock_fill
8917VALID_ARPROT_MASK3'b010
8909AFI_RDQOSAFI_BASECTRL + 'h8
8928arburst_outwire[1:0]
8908AFI_RDCHAN_ISSUINGCAPAFI_BASECTRL + 'h4
8907AFI_RDCHAN_CTRLAFI_BASECTRL + 'h00
8926rd_qos_outwire[3:0]
8915VALID_ARLOCK_MASK2'b11
reg [DATA_DEPTH-1:0] 10459rcount
[DATA_DEPTH: 0] 10460wnum_in_fifo
reg [DATA_DEPTH-1:0] 10458wcount
8922rdIssueCap1reg[2:0]
8934fifo_with_requestedreg[7:0]
[DATA_WIDTH-1:0] 10453data_out
8913VALID_ARCACHE4'b0011
[ 3:0] 8898sim_rd_qos
[63:0] 8896sim_rd_data
8936next_with_requestedwire[7:0]
[ 2:0] 8897sim_rd_cap
8906AFI_BASECTRL32'hf8008000+ (HP_PORT << 12
8925rd_qos_inwire[3:0]
8931araddr_outwire[31:0]
[DATA_DEPTH: 0] 10461rnum_in_fifo
8923rdIssueCap0reg[2:0]