@@ -44,14 +44,17 @@ localparam int unsigned DW = `HCI_SIZE_GET_DW(tcdm);
4444localparam int unsigned UW = `HCI_SIZE_GET_UW (tcdm);
4545localparam int unsigned IW = `HCI_SIZE_GET_IW (tcdm);
4646localparam int unsigned EW = `HCI_SIZE_GET_EW (tcdm);
47+ localparam int unsigned EHW = `HCI_SIZE_GET_EHW (tcdm);
4748
4849// this localparam is reused for all internal, non-ecc HCI interfaces
4950localparam hci_size_parameter_t `HCI_SIZE_PARAM (ldst_tcdm) = '{
5051 DW : DW ,
5152 AW : DEFAULT_AW ,
5253 BW : DEFAULT_BW ,
5354 UW : UW ,
54- IW : IW
55+ IW : IW ,
56+ EW : EW ,
57+ EHW : EHW
5558} ;
5659
5760// Virtual internal TCDM interface splitting the upstream TCDM
@@ -97,26 +100,35 @@ hci_outstanding_rob #(
97100 .in ( virt_tcdm[2 ] ),
98101 .out ( virt_tcdm_rob[2 ] )
99102);
100- hci_outstanding_rob # (
101- .ROB_NW ( ROB_NW ),
102- .`HCI_SIZE_PARAM (out) ( `HCI_SIZE_PARAM (ldst_tcdm) )
103- ) i_streamer_rob_z (
104- .clk_i ( clk_i ),
105- .rst_ni ( rst_ni ),
106- .in ( virt_tcdm[3 ] ),
107- .out ( virt_tcdm_rob[3 ] )
103+
104+ flags_fifo_t z_fifo_flags;
105+ logic [NumStreamSources: 0 ][$clog2 (NumStreamSources+ 1 )- 1 : 0 ] priority_encoding;
106+ assign priority_encoding[1 ] = 0 ;
107+ assign priority_encoding[2 ] = z_fifo_flags.full & ctrl_i.z_priority ? 3 : 1 ;
108+ assign priority_encoding[0 ] = 2 ;
109+ assign priority_encoding[3 ] = z_fifo_flags.full & ctrl_i.z_priority ? 1 : 3 ;
110+ hci_outstanding_fifo # (
111+ .FIFO_DEPTH ( ARRAY_WIDTH / 4 ),
112+ .`HCI_SIZE_PARAM (tcdm_initiator) ( `HCI_SIZE_PARAM (ldst_tcdm) )
113+ ) i_z_fifo (
114+ .clk_i ( clk_i ),
115+ .rst_ni ( rst_ni ),
116+ .clear_i ( clear_i ),
117+ .flags_o ( z_fifo_flags ),
118+ .tcdm_target ( virt_tcdm[3 ] ),
119+ .tcdm_initiator ( virt_tcdm_rob[3 ] )
108120);
109121
110122// XWYZ-MUX A single TCDM port is used to load XW and to store Z / load Y
111123hci_outstanding_mux # (
112- .NB_CHAN ( NumStreamSources+ 1 ),
124+ .NB_CHAN ( NumStreamSources+ 1 ),
113125 .`HCI_SIZE_PARAM (out) ( `HCI_SIZE_PARAM (ldst_tcdm) )
114126) i_ldst_mux (
115127 .clk_i ( clk_i ),
116128 .rst_ni ( rst_ni ),
117129 .clear_i ( clear_i ),
118- .priority_force_i ( '0 ),
119- .priority_i ( '0 ),
130+ .priority_force_i ( 1'b1 ),
131+ .priority_i ( priority_encoding ),
120132 .in ( virt_tcdm_rob ),
121133 .out ( tcdm )
122134);
@@ -184,11 +196,11 @@ assign z_store.req_id = zstream2cast.req_id;
184196assign z_store.req_valid = zstream2cast.req_valid;
185197assign zstream2cast.req_ready = z_store.req_ready;
186198// Right TCDM buses assignment.
187- assign zstream2cast.resp_data = z_store.resp_data ;
188- assign zstream2cast.resp_user = z_store.resp_user ;
189- assign zstream2cast.resp_id = z_store.resp_id ;
190- assign zstream2cast.resp_valid = z_store.resp_valid ;
191- assign z_store.resp_ready = zstream2cast.resp_ready ;
199+ assign zstream2cast.resp_data = '0 ;
200+ assign zstream2cast.resp_user = '0 ;
201+ assign zstream2cast.resp_id = '0 ;
202+ assign zstream2cast.resp_valid = 1'b1 ;
203+ assign z_store.resp_ready = 1'b1 ;
192204
193205// Assigning the store output to the store side of the y/z multiplexer.
194206hci_outstanding_assign i_store_assign ( .tcdm_target (z_store), .tcdm_initiator (virt_tcdm[3 ]) );
0 commit comments