@@ -79,7 +79,7 @@ architecture neorv32_cpu_frontend_rtl of neorv32_cpu_frontend is
7979
8080 -- instruction issue engine --
8181 signal align_q, align_set, align_clr : std_ulogic ;
82- signal ipb_ack : std_ulogic_vector (1 downto 0 );
82+ signal issue_valid : std_ulogic_vector (1 downto 0 );
8383 signal cmd16 : std_ulogic_vector (15 downto 0 );
8484 signal cmd32 : std_ulogic_vector (31 downto 0 );
8585
@@ -219,7 +219,7 @@ begin
219219 elsif rising_edge (clk_i) then
220220 if (fetch.restart = '1' ) then
221221 align_q <= ctrl_i.pc_nxt(1 ); -- branch to unaligned address?
222- elsif (ctrl_i.if_ack = '1' ) then
222+ elsif (ipb.re( 0 ) = '1' ) or (ipb.re( 1 ) = '1' ) then
223223 align_q <= (align_q and (not align_clr)) or align_set; -- alignment "RS flip-flop"
224224 end if ;
225225 end if ;
@@ -234,14 +234,14 @@ begin
234234 if (align_q = '0' ) then
235235 if (ipb.rdata(0 )(1 downto 0 ) /= "11" ) then -- compressed, consume IPB(0) entry
236236 align_set <= ipb.avail(0 ); -- start of next instruction word is NOT 32-bit-aligned
237- ipb_ack <= "01" ;
238- frontend_o.valid <= ipb.avail( 0 ) ;
237+ issue_valid( 0 ) <= ipb.avail( 0 ) ;
238+ issue_valid( 1 ) <= '0' ;
239239 frontend_o.fault <= ipb.rdata(0 )(16 );
240240 frontend_o.instr <= cmd32;
241241 frontend_o.compr <= '1' ;
242242 else -- aligned uncompressed, consume both IPB entries
243- ipb_ack <= "11" ;
244- frontend_o.valid <= ipb.avail(1 ) and ipb.avail(0 );
243+ issue_valid( 0 ) <= ipb.avail( 1 ) and ipb.avail( 0 ) ;
244+ issue_valid( 1 ) <= ipb.avail(1 ) and ipb.avail(0 );
245245 frontend_o.fault <= ipb.rdata(1 )(16 ) or ipb.rdata(0 )(16 );
246246 frontend_o.instr <= ipb.rdata(1 )(15 downto 0 ) & ipb.rdata(0 )(15 downto 0 );
247247 frontend_o.compr <= '0' ;
@@ -250,24 +250,27 @@ begin
250250 else
251251 if (ipb.rdata(1 )(1 downto 0 ) /= "11" ) then -- compressed, consume IPB(1) entry
252252 align_clr <= ipb.avail(1 ); -- start of next instruction word is 32-bit-aligned again
253- ipb_ack <= "10" ;
254- frontend_o.valid <= ipb.avail(1 );
253+ issue_valid( 0 ) <= '0' ;
254+ issue_valid( 1 ) <= ipb.avail(1 );
255255 frontend_o.fault <= ipb.rdata(1 )(16 );
256256 frontend_o.instr <= cmd32;
257257 frontend_o.compr <= '1' ;
258258 else -- unaligned uncompressed, consume both IPB entries
259- ipb_ack <= "11" ;
260- frontend_o.valid <= ipb.avail(0 ) and ipb.avail(1 );
259+ issue_valid( 0 ) <= ipb.avail( 0 ) and ipb.avail( 1 ) ;
260+ issue_valid( 1 ) <= ipb.avail(0 ) and ipb.avail(1 );
261261 frontend_o.fault <= ipb.rdata(0 )(16 ) or ipb.rdata(1 )(16 );
262262 frontend_o.instr <= ipb.rdata(0 )(15 downto 0 ) & ipb.rdata(1 )(15 downto 0 );
263263 frontend_o.compr <= '0' ;
264264 end if ;
265265 end if ;
266266 end process issue_fsm_comb;
267267
268+ -- issue valid instruction word to execution stage --
269+ frontend_o.valid <= issue_valid(1 ) or issue_valid(0 );
270+
268271 -- IPB read access --
269- ipb.re(0 ) <= ipb_ack (0 ) and ctrl_i.if_ack ;
270- ipb.re(1 ) <= ipb_ack (1 ) and ctrl_i.if_ack ;
272+ ipb.re(0 ) <= issue_valid (0 ) and ctrl_i.if_ready ;
273+ ipb.re(1 ) <= issue_valid (1 ) and ctrl_i.if_ready ;
271274
272275 end generate ; -- /issue_enabled
273276
@@ -277,10 +280,10 @@ begin
277280 align_q <= '0' ;
278281 align_set <= '0' ;
279282 align_clr <= '0' ;
280- ipb_ack <= (others => '0' );
283+ issue_valid <= (others => '0' );
281284 cmd16 <= (others => '0' );
282285 cmd32 <= (others => '0' );
283- ipb.re <= (others => ctrl_i.if_ack );
286+ ipb.re <= (others => ( ctrl_i.if_ready and ipb.avail( 0 )) );
284287 frontend_o.valid <= ipb.avail(0 );
285288 frontend_o.instr <= ipb.rdata(1 )(15 downto 0 ) & ipb.rdata(0 )(15 downto 0 );
286289 frontend_o.compr <= '0' ;
0 commit comments