@@ -224,7 +224,8 @@ module axi_demux_simple #(
224224 .push_mst_select_i ( slv_aw_select_i ),
225225 .push_i ( w_cnt_up ),
226226 .pop_axi_id_i ( slv_resp_o.b.id[0 + : AxiLookBits] ),
227- .pop_i ( slv_resp_o.b_valid & slv_req_i.b_ready )
227+ .pop_i ( slv_resp_o.b_valid & slv_req_i.b_ready ),
228+ .any_outstanding_trx_o ( )
228229 );
229230 // pop from ID counter on outward transaction
230231 end
@@ -369,7 +370,8 @@ module axi_demux_simple #(
369370 .push_mst_select_i ( slv_ar_select_i ),
370371 .push_i ( ar_push ),
371372 .pop_axi_id_i ( slv_resp_o.r.id[0 + : AxiLookBits] ),
372- .pop_i ( slv_resp_o.r_valid & slv_req_i.r_ready & slv_resp_o.r.last )
373+ .pop_i ( slv_resp_o.r_valid & slv_req_i.r_ready & slv_resp_o.r.last ),
374+ .any_outstanding_trx_o ( )
373375 );
374376 end
375377
@@ -460,13 +462,13 @@ module axi_demux_simple #(
460462// Validate parameters.
461463// pragma translate_off
462464`ifndef VERILATOR
463- `ifndef XSIM
464465 initial begin : validate_params
465466 no_mst_ports: assume (NoMstPorts > 0 ) else
466467 $fatal (1 , " The Number of slaves (NoMstPorts) has to be at least 1" );
467468 AXI_ID_BITS : assume (AxiIdWidth >= AxiLookBits) else
468469 $fatal (1 , " AxiIdBits has to be equal or smaller than AxiIdWidth." );
469470 end
471+ `ifndef XSIM
470472 default disable iff (! rst_ni);
471473 aw_select: assume property ( @ (posedge clk_i) (slv_req_i.aw_valid | - >
472474 (slv_aw_select_i < NoMstPorts))) else
@@ -508,126 +510,3 @@ module axi_demux_simple #(
508510// pragma translate_on
509511 end
510512endmodule
511-
512-
513- module axi_demux_id_counters # (
514- // the lower bits of the AXI ID that should be considered, results in 2**AXI_ID_BITS counters
515- parameter int unsigned AxiIdBits = 2 ,
516- parameter int unsigned CounterWidth = 4 ,
517- parameter type mst_port_select_t = logic
518- ) (
519- input logic clk_i, // Clock
520- input logic rst_ni, // Asynchronous reset active low
521- // lookup
522- input logic [AxiIdBits- 1 : 0 ] lookup_axi_id_i,
523- output mst_port_select_t lookup_mst_select_o,
524- output logic lookup_mst_select_occupied_o,
525- // push
526- output logic full_o,
527- input logic [AxiIdBits- 1 : 0 ] push_axi_id_i,
528- input mst_port_select_t push_mst_select_i,
529- input logic push_i,
530- // inject ATOPs in AR channel
531- input logic [AxiIdBits- 1 : 0 ] inject_axi_id_i,
532- input logic inject_i,
533- // pop
534- input logic [AxiIdBits- 1 : 0 ] pop_axi_id_i,
535- input logic pop_i
536- );
537- localparam int unsigned NoCounters = 2 ** AxiIdBits;
538- typedef logic [CounterWidth- 1 : 0 ] cnt_t ;
539-
540- // registers, each gets loaded when push_en[i]
541- mst_port_select_t [NoCounters- 1 : 0 ] mst_select_q;
542-
543- // counter signals
544- logic [NoCounters- 1 : 0 ] push_en, inject_en, pop_en, occupied, cnt_full;
545-
546- // -----------------------------------
547- // Lookup
548- // -----------------------------------
549- assign lookup_mst_select_o = mst_select_q[lookup_axi_id_i];
550- assign lookup_mst_select_occupied_o = occupied[lookup_axi_id_i];
551- // -----------------------------------
552- // Push and Pop
553- // -----------------------------------
554- assign push_en = (push_i) ? (1 << push_axi_id_i) : '0 ;
555- assign inject_en = (inject_i) ? (1 << inject_axi_id_i) : '0 ;
556- assign pop_en = (pop_i) ? (1 << pop_axi_id_i) : '0 ;
557- assign full_o = | cnt_full;
558- // counters
559- for (genvar i = 0 ; i < NoCounters; i++ ) begin : gen_counters
560- logic cnt_en, cnt_down, overflow;
561- cnt_t cnt_delta, in_flight;
562- always_comb begin
563- unique case ({ push_en[i], inject_en[i], pop_en[i]} )
564- 3'b001 : begin // pop_i = -1
565- cnt_en = 1'b1 ;
566- cnt_down = 1'b1 ;
567- cnt_delta = cnt_t ' (1 );
568- end
569- 3'b010 : begin // inject_i = +1
570- cnt_en = 1'b1 ;
571- cnt_down = 1'b0 ;
572- cnt_delta = cnt_t ' (1 );
573- end
574- // 3'b011, inject_i & pop_i = 0 --> use default
575- 3'b100 : begin // push_i = +1
576- cnt_en = 1'b1 ;
577- cnt_down = 1'b0 ;
578- cnt_delta = cnt_t ' (1 );
579- end
580- // 3'b101, push_i & pop_i = 0 --> use default
581- 3'b110 : begin // push_i & inject_i = +2
582- cnt_en = 1'b1 ;
583- cnt_down = 1'b0 ;
584- cnt_delta = cnt_t ' (2 );
585- end
586- 3'b111 : begin // push_i & inject_i & pop_i = +1
587- cnt_en = 1'b1 ;
588- cnt_down = 1'b0 ;
589- cnt_delta = cnt_t ' (1 );
590- end
591- default : begin // do nothing to the counters
592- cnt_en = 1'b0 ;
593- cnt_down = 1'b0 ;
594- cnt_delta = cnt_t ' (0 );
595- end
596- endcase
597- end
598-
599- delta_counter # (
600- .WIDTH ( CounterWidth ),
601- .STICKY_OVERFLOW ( 1'b0 )
602- ) i_in_flight_cnt (
603- .clk_i ( clk_i ),
604- .rst_ni ( rst_ni ),
605- .clear_i ( 1'b0 ),
606- .en_i ( cnt_en ),
607- .load_i ( 1'b0 ),
608- .down_i ( cnt_down ),
609- .delta_i ( cnt_delta ),
610- .d_i ( '0 ),
611- .q_o ( in_flight ),
612- .overflow_o ( overflow )
613- );
614- assign occupied[i] = | in_flight;
615- assign cnt_full[i] = overflow | (& in_flight);
616-
617- // holds the selection signal for this id
618- `FFLARN (mst_select_q[i], push_mst_select_i, push_en[i], '0 , clk_i, rst_ni)
619-
620- // pragma translate_off
621- `ifndef VERILATOR
622- `ifndef XSIM
623- // Validate parameters.
624- cnt_underflow : assert property (
625- @ (posedge clk_i) disable iff (~ rst_ni) (pop_en[i] | => ! overflow)) else
626- $fatal (1 , " axi_demux_id_counters > Counter: %0d underflowed.\
627- The reason is probably a faulty AXI response." , i);
628- `endif
629- `endif
630- // pragma translate_on
631- end
632- endmodule
633-
0 commit comments