forked from cores/microwatt
				
			
							parent
							
								
									185bcba6bb
								
							
						
					
					
						commit
						4685ff6bbb
					
				@ -0,0 +1,929 @@
 | 
			
		||||
-- Wishbone slave to packet bus
 | 
			
		||||
 | 
			
		||||
-- add way to reset (or do externally)
 | 
			
		||||
-- not obeying sel on local writes yet!
 | 
			
		||||
-- theoretically, this should work with slave-initiated packets like ints, even
 | 
			
		||||
--  if they intervene within a pending master command (unpreventable because of
 | 
			
		||||
--  concurrent xmits).
 | 
			
		||||
 | 
			
		||||
library ieee;
 | 
			
		||||
use ieee.std_logic_1164.all;
 | 
			
		||||
use ieee.numeric_std.all;
 | 
			
		||||
 | 
			
		||||
library work;
 | 
			
		||||
use work.wishbone_types.all;
 | 
			
		||||
use work.mc_pkg.all;
 | 
			
		||||
 | 
			
		||||
entity mc is
 | 
			
		||||
 | 
			
		||||
   generic(
 | 
			
		||||
      WB_AW          : integer := 32;        -- wishbone_addr_bits
 | 
			
		||||
      WB_DW          : integer := 64;        -- wishbone_data_bits
 | 
			
		||||
      OIB_DW         : integer := 8;
 | 
			
		||||
      OIB_RATIO      : integer := 0;         -- encode
 | 
			
		||||
      --WB_MAX_WR 	   : integer := 1;      -- could allow posted writes (no wait for ack)
 | 
			
		||||
--      BAR_BITS       : integer := 16;        -- in mc_pkg
 | 
			
		||||
      BAR_INIT       : std_ulogic_vector(BAR_BITS-1 downto 0) := x"FFFF" -- FFFFxxxx is local
 | 
			
		||||
	 );
 | 
			
		||||
    port(
 | 
			
		||||
      clk	         : in  std_ulogic;
 | 
			
		||||
      rst   	      : in  std_ulogic;
 | 
			
		||||
 | 
			
		||||
      wb_cyc         : in  std_ulogic;
 | 
			
		||||
      wb_stb         : in  std_ulogic;
 | 
			
		||||
      wb_we          : in  std_ulogic;
 | 
			
		||||
      wb_addr        : in  std_ulogic_vector(WB_AW-1 downto 0);
 | 
			
		||||
      wb_wr_data     : in  std_ulogic_vector(WB_DW-1 downto 0);
 | 
			
		||||
      wb_sel         : in  std_ulogic_vector((WB_DW/8)-1 downto 0);
 | 
			
		||||
      wb_ack         : out std_ulogic;
 | 
			
		||||
      wb_err         : out std_ulogic;
 | 
			
		||||
      wb_stall       : out std_ulogic;
 | 
			
		||||
      wb_rd_data     : out std_ulogic_vector(WB_DW-1 downto 0);
 | 
			
		||||
      
 | 
			
		||||
      oib_clk        : out std_ulogic;
 | 
			
		||||
      ob_data        : out std_ulogic_vector(OIB_DW-1 downto 0);
 | 
			
		||||
      ob_pty         : out std_ulogic;
 | 
			
		||||
      
 | 
			
		||||
      ib_data        : in  std_ulogic_vector(OIB_DW-1 downto 0);
 | 
			
		||||
      ib_pty         : in  std_ulogic;
 | 
			
		||||
      
 | 
			
		||||
      err            : out std_ulogic;      
 | 
			
		||||
      int            : out std_ulogic
 | 
			
		||||
    );
 | 
			
		||||
end mc;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
architecture mc of mc is
 | 
			
		||||
 | 
			
		||||
-- ff
 | 
			
		||||
signal config_d, config_q, config_rst: T_Config;
 | 
			
		||||
signal config_data : std_ulogic_vector(WB_DW-1 downto 0);
 | 
			
		||||
 | 
			
		||||
signal wbseq_d, wbseq_q : std_ulogic_vector(3 downto 0);
 | 
			
		||||
signal wb_in_d, wb_in_q : wishbone_master_out;
 | 
			
		||||
signal wb_out_d, wb_out_q : wishbone_slave_out;
 | 
			
		||||
 | 
			
		||||
signal oclk_d, oclk_q : std_ulogic;
 | 
			
		||||
signal oclk_last_d, oclk_last_q : std_ulogic;
 | 
			
		||||
signal odata_d, odata_q : std_ulogic_vector(OIB_DW-1 downto 0);
 | 
			
		||||
signal opty_d, opty_q : std_ulogic;
 | 
			
		||||
signal oseq_d, oseq_q : std_ulogic_vector(3 downto 0);
 | 
			
		||||
signal oclk_cnt_d, oclk_cnt_q : std_ulogic_vector(15 downto 0);
 | 
			
		||||
signal odata_cnt_d, odata_cnt_q : std_ulogic_vector(2 downto 0);
 | 
			
		||||
 | 
			
		||||
signal idata_d, idata_q : std_ulogic_vector(OIB_DW-1 downto 0);
 | 
			
		||||
signal ipty_d, ipty_q : std_ulogic;
 | 
			
		||||
signal iseq_d, iseq_q : std_ulogic_vector(3 downto 0);
 | 
			
		||||
signal icapture_d, icapture_q : std_ulogic;
 | 
			
		||||
signal idata_cnt_d, idata_cnt_q : std_ulogic_vector(2 downto 0);
 | 
			
		||||
 | 
			
		||||
-- misc
 | 
			
		||||
signal wbseq_err : std_ulogic;
 | 
			
		||||
signal wb_req, wb_req_err, wb_local, wb_local_rd, wb_local_wr, wb_remote_rd, wb_remote_wr, wb_req_stall, wb_sync : std_ulogic;
 | 
			
		||||
signal rd_data_load : std_ulogic_vector(WB_DW-1 downto 0);
 | 
			
		||||
signal ob_busy, ob_stall : std_ulogic;
 | 
			
		||||
signal local_rd_data : std_ulogic_vector(WB_DW-1 downto 0);
 | 
			
		||||
signal ob_header : std_ulogic_vector(OIB_DW-1 downto 0);
 | 
			
		||||
 | 
			
		||||
signal oclk_advance, ob_complete, oseq_err, oseq_hold, iseq_err, rd_err, wr_err : std_ulogic;
 | 
			
		||||
signal odata_clear, odata_advance, oaddr_last, odata_last, odata_ld_header, odata_ld_addr, odata_ld_sel, odata_ld_data : std_ulogic;
 | 
			
		||||
signal oaddr_mux : std_ulogic_vector(7 downto 0);
 | 
			
		||||
signal odata_mux : std_ulogic_vector(7 downto 0);
 | 
			
		||||
signal ib_complete : std_ulogic;
 | 
			
		||||
signal oclk_match : std_ulogic;
 | 
			
		||||
signal oclk_toggle : std_ulogic_vector(15 downto 0);  
 | 
			
		||||
signal config_write : std_ulogic;
 | 
			
		||||
signal wb_rd_resp, idata_clear : std_ulogic;
 | 
			
		||||
signal link_req_o, link_rsp_o, link_req_i, link_rsp_i : std_ulogic;
 | 
			
		||||
signal rd8_rsp, wr8_rsp, cache_inv, sync_ack, int_req : std_ulogic;
 | 
			
		||||
signal bad_header, good_header, pty_err, ld_rd_data : std_ulogic;
 | 
			
		||||
signal iseq_idle, idle_header, rd_rsp_data_done, rd_rsp_complete, wr_rsp_complete, int_req_complete, save_header : std_ulogic;
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
 | 
			
		||||
-- these could sample the input bus for several of the bits on reset, but you need to know how wide the bus is
 | 
			
		||||
-- maybe use another pin to determine if config_pins or hardcoded default are used
 | 
			
		||||
--config_pins <= 
 | 
			
		||||
 | 
			
		||||
config_rst <= (oib_en => '1', oib_width => bus_width_enc(OIB_DW), oib_ratio => bus_ratio_enc(OIB_RATIO), cpol => '0', cpha => '0',
 | 
			
		||||
               ib_en_pck => '1', rsvd0 => (others => '0'), int_req => '1', bar_en => '1',
 | 
			
		||||
               bar => BAR_INIT, 
 | 
			
		||||
               rsvd1 => (others => '0'),
 | 
			
		||||
               idle_flit => (others => '0'), rcv_header => (others => '0'), 
 | 
			
		||||
               err => (others => '0')
 | 
			
		||||
               );
 | 
			
		||||
 | 
			
		||||
config_data <= config_q.oib_en & config_q.oib_width & config_q.oib_ratio &                                                 -- 63:56
 | 
			
		||||
               config_q.cpol & config_q.cpha & config_q.ib_en_pck & config_q.rsvd0 & config_q.int_req & config_q.bar_en &  -- 55:48
 | 
			
		||||
               config_q.bar &                                                                                              -- 47:32
 | 
			
		||||
               config_q.rsvd1 &                                                                                            -- 31:24
 | 
			
		||||
               config_q.idle_flit & config_q.rcv_header &                                                                  -- 23:08
 | 
			
		||||
               config_q.err;                                                                                               -- 07:00
 | 
			
		||||
 | 
			
		||||
int <= config_q.int_req;
 | 
			
		||||
--err <= or_reduce(config_q.err);
 | 
			
		||||
err <= config_q.err(7) or config_q.err(6) or config_q.err(5) or config_q.err(4) or config_q.err(3) or config_q.err(2) or config_q.err(1) or config_q.err(0);
 | 
			
		||||
 | 
			
		||||
-- normal FF
 | 
			
		||||
FF: process(clk) begin
 | 
			
		||||
	
 | 
			
		||||
if rising_edge(clk) then
 | 
			
		||||
	
 | 
			
		||||
   if rst = '1' then 
 | 
			
		||||
	   
 | 
			
		||||
      config_q <= config_rst; 
 | 
			
		||||
      wb_in_q <= wishbone_master_out_init;
 | 
			
		||||
      wb_out_q <= wishbone_slave_out_init;
 | 
			
		||||
      oclk_q  <= '0';
 | 
			
		||||
      oclk_last_q <= '0';
 | 
			
		||||
      odata_q <= (others => '0');
 | 
			
		||||
      opty_q  <= '1';
 | 
			
		||||
      wbseq_q <= (others => '1');      
 | 
			
		||||
      oseq_q <= (others => '1');
 | 
			
		||||
      iseq_q <= (others => '1');  
 | 
			
		||||
      oclk_cnt_q <= (others => '0');
 | 
			
		||||
      odata_cnt_q <= (others => '0');
 | 
			
		||||
      idata_cnt_q <= (others => '0');      
 | 
			
		||||
      icapture_q <= '0';     
 | 
			
		||||
      idata_q <= (others => '0');
 | 
			
		||||
      ipty_q  <= '1';
 | 
			
		||||
                  	                	              
 | 
			
		||||
	else
 | 
			
		||||
	    
 | 
			
		||||
	   config_q <= config_d;
 | 
			
		||||
	   wb_in_q <= wb_in_d;
 | 
			
		||||
	   wb_out_q <= wb_out_d;
 | 
			
		||||
	   oclk_q <= oclk_d;
 | 
			
		||||
	   oclk_last_q <= oclk_last_d;
 | 
			
		||||
	   odata_q <= odata_d;
 | 
			
		||||
	   opty_q <= opty_d;
 | 
			
		||||
	   wbseq_q <= wbseq_d;
 | 
			
		||||
      oseq_q <= oseq_d;
 | 
			
		||||
      iseq_q <= iseq_d;
 | 
			
		||||
      oclk_cnt_q <= oclk_cnt_d;
 | 
			
		||||
      odata_cnt_q <= odata_cnt_d;
 | 
			
		||||
      idata_cnt_q <= idata_cnt_d;
 | 
			
		||||
      icapture_q <= icapture_d;
 | 
			
		||||
      idata_q <= idata_d;
 | 
			
		||||
      ipty_q  <= ipty_d;
 | 
			
		||||
         
 | 
			
		||||
   end if;
 | 
			
		||||
	
 | 
			
		||||
end if;
 | 
			
		||||
	
 | 
			
		||||
end process FF;
 | 
			
		||||
 | 
			
		||||
-- do something
 | 
			
		||||
 | 
			
		||||
-- latch master - cyc/stb should be a single valid 
 | 
			
		||||
 | 
			
		||||
wb_req <= wb_cyc and wb_stb and not wb_out_q.stall;
 | 
			
		||||
wb_in_d.cyc <= '1' when wb_req = '1' else (wb_in_q.cyc and not wb_out_q.ack);
 | 
			
		||||
wb_in_d.stb <= '1' when wb_req = '1' else (wb_in_q.stb and not wb_out_q.ack);
 | 
			
		||||
wb_in_d.we  <= wb_we  when wb_req = '1' else wb_in_q.we;
 | 
			
		||||
wb_in_d.adr <= wb_addr when wb_req = '1' else wb_in_q.adr;
 | 
			
		||||
wb_in_d.dat <= wb_wr_data when wb_req = '1' else wb_in_q.dat;
 | 
			
		||||
wb_in_d.sel <= wb_sel when wb_req = '1' else wb_in_q.sel;
 | 
			
		||||
 | 
			
		||||
-- process req
 | 
			
		||||
 | 
			
		||||
-- move to unlatched
 | 
			
		||||
--wb_local <= config_q.bar_en and eq(wb_in_q.adr(WB_AW-1 downto WB_AW-BAR_BITS), config_q.bar);
 | 
			
		||||
wb_local <= config_q.bar_en and eq(wb_addr(WB_AW-1 downto WB_AW-BAR_BITS), config_q.bar);
 | 
			
		||||
 | 
			
		||||
-- should be able to ack immediately rather than send latched (skip ack cycle in seq, send _d)
 | 
			
		||||
 | 
			
		||||
--tbl WBSlaveSeq
 | 
			
		||||
--n wbseq_q                             wbseq_d                
 | 
			
		||||
--n |     wb_req                        |             
 | 
			
		||||
--n |     |                             |     wb_local_rd                         
 | 
			
		||||
--n |     | wb_we                       |     |wb_local_wr   
 | 
			
		||||
--n |     | |                           |     ||wb_remote_rd   
 | 
			
		||||
--n |     | |                           |     |||wb_remote_wr                                                          
 | 
			
		||||
--n |     | |                           |     |||| wb_out_d.stall
 | 
			
		||||
--n |     | |  wb_local                 |     |||| |wb_out_d.ack            
 | 
			
		||||
--n |     | |  | ob_complete            |     |||| || oseq_hold             
 | 
			
		||||
--n |     | |  | |rd_rsp_complete       |     |||| || |    
 | 
			
		||||
--n |     | |  | ||wr_rsp_complete      |     |||| || |                    
 | 
			
		||||
--n |     | |  | |||                    |     |||| || |   wbseq_err
 | 
			
		||||
--b 3210  | |  | |||                    3210  |||| || |   |
 | 
			
		||||
--t iiii  i i  i iii                    oooo  oooo oo o   o
 | 
			
		||||
--*--------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
--*-- Idle ------------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 1111  0 -  - ---                    1111  0000 00 0   0              * zzz..zzz....     
 | 
			
		||||
--s 1111  1 0  1 ---                    0001  1000 10 0   0              * read local
 | 
			
		||||
--s 1111  1 1  1 ---                    0010  0100 10 0   0              * write local
 | 
			
		||||
--s 1111  1 0  0 ---                    0100  0010 10 0   0              * read remote
 | 
			
		||||
--s 1111  1 1  0 ---                    1000  0001 10 0   0              * write remote
 | 
			
		||||
--*-- Read Local ------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0001  - -  - ---                    1110  0000 11 0   0              * read ack
 | 
			
		||||
--*-- Write Local -----------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0010  - -  - ---                    1110  0000 11 0   0              * write ack
 | 
			
		||||
--*-- Read Remote -----------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0100  - -  - ---                    ----  0010 10 0   0              *
 | 
			
		||||
--s 0100  - -  - 0--                    0100  ---- -- -   -              * read send
 | 
			
		||||
--s 0100  - -  - 1--                    0101  ---- -- -   -              * read sent
 | 
			
		||||
--*-- Read Remote Wait ------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0101  - -  - ---                    ----  0010 10 1   0              *
 | 
			
		||||
--s 0101  - -  - -0-                    0101  ---- -- -   -              * wait for response
 | 
			
		||||
--s 0101  - -  - -1-                    0110  ---- -- -   -              * response received
 | 
			
		||||
--*-- Read Remote Done-------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0110  - -  - -0-                    1110  0010 11 1   0              * read ack
 | 
			
		||||
--*-- Write Remote ----------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 1000  - -  - ---                    ----  0001 10 0   0              *
 | 
			
		||||
--s 1000  - -  - 0--                    1000  ---- -- -   -              * write send
 | 
			
		||||
--s 1000  - -  - 1--                    1001  ---- -- -   -              * write sent
 | 
			
		||||
--*-- Write Remote Wait -----------------------------------------------------------------------------------------------
 | 
			
		||||
--s 1001  - -  - ---                    ----  0001 10 1   0              *
 | 
			
		||||
--s 1001  - -  - --0                    1001  ---- -- -   -              * wait for response
 | 
			
		||||
--s 1001  - -  - --1                    1010  ---- -- -   -              * response received
 | 
			
		||||
--*-- Write Remote Done -----------------------------------------------------------------------------------------------
 | 
			
		||||
--s 1010  - -  - ---                    1110  0000 11 1   0              * write ack
 | 
			
		||||
--*-- Ack Cycle -------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 1110  - -  - ---                    1111  0000 00 1   0              * last cycle of stall; ack=1
 | 
			
		||||
--*-- ERROR -----------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0000  - -  - ---                    0000  0000 00 0   1     
 | 
			
		||||
--s 0011  - -  - ---                    0011  0000 00 0   1         
 | 
			
		||||
--s 0111  - -  - ---                    0111  0000 00 0   1  
 | 
			
		||||
--s 1011  - -  - ---                    1011  0000 00 0   1      
 | 
			
		||||
--s 1100  - -  - ---                    1100  0000 00 0   1                                                          
 | 
			
		||||
--s 1101  - -  - ---                    1101  0000 00 0   1                                                                                                              
 | 
			
		||||
--*--------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
--tbl WBSlaveSeq
 | 
			
		||||
 | 
			
		||||
-- local
 | 
			
		||||
 | 
			
		||||
-- move to unlatched
 | 
			
		||||
--config_write <= wb_local_wr and eq(wb_in_q.adr(31-BAR_BITS downto 0), 0);
 | 
			
		||||
config_write <= wb_local_wr and eq(wb_addr(31-BAR_BITS downto 0), 0);
 | 
			
		||||
 | 
			
		||||
config_d.oib_en    <= wb_in_d.dat(63)           when config_write = '1' else config_q.oib_en;
 | 
			
		||||
config_d.oib_ratio <= wb_in_d.dat(62 downto 59) when config_write = '1' else config_q.oib_ratio;
 | 
			
		||||
config_d.oib_width <= wb_in_d.dat(58 downto 56) when config_write = '1' else config_q.oib_width;
 | 
			
		||||
config_d.cpol      <= wb_in_d.dat(55)           when config_write = '1' else config_q.cpol;
 | 
			
		||||
config_d.cpha      <= wb_in_d.dat(54)           when config_write = '1' else config_q.cpha;
 | 
			
		||||
config_d.ib_en_pck <= wb_in_d.dat(50)           when config_write = '1' else config_q.ib_en_pck;
 | 
			
		||||
config_d.rsvd0     <= wb_in_d.dat(53 downto 51) when config_write = '1' else config_q.rsvd0;
 | 
			
		||||
config_d.int_req   <= wb_in_d.dat(49)           when config_write = '1' else (config_q.int_req or int_req_complete);
 | 
			
		||||
config_d.bar_en    <= wb_in_d.dat(48)           when config_write = '1' else config_q.bar_en;
 | 
			
		||||
config_d.bar       <= wb_in_d.dat(47 downto 32) when config_write = '1' else config_q.bar;
 | 
			
		||||
config_d.rsvd1     <= wb_in_d.dat(31 downto 24) when config_write = '1' else config_q.rsvd1;
 | 
			
		||||
config_d.idle_flit <= wb_in_d.dat(23 downto 16) when config_write = '1' else config_q.idle_flit;
 | 
			
		||||
-- or write once until cleared?
 | 
			
		||||
config_d.rcv_header <= wb_in_d.dat(15 downto 8) when config_write = '1' else
 | 
			
		||||
  gate_and(save_header, idata_q) or gate_and(not save_header, config_q.rcv_header);
 | 
			
		||||
 | 
			
		||||
config_d.err <= wb_in_d.dat(7 downto 0) when config_write = '1' else 
 | 
			
		||||
  (config_q.err(7) or wbseq_err) & (config_q.err(6) or oseq_err) & (config_q.err(5) or iseq_err) & (config_q.err(4) or rd_err) &
 | 
			
		||||
  (config_q.err(3) or wr_err) & (config_q.err(2) or pty_err) & (config_q.err(1) or bad_header) & config_q.err(0);
 | 
			
		||||
 | 
			
		||||
-- outputs
 | 
			
		||||
wb_stall   <= wb_out_q.stall;  
 | 
			
		||||
wb_ack     <= wb_out_q.ack;    
 | 
			
		||||
wb_rd_data <= wb_out_q.dat;
 | 
			
		||||
wb_err     <= '0';
 | 
			
		||||
 | 
			
		||||
-- send 
 | 
			
		||||
 | 
			
		||||
wb_sync <= '0';
 | 
			
		||||
link_req_o <= '0';
 | 
			
		||||
link_rsp_o <= '0';
 | 
			
		||||
 | 
			
		||||
--tbl HeaderEncode
 | 
			
		||||
--n wb_remote_rd                        ob_header
 | 
			
		||||
--n |wb_remote_wr                       |       
 | 
			
		||||
--n ||wb_sync                           |                            
 | 
			
		||||
--n |||     link_req_o                  |       
 | 
			
		||||
--n |||     |link_rsp_o                 |       
 | 
			
		||||
--n |||     ||                          |                                                                         
 | 
			
		||||
--n |||     ||                          |    
 | 
			
		||||
--b |||     ||                          76543210 
 | 
			
		||||
--t iii     ii                          oooooooo             
 | 
			
		||||
--*-------------------------------------------------
 | 
			
		||||
--s 1--     --                          00000010    * read 8B
 | 
			
		||||
--s -1-     --                          00000011    * write 8B
 | 
			
		||||
--s --1     --                          01000000    * sync and code
 | 
			
		||||
--s ---     1-                          11110000    * link req and code
 | 
			
		||||
--s ---     -1                          11111000    * link rsp and code
 | 
			
		||||
--*-------------------------------------------------
 | 
			
		||||
 | 
			
		||||
--tbl HeaderEncode
 | 
			
		||||
 | 
			
		||||
-- bus clock
 | 
			
		||||
 | 
			
		||||
with config_q.oib_ratio select
 | 
			
		||||
   oclk_toggle <= x"0000" when "0000",  -- toggle every clk    2:1 * fails right now *
 | 
			
		||||
                  x"0001" when "0001",  -- toggle every 2      4:1
 | 
			
		||||
                  x"0002" when "0010",  -- toggle every 3      6:1
 | 
			
		||||
                  x"0004" when "0011",  -- toggle every 5     10:1
 | 
			
		||||
                  x"0008" when "0100",  -- toggle every 9     18:1
 | 
			
		||||
                  x"0010" when "0101",  -- toggle every 17    34:1
 | 
			
		||||
                  x"0020" when "0110",  -- toggle every 33    66:1
 | 
			
		||||
                  x"0040" when "0111",  -- toggle every 65   130:1
 | 
			
		||||
                  x"0080" when "1000",  -- toggle every 129  258:1                  
 | 
			
		||||
                  x"0100" when "1001",  -- toggle every 257  514:1                                                     
 | 
			
		||||
                  x"0200" when others;  -- toggle every 513 1026:1                  
 | 
			
		||||
 | 
			
		||||
oclk_match <= eq(oclk_cnt_q, oclk_toggle);
 | 
			
		||||
 | 
			
		||||
oclk_cnt_d <= gate_and(not config_q.oib_en or config_write, x"0000") or
 | 
			
		||||
              gate_and(config_q.oib_en and not config_write and oclk_match, x"0000") or
 | 
			
		||||
              gate_and(config_q.oib_en and not config_write and not oclk_match, inc(oclk_cnt_q));
 | 
			
		||||
   
 | 
			
		||||
oclk_advance <= oclk_match and oclk_q;
 | 
			
		||||
 | 
			
		||||
oib_clk <= oclk_q;
 | 
			
		||||
 | 
			
		||||
oclk_d      <= (oclk_q xor oclk_match) and config_q.oib_en;
 | 
			
		||||
oclk_last_d <= oclk_q and config_q.oib_en;
 | 
			
		||||
 | 
			
		||||
-- cpol not used; clock always running  
 | 
			
		||||
 | 
			
		||||
with config_q.cpha select 
 | 
			
		||||
   icapture_d <= not oclk_last_q and oclk_q and config_q.oib_en when '0',     -- rising 
 | 
			
		||||
                 oclk_last_q and not oclk_q and config_q.oib_en when others;  -- falling
 | 
			
		||||
 | 
			
		||||
-- output
 | 
			
		||||
 | 
			
		||||
--tbl SendSeq
 | 
			
		||||
--
 | 
			
		||||
--n oseq_q                              oseq_d
 | 
			
		||||
--n |    oseq_hold                      |                       
 | 
			
		||||
--n |    |wb_remote_rd                  |     odata_ld_header    
 | 
			
		||||
--n |    ||wb_remote_wr                 |     |odata_ld_addr         
 | 
			
		||||
--n |    |||                            |     ||odata_ld_sel
 | 
			
		||||
--n |    |||   oclk_advance             |     |||odata_clear          
 | 
			
		||||
--n |    |||   |oaddr_last              |     ||||odata_ld_data
 | 
			
		||||
--n |    |||   ||odata_last             |     ||||| ob_complete
 | 
			
		||||
--n |    |||   |||                      |     ||||| |        
 | 
			
		||||
--n |    |||   |||                      |     ||||| |   oseq_err
 | 
			
		||||
--b 3210 |||   |||                      3210  ||||| |   |
 | 
			
		||||
--t iiii iii   iii                      oooo  ooooo o   o
 | 
			
		||||
--*-------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
--*-- Idle -----------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 1111 1--   ---                      1111  00010 0   0               * zzz..zzz...  
 | 
			
		||||
--s 1111 -00   ---                      1111  00010 0   0               * zzz..zzz...              
 | 
			
		||||
--s 1111 0--   0--                      1111  00010 0   0               * ...slow...
 | 
			
		||||
--s 1111 01-   1--                      0001  10000 0   0               * start read
 | 
			
		||||
--s 1111 0-1   1--                      0001  10000 0   0               * start write
 | 
			
		||||
--*-- Remote Header --------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0001 ---   0--                      0001  00000 0   0               * ...slow...
 | 
			
		||||
--s 0001 -1-   1--                      0010  01000 0   0               * begin address
 | 
			
		||||
--s 0001 --1   1--                      0010  01000 0   0               * begin address
 | 
			
		||||
--*-- Remote Address -------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0010 ---   0--                      0010  01000 0   0               * ...slow...
 | 
			
		||||
--s 0010 ---   10-                      0010  01000 0   0               * sending addr
 | 
			
		||||
--s 0010 --0   11-                      1111  00010 1   0               * finish read request
 | 
			
		||||
--s 0010 --1   11-                      0011  00110 0   0               * begin write sel
 | 
			
		||||
--*-- Remote Write (Sel) ---------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0011 ---   0--                      0011  00000 0   0               * ...slow...
 | 
			
		||||
--s 0011 ---   1--                      0100  00001 0   0               * begin write data
 | 
			
		||||
--*-- Remote Write (Data) --------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0100 ---   0--                      0100  00001 0   0               * ...slow...
 | 
			
		||||
--s 0100 ---   1-0                      0100  00001 0   0               * sending data
 | 
			
		||||
--s 0100 ---   1-1                      1111  00001 1   0               * finish write request
 | 
			
		||||
--*-- ERROR ----------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0000 ---   ---                      0000  00000 0   1    
 | 
			
		||||
--s 0101 ---   ---                      0101  00000 0   1             
 | 
			
		||||
--s 0110 ---   ---                      0110  00000 0   1             
 | 
			
		||||
--s 0111 ---   ---                      0111  00000 0   1             
 | 
			
		||||
--s 1000 ---   ---                      1000  00000 0   1             
 | 
			
		||||
--s 1001 ---   ---                      1001  00000 0   1        
 | 
			
		||||
--s 1010 ---   ---                      1010  00000 0   1                      
 | 
			
		||||
--s 1011 ---   ---                      1011  00000 0   1                      
 | 
			
		||||
--s 1100 ---   ---                      1100  00000 0   1                      
 | 
			
		||||
--s 1101 ---   ---                      1101  00000 0   1                      
 | 
			
		||||
--s 1110 ---   ---                      1110  00000 0   1                                    
 | 
			
		||||
--*-------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
--tbl SendSeq
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- 4 xfer for addr, 8 xfer for data
 | 
			
		||||
odata_cnt_d <= gate_and(odata_clear, "000") or
 | 
			
		||||
               gate_and(odata_advance and odata_ld_addr, inc(odata_cnt_q)) or  -- no clear?
 | 
			
		||||
               gate_and(odata_advance and odata_ld_data, inc(odata_cnt_q)) or  -- no clear?
 | 
			
		||||
               gate_and(not odata_clear and not(odata_advance and (odata_ld_addr or odata_ld_data)), odata_cnt_q);  
 | 
			
		||||
 | 
			
		||||
oaddr_last <= eq(odata_cnt_q, 4);
 | 
			
		||||
odata_last <= eq(odata_cnt_q, 7);
 | 
			
		||||
 | 
			
		||||
with odata_cnt_q select 
 | 
			
		||||
   oaddr_mux <= wb_in_q.adr(7 downto 0)   when "000",
 | 
			
		||||
                wb_in_q.adr(15 downto 8)  when "001",
 | 
			
		||||
                wb_in_q.adr(23 downto 16) when "010", 
 | 
			
		||||
                wb_in_q.adr(31 downto 24) when others;
 | 
			
		||||
 | 
			
		||||
with odata_cnt_q select
 | 
			
		||||
   odata_mux <= wb_in_q.dat(7 downto 0)   when "000",
 | 
			
		||||
                wb_in_q.dat(15 downto 8)  when "001",  
 | 
			
		||||
                wb_in_q.dat(23 downto 16) when "010",  
 | 
			
		||||
                wb_in_q.dat(31 downto 24) when "011",  
 | 
			
		||||
                wb_in_q.dat(39 downto 32) when "100",  
 | 
			
		||||
                wb_in_q.dat(47 downto 40) when "101",                  
 | 
			
		||||
                wb_in_q.dat(55 downto 48) when "110",  
 | 
			
		||||
                wb_in_q.dat(63 downto 56) when others;     
 | 
			
		||||
                
 | 
			
		||||
--wtf fix this to look normal                
 | 
			
		||||
odata_d <= gate_and(odata_clear and odata_advance, config_q.idle_flit) or
 | 
			
		||||
           gate_and(odata_ld_header, ob_header) or
 | 
			
		||||
           gate_and(odata_ld_addr and odata_advance, oaddr_mux) or
 | 
			
		||||
           gate_and(odata_ld_sel, wb_in_q.sel) or
 | 
			
		||||
           gate_and(odata_ld_data and odata_advance, odata_mux) or
 | 
			
		||||
           gate_and(not odata_ld_header and not odata_ld_sel and 
 | 
			
		||||
                    not(odata_ld_addr and odata_advance) and
 | 
			
		||||
                    not odata_ld_sel and 
 | 
			
		||||
                    not(odata_ld_data and odata_advance) and
 | 
			
		||||
                    not(odata_clear and odata_advance), odata_q);
 | 
			
		||||
 | 
			
		||||
opty_d <= not(odata_d(7) xor odata_d(6) xor odata_d(5) xor odata_d(4) xor odata_d(3) xor odata_d(2) xor odata_d(1) xor odata_d(0));                                                                                                          
 | 
			
		||||
 | 
			
		||||
odata_advance <= oclk_advance; -- oclk_match and not oclk_q and odata_ld_data;
 | 
			
		||||
 | 
			
		||||
ob_data <= odata_q;
 | 
			
		||||
ob_pty  <= opty_q;
 | 
			
		||||
 | 
			
		||||
-- input
 | 
			
		||||
 | 
			
		||||
with icapture_d select
 | 
			
		||||
   idata_d <= ib_data when '1',
 | 
			
		||||
              idata_q when others;
 | 
			
		||||
              
 | 
			
		||||
with icapture_d select
 | 
			
		||||
   ipty_d <= ib_pty when '1',
 | 
			
		||||
             ipty_q when others;
 | 
			
		||||
             
 | 
			
		||||
 | 
			
		||||
--tbl HeaderDecode
 | 
			
		||||
--n idata_q  wb_remote_rd               rd8_rsp
 | 
			
		||||
--n |        |wb_remote_wr              |wr8_rsp
 | 
			
		||||
--n |        ||                         ||int_req               
 | 
			
		||||
--n |        ||                         |||sync_ack     
 | 
			
		||||
--n |        ||                         ||||cache_inv    
 | 
			
		||||
--n |        ||                         |||||link_req_i                                                     
 | 
			
		||||
--n |        ||                         ||||||link_rsp_i
 | 
			
		||||
--n |        ||                         |||||||
 | 
			
		||||
--n |        ||                         ||||||| good_header 
 | 
			
		||||
--n |        ||                         ||||||| | 
 | 
			
		||||
--b 76543210 ||                         ||||||| | 
 | 
			
		||||
--t iiiiiiii ii                         ooooooo o               
 | 
			
		||||
--*-------------------------------------------------
 | 
			
		||||
--s 1000--10 1-                         1000000 1    * read 8B resp and code
 | 
			
		||||
--s 1000--11 -1                         0100000 1    * write 8B ack and code
 | 
			
		||||
--s 11000--- --                         0001000 1    * sync_ack and code (thread, type, etc.)
 | 
			
		||||
--s 11001--- --                         0000100 1    * cache inv
 | 
			
		||||
--s 11010--- --                         0010000 1    * int_req and code (ext, crit, stop, fry)
 | 
			
		||||
--s 11110--- --                         0000010 1    * link req and code
 | 
			
		||||
--s 11111--- --                         0000001 1    * link rsp and code
 | 
			
		||||
--*-------------------------------------------------
 | 
			
		||||
--tbl HeaderDecode
 | 
			
		||||
 | 
			
		||||
idle_header <= eq(idata_q, config_q.idle_flit);
 | 
			
		||||
bad_header <= iseq_idle and icapture_q and not idle_header and not good_header;
 | 
			
		||||
pty_err <= icapture_q and not(idata_q(0) xor idata_q(1) xor idata_q(2) xor idata_q(3) xor idata_q(4) xor idata_q(5) xor idata_q(6) xor idata_q(7) xor ipty_q);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
--tbl RecvSeq
 | 
			
		||||
--
 | 
			
		||||
--n iseq_q                              iseq_d
 | 
			
		||||
--n |    icapture_q                     |   
 | 
			
		||||
--n |    |idle_header                   |    ld_rd_data             
 | 
			
		||||
--n |    ||rd8_rsp                      |    |rd_rsp_complete                   
 | 
			
		||||
--n |    |||wr8_rsp                     |    ||wr_rsp_complete                       
 | 
			
		||||
--n |    ||||int_req                    |    |||int_req_complete 
 | 
			
		||||
--n |    |||||sync_ack                  |    ||||                       
 | 
			
		||||
--n |    ||||||cache_inv                |    ||||                
 | 
			
		||||
--n |    |||||||link_req_i              |    ||||                     
 | 
			
		||||
--n |    ||||||||link_rsp_i             |    ||||  idata_clear            
 | 
			
		||||
--n |    |||||||||  bad_header          |    ||||  |save_header
 | 
			
		||||
--n |    |||||||||  |                   |    ||||  ||                                 
 | 
			
		||||
--n |    |||||||||  |  rd_rsp_data_done |    ||||  ||     iseq_idle                    
 | 
			
		||||
--n |    |||||||||  |  |                |    ||||  ||     |iseq_err                           
 | 
			
		||||
--b 3210 |||||||||  |  |                3210 ||||  ||     ||
 | 
			
		||||
--t iiii iiiiiiiii  i  i                oooo oooo  oo     oo   
 | 
			
		||||
--*-------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
--*-- Idle -----------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 1111 ---------  -  -                ---- ----  --     10
 | 
			
		||||
--s 1111 0--------  -  -                1111 0000  10     --            * zzz..zzz...  
 | 
			
		||||
--s 1111 11-------  -  -                1111 0000  10     --            * idle
 | 
			
		||||
--s 1111 1--------  1  -                0110 0000  00     --            * bad header   
 | 
			
		||||
--s 1111 1-1------  -  -                1000 0000  00     --            * rd8 response
 | 
			
		||||
--s 1111 1--1-----  -  -                0001 0000  00     --            * wr8 ack
 | 
			
		||||
--s 1111 1---1----  -  -                0010 0000  00     --            * int req
 | 
			
		||||
--s 1111 1----1---  -  -                0110 0000  00     --            * other response
 | 
			
		||||
--s 1111 1-----1--  -  -                0110 0000  00     --            * other response
 | 
			
		||||
--s 1111 1------1-  -  -                0110 0000  00     --            * other response
 | 
			
		||||
--s 1111 1-------1  -  -                0110 0000  00     --            * other response
 | 
			
		||||
--*-- Rd Resp --------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 1000 0 -------  -  -                1000 0000  00     00            * ...slow...
 | 
			
		||||
--s 1000 1 -------  -  0                1000 1000  00     00            * Dx
 | 
			
		||||
--s 1000 1 -------  -  1                1111 1100  00     00            * Dlast
 | 
			
		||||
--*-- Wr Ack ---------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0001 - -------  -  -                1111 0010  00     00            * ack + code
 | 
			
		||||
--*-- Int Req --------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0010 - -------  -  -                1111 0001  01     00            * int + code
 | 
			
		||||
--*-- Unknown Header -------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0110 - -------  -  -                0111 0000  01     00            * save header and wait for idle bus
 | 
			
		||||
--*-- Wait for Idle --------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0111 0 -------  -  -                0110 0000  00     00            * ...slow...
 | 
			
		||||
--s 0111 11-------  -  -                1111 0000  00     00            * idle
 | 
			
		||||
--s 0111 10-------  -  -                0110 0000  00     00            * non-idle
 | 
			
		||||
--*-- ERROR ----------------------------------------------------------------------------------------------------------
 | 
			
		||||
--s 0000 ---------  -  -                0000 0000  00     01   
 | 
			
		||||
--s 0011 ---------  -  -                0011 0000  00     01           
 | 
			
		||||
--s 0100 ---------  -  -                0100 0000  00     01           
 | 
			
		||||
--s 0101 ---------  -  -                0101 0000  00     01           
 | 
			
		||||
--s 1001 ---------  -  -                1001 0000  00     01           
 | 
			
		||||
--s 1010 ---------  -  -                1010 0000  00     01           
 | 
			
		||||
--s 1011 ---------  -  -                1011 0000  00     01           
 | 
			
		||||
--s 1100 ---------  -  -                1100 0000  00     01           
 | 
			
		||||
--s 1101 ---------  -  -                1101 0000  00     01           
 | 
			
		||||
--s 1110 ---------  -  -                1110 0000  00     01           
 | 
			
		||||
--*-------------------------------------------------------------------------------------------------------------------
 | 
			
		||||
--tbl RecvSeq
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- read data
 | 
			
		||||
-- load immediately with local data
 | 
			
		||||
-- load 0:n for ib data
 | 
			
		||||
idata_cnt_d <= gate_and(icapture_q and ld_rd_data, inc(idata_cnt_q)) or
 | 
			
		||||
               gate_and(not idata_clear and not(icapture_q and ld_rd_data), idata_cnt_q);  
 | 
			
		||||
 | 
			
		||||
rd_rsp_data_done <= eq(idata_cnt_q, 7);
 | 
			
		||||
 | 
			
		||||
with wb_in_q.adr(7 downto 4) select
 | 
			
		||||
   local_rd_data <= config_data     when "0000",
 | 
			
		||||
                    (others => '1') when others;
 | 
			
		||||
 | 
			
		||||
with idata_cnt_q select 
 | 
			
		||||
   rd_data_load <= wb_out_q.dat(63 downto 8) & idata_q                              when "000",
 | 
			
		||||
                   wb_out_q.dat(63 downto 16) & idata_q & wb_out_q.dat(7 downto 0)  when "001",
 | 
			
		||||
                   wb_out_q.dat(63 downto 24) & idata_q & wb_out_q.dat(15 downto 0) when "010", 
 | 
			
		||||
                   wb_out_q.dat(63 downto 32) & idata_q & wb_out_q.dat(23 downto 0) when "011",                   
 | 
			
		||||
                   wb_out_q.dat(63 downto 40) & idata_q & wb_out_q.dat(31 downto 0) when "100",                   
 | 
			
		||||
                   wb_out_q.dat(63 downto 48) & idata_q & wb_out_q.dat(39 downto 0) when "101",                   
 | 
			
		||||
                   wb_out_q.dat(63 downto 56) & idata_q & wb_out_q.dat(47 downto 0) when "110",                   
 | 
			
		||||
                   idata_q & wb_out_q.dat(55 downto 0)                              when others;                                                                                                                
 | 
			
		||||
 | 
			
		||||
wb_out_d.dat   <= gate_and(wb_local_rd,                                           local_rd_data) or
 | 
			
		||||
                  gate_and(wb_remote_rd and ld_rd_data,                           rd_data_load) or
 | 
			
		||||
                  gate_and(not wb_local_rd and not (wb_remote_rd and ld_rd_data), wb_out_q.dat);
 | 
			
		||||
 | 
			
		||||
rd_err <= rd8_rsp and iseq_idle and icapture_q and not(eq(idata_q(4 downto 3), 0));
 | 
			
		||||
wr_err <= wr8_rsp and iseq_idle and icapture_q and not(eq(idata_q(4 downto 3), 0));
 | 
			
		||||
 | 
			
		||||
---------------- Generated --------------------------
 | 
			
		||||
 | 
			
		||||
--vtable HeaderEncode
 | 
			
		||||
ob_header(7) <= 
 | 
			
		||||
  (link_req_o) or
 | 
			
		||||
  (link_rsp_o);
 | 
			
		||||
ob_header(6) <= 
 | 
			
		||||
  (wb_sync) or
 | 
			
		||||
  (link_req_o) or
 | 
			
		||||
  (link_rsp_o);
 | 
			
		||||
ob_header(5) <= 
 | 
			
		||||
  (link_req_o) or
 | 
			
		||||
  (link_rsp_o);
 | 
			
		||||
ob_header(4) <= 
 | 
			
		||||
  (link_req_o) or
 | 
			
		||||
  (link_rsp_o);
 | 
			
		||||
ob_header(3) <= 
 | 
			
		||||
  (link_rsp_o);
 | 
			
		||||
ob_header(2) <= '0';
 | 
			
		||||
ob_header(1) <= 
 | 
			
		||||
  (wb_remote_rd) or
 | 
			
		||||
  (wb_remote_wr);
 | 
			
		||||
ob_header(0) <= 
 | 
			
		||||
  (wb_remote_wr);
 | 
			
		||||
--vtable HeaderEncode
 | 
			
		||||
 | 
			
		||||
--vtable HeaderDecode
 | 
			
		||||
rd8_rsp <= 
 | 
			
		||||
  (idata_q(7) and not idata_q(6) and not idata_q(5) and not idata_q(4) and idata_q(1) and not idata_q(0) and wb_remote_rd);
 | 
			
		||||
wr8_rsp <= 
 | 
			
		||||
  (idata_q(7) and not idata_q(6) and not idata_q(5) and not idata_q(4) and idata_q(1) and idata_q(0) and wb_remote_wr);
 | 
			
		||||
int_req <= 
 | 
			
		||||
  (idata_q(7) and idata_q(6) and not idata_q(5) and idata_q(4) and not idata_q(3));
 | 
			
		||||
sync_ack <= 
 | 
			
		||||
  (idata_q(7) and idata_q(6) and not idata_q(5) and not idata_q(4) and not idata_q(3));
 | 
			
		||||
cache_inv <= 
 | 
			
		||||
  (idata_q(7) and idata_q(6) and not idata_q(5) and not idata_q(4) and idata_q(3));
 | 
			
		||||
link_req_i <= 
 | 
			
		||||
  (idata_q(7) and idata_q(6) and idata_q(5) and idata_q(4) and not idata_q(3));
 | 
			
		||||
link_rsp_i <= 
 | 
			
		||||
  (idata_q(7) and idata_q(6) and idata_q(5) and idata_q(4) and idata_q(3));
 | 
			
		||||
good_header <= 
 | 
			
		||||
  (idata_q(7) and not idata_q(6) and not idata_q(5) and not idata_q(4) and idata_q(1) and not idata_q(0) and wb_remote_rd) or
 | 
			
		||||
  (idata_q(7) and not idata_q(6) and not idata_q(5) and not idata_q(4) and idata_q(1) and idata_q(0) and wb_remote_wr) or
 | 
			
		||||
  (idata_q(7) and idata_q(6) and not idata_q(5) and not idata_q(4) and not idata_q(3)) or
 | 
			
		||||
  (idata_q(7) and idata_q(6) and not idata_q(5) and not idata_q(4) and idata_q(3)) or
 | 
			
		||||
  (idata_q(7) and idata_q(6) and not idata_q(5) and idata_q(4) and not idata_q(3)) or
 | 
			
		||||
  (idata_q(7) and idata_q(6) and idata_q(5) and idata_q(4) and not idata_q(3)) or
 | 
			
		||||
  (idata_q(7) and idata_q(6) and idata_q(5) and idata_q(4) and idata_q(3));
 | 
			
		||||
--vtable HeaderDecode
 | 
			
		||||
 | 
			
		||||
--vtable WBSlaveSeq
 | 
			
		||||
wbseq_d(3) <= 
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and not wb_req) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and wb_we and not wb_local) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0) and not rd_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0) and not ob_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0) and ob_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0) and not wr_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0) and wr_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0));
 | 
			
		||||
wbseq_d(2) <= 
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and not wb_req) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and not wb_we and not wb_local) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0) and not ob_complete) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0) and ob_complete) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0) and not rd_rsp_complete) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0) and rd_rsp_complete) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0) and not rd_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0));
 | 
			
		||||
wbseq_d(1) <= 
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and not wb_req) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and wb_we and wb_local) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0) and rd_rsp_complete) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0) and not rd_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0) and wr_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and wbseq_q(0));
 | 
			
		||||
wbseq_d(0) <= 
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and not wb_req) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and not wb_we and wb_local) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0) and ob_complete) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0) and not rd_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0) and ob_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0) and not wr_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0));
 | 
			
		||||
wb_local_rd <= 
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and not wb_we and wb_local);
 | 
			
		||||
wb_local_wr <= 
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and wb_we and wb_local);
 | 
			
		||||
wb_remote_rd <= 
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and not wb_we and not wb_local) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0) and not rd_rsp_complete);
 | 
			
		||||
wb_remote_wr <= 
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and wb_we and not wb_local) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0));
 | 
			
		||||
wb_out_d.stall <= 
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and not wb_we and wb_local) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and wb_we and wb_local) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and not wb_we and not wb_local) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0) and wb_req and wb_we and not wb_local) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0) and not rd_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0));
 | 
			
		||||
wb_out_d.ack <= 
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0) and not rd_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0));
 | 
			
		||||
oseq_hold <= 
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0) and not rd_rsp_complete) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and not wbseq_q(0));
 | 
			
		||||
wbseq_err <= 
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (not wbseq_q(3) and wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and not wbseq_q(2) and wbseq_q(1) and wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and not wbseq_q(0)) or
 | 
			
		||||
  (wbseq_q(3) and wbseq_q(2) and not wbseq_q(1) and wbseq_q(0));
 | 
			
		||||
--vtable WBSlaveSeq
 | 
			
		||||
 | 
			
		||||
--vtable SendSeq
 | 
			
		||||
oseq_d(3) <= 
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and oseq_hold) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not wb_remote_rd and not wb_remote_wr) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not oseq_hold and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and not wb_remote_wr and oclk_advance and oaddr_last) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and oclk_advance and odata_last) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and not oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and not oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and not oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and not oseq_q(0));
 | 
			
		||||
oseq_d(2) <= 
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and oseq_hold) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not wb_remote_rd and not wb_remote_wr) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not oseq_hold and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and not wb_remote_wr and oclk_advance and oaddr_last) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and oseq_q(0) and oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and oclk_advance and not odata_last) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and oclk_advance and odata_last) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and not oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and not oseq_q(0));
 | 
			
		||||
oseq_d(1) <= 
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and oseq_hold) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not wb_remote_rd and not wb_remote_wr) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not oseq_hold and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and not oseq_q(1) and oseq_q(0) and wb_remote_rd and oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and not oseq_q(1) and oseq_q(0) and wb_remote_wr and oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and oclk_advance and not oaddr_last) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and not wb_remote_wr and oclk_advance and oaddr_last) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and wb_remote_wr and oclk_advance and oaddr_last) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and oseq_q(0) and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and oclk_advance and odata_last) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and not oseq_q(0));
 | 
			
		||||
oseq_d(0) <= 
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and oseq_hold) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not wb_remote_rd and not wb_remote_wr) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not oseq_hold and not oclk_advance) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not oseq_hold and wb_remote_rd and oclk_advance) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not oseq_hold and wb_remote_wr and oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and not oseq_q(1) and oseq_q(0) and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and not wb_remote_wr and oclk_advance and oaddr_last) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and wb_remote_wr and oclk_advance and oaddr_last) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and oseq_q(0) and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and oclk_advance and odata_last) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and not oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and not oseq_q(1) and oseq_q(0));
 | 
			
		||||
odata_ld_header <= 
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not oseq_hold and wb_remote_rd and oclk_advance) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not oseq_hold and wb_remote_wr and oclk_advance);
 | 
			
		||||
odata_ld_addr <= 
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and not oseq_q(1) and oseq_q(0) and wb_remote_rd and oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and not oseq_q(1) and oseq_q(0) and wb_remote_wr and oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and oclk_advance and not oaddr_last);
 | 
			
		||||
odata_ld_sel <= 
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and wb_remote_wr and oclk_advance and oaddr_last);
 | 
			
		||||
odata_clear <= 
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and oseq_hold) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not wb_remote_rd and not wb_remote_wr) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0) and not oseq_hold and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and not wb_remote_wr and oclk_advance and oaddr_last) or
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and wb_remote_wr and oclk_advance and oaddr_last);
 | 
			
		||||
odata_ld_data <= 
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and oseq_q(0) and oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and not oclk_advance) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and oclk_advance and not odata_last) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and oclk_advance and odata_last);
 | 
			
		||||
ob_complete <= 
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0) and not wb_remote_wr and oclk_advance and oaddr_last) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0) and oclk_advance and odata_last);
 | 
			
		||||
oseq_err <= 
 | 
			
		||||
  (not oseq_q(3) and not oseq_q(2) and not oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and not oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (not oseq_q(3) and oseq_q(2) and oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and not oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and not oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and not oseq_q(2) and oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and not oseq_q(1) and not oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and not oseq_q(1) and oseq_q(0)) or
 | 
			
		||||
  (oseq_q(3) and oseq_q(2) and oseq_q(1) and not oseq_q(0));
 | 
			
		||||
--vtable SendSeq
 | 
			
		||||
 | 
			
		||||
--vtable RecvSeq
 | 
			
		||||
iseq_d(3) <= 
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and not icapture_q) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and idle_header) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and rd8_rsp) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0) and not icapture_q) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0) and icapture_q and not rd_rsp_data_done) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0) and icapture_q and rd_rsp_data_done) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and idle_header) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and not iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and not iseq_q(0));
 | 
			
		||||
iseq_d(2) <= 
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and not icapture_q) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and idle_header) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and bad_header) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and sync_ack) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and cache_inv) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and link_req_i) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and link_rsp_i) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0) and icapture_q and rd_rsp_data_done) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and not icapture_q) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and idle_header) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and not idle_header) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and not iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and not iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and not iseq_q(0));
 | 
			
		||||
iseq_d(1) <= 
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and not icapture_q) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and idle_header) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and bad_header) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and int_req) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and sync_ack) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and cache_inv) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and link_req_i) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and link_rsp_i) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0) and icapture_q and rd_rsp_data_done) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and not icapture_q) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and idle_header) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and not idle_header) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and not iseq_q(0));
 | 
			
		||||
iseq_d(0) <= 
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and not icapture_q) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and idle_header) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and wr8_rsp) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0) and icapture_q and rd_rsp_data_done) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and idle_header) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and not iseq_q(1) and iseq_q(0));
 | 
			
		||||
ld_rd_data <= 
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0) and icapture_q and not rd_rsp_data_done) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0) and icapture_q and rd_rsp_data_done);
 | 
			
		||||
rd_rsp_complete <= 
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0) and icapture_q and rd_rsp_data_done);
 | 
			
		||||
wr_rsp_complete <= 
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and not iseq_q(1) and iseq_q(0));
 | 
			
		||||
int_req_complete <= 
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and iseq_q(1) and not iseq_q(0));
 | 
			
		||||
idata_clear <= 
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and not icapture_q) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0) and icapture_q and idle_header);
 | 
			
		||||
save_header <= 
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and iseq_q(1) and not iseq_q(0));
 | 
			
		||||
iseq_idle <= 
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and iseq_q(0));
 | 
			
		||||
iseq_err <= 
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and not iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and not iseq_q(2) and iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and not iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (not iseq_q(3) and iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and not iseq_q(2) and iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and not iseq_q(1) and not iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and not iseq_q(1) and iseq_q(0)) or
 | 
			
		||||
  (iseq_q(3) and iseq_q(2) and iseq_q(1) and not iseq_q(0));
 | 
			
		||||
--vtable RecvSeq
 | 
			
		||||
 | 
			
		||||
end architecture mc;
 | 
			
		||||
@ -0,0 +1,186 @@
 | 
			
		||||
library ieee;
 | 
			
		||||
use ieee.std_logic_1164.all;
 | 
			
		||||
use ieee.numeric_std.all;
 | 
			
		||||
 | 
			
		||||
package mc_pkg is
 | 
			
		||||
 | 
			
		||||
constant BAR_BITS : integer := 16;
 | 
			
		||||
 | 
			
		||||
--types 
 | 
			
		||||
type T_Config is record
 | 
			
		||||
   oib_en    : std_ulogic;
 | 
			
		||||
   oib_ratio : std_ulogic_vector(3 downto 0);      
 | 
			
		||||
   oib_width : std_ulogic_vector(2 downto 0);
 | 
			
		||||
   cpol      : std_ulogic;
 | 
			
		||||
   cpha      : std_ulogic;
 | 
			
		||||
   ib_en_pck : std_ulogic;
 | 
			
		||||
   rsvd0     : std_ulogic_vector(2 downto 0);
 | 
			
		||||
   bar_en    : std_ulogic;
 | 
			
		||||
   int_req   : std_ulogic;
 | 
			
		||||
   bar       : std_ulogic_vector(BAR_BITS-1 downto 0);
 | 
			
		||||
   --bar mask
 | 
			
		||||
   rsvd1     : std_ulogic_vector(7 downto 0);
 | 
			
		||||
   idle_flit : std_ulogic_vector(7 downto 0);
 | 
			
		||||
   rcv_header : std_ulogic_vector(7 downto 0);
 | 
			
		||||
   err       : std_ulogic_vector(7 downto 0);       
 | 
			
		||||
end record;
 | 
			
		||||
 | 
			
		||||
-- functions
 | 
			
		||||
function inc(a: in std_ulogic_vector) return std_ulogic_vector;
 | 
			
		||||
function inc(a: in std_ulogic_vector; b: in integer) return std_ulogic_vector;use ieee.numeric_std.all;
 | 
			
		||||
function dec(a: in std_ulogic_vector) return std_ulogic_vector;
 | 
			
		||||
function eq(a: in std_ulogic_vector; b: in integer) return boolean;
 | 
			
		||||
function eq(a: in std_ulogic_vector; b: in integer) return std_ulogic;
 | 
			
		||||
function eq(a: in std_ulogic_vector; b: in std_ulogic_vector) return boolean;
 | 
			
		||||
function eq(a: in std_ulogic_vector; b: in std_ulogic_vector) return std_ulogic;
 | 
			
		||||
 | 
			
		||||
function gate_and(a: in std_ulogic; b: in std_ulogic_vector) return std_ulogic_vector;
 | 
			
		||||
function or_reduce(slv: in std_ulogic_vector) return std_ulogic;
 | 
			
		||||
function and_reduce(slv: in std_ulogic_vector) return std_ulogic;
 | 
			
		||||
 | 
			
		||||
function clog2(n : in integer) return integer;
 | 
			
		||||
 | 
			
		||||
function bus_ratio_enc(n : in integer) return std_ulogic_vector;
 | 
			
		||||
function bus_width_enc(n : in integer) return std_ulogic_vector;
 | 
			
		||||
 | 
			
		||||
end package mc_pkg;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package body mc_pkg is
 | 
			
		||||
 | 
			
		||||
function inc(a: in std_ulogic_vector) return std_ulogic_vector is
 | 
			
		||||
  variable res: std_ulogic_vector(0 to a'length-1);
 | 
			
		||||
begin
 | 
			
		||||
  res := std_ulogic_vector(unsigned(a) + 1);
 | 
			
		||||
  return res;
 | 
			
		||||
end function;
 | 
			
		||||
 | 
			
		||||
function inc(a: in std_ulogic_vector; b: in integer) return std_ulogic_vector is
 | 
			
		||||
  variable res: std_ulogic_vector(0 to a'length-1);
 | 
			
		||||
begin
 | 
			
		||||
  res := std_ulogic_vector(unsigned(a) + b);
 | 
			
		||||
  return res;
 | 
			
		||||
end function;
 | 
			
		||||
 | 
			
		||||
function dec(a: in std_ulogic_vector) return std_ulogic_vector is
 | 
			
		||||
  variable res: std_ulogic_vector(0 to a'length-1);
 | 
			
		||||
begin
 | 
			
		||||
  res := std_ulogic_vector(unsigned(a) - 1);
 | 
			
		||||
  return res;
 | 
			
		||||
end function;
 | 
			
		||||
 | 
			
		||||
function eq(a: in std_ulogic_vector; b: in integer) return boolean is
 | 
			
		||||
  variable res: boolean;
 | 
			
		||||
begin
 | 
			
		||||
  res := unsigned(a) = b;
 | 
			
		||||
  return res;
 | 
			
		||||
end function;
 | 
			
		||||
 | 
			
		||||
function eq(a: in std_ulogic_vector; b: in integer) return std_ulogic is
 | 
			
		||||
  variable res: std_ulogic;
 | 
			
		||||
begin
 | 
			
		||||
  if unsigned(a) = b then
 | 
			
		||||
   res := '1';
 | 
			
		||||
  else
 | 
			
		||||
   res := '0';
 | 
			
		||||
  end if;
 | 
			
		||||
  return res;
 | 
			
		||||
end function;
 | 
			
		||||
 | 
			
		||||
function eq(a: in std_ulogic_vector; b: in std_ulogic_vector) return boolean is
 | 
			
		||||
  variable res: boolean;
 | 
			
		||||
begin
 | 
			
		||||
  res := unsigned(a) = unsigned(b);
 | 
			
		||||
  return res;
 | 
			
		||||
end function;
 | 
			
		||||
 | 
			
		||||
function eq(a: in std_ulogic_vector; b: in std_ulogic_vector) return std_ulogic is
 | 
			
		||||
  variable res: std_ulogic;
 | 
			
		||||
begin
 | 
			
		||||
  if unsigned(a) = unsigned(b) then
 | 
			
		||||
    res := '1';
 | 
			
		||||
  else
 | 
			
		||||
    res := '0';
 | 
			
		||||
  end if;
 | 
			
		||||
  return res;
 | 
			
		||||
end function;
 | 
			
		||||
 | 
			
		||||
function gate_and(a: in std_ulogic; b: in std_ulogic_vector) return std_ulogic_vector is
 | 
			
		||||
  variable res: std_ulogic_vector(0 to b'length-1);
 | 
			
		||||
begin
 | 
			
		||||
  if a = '1' then
 | 
			
		||||
     res := b;
 | 
			
		||||
  else   
 | 
			
		||||
     res := (others => '0');  
 | 
			
		||||
  end if;
 | 
			
		||||
  return res;
 | 
			
		||||
end function;		
 | 
			
		||||
 | 
			
		||||
function or_reduce(slv: in std_ulogic_vector) return std_ulogic is
 | 
			
		||||
  variable res: std_logic := '0';
 | 
			
		||||
begin
 | 
			
		||||
  for i in 0 to slv'length-1 loop
 | 
			
		||||
    res := res or slv(i);
 | 
			
		||||
  end loop;
 | 
			
		||||
  return res;
 | 
			
		||||
end function;
 | 
			
		||||
 | 
			
		||||
function and_reduce(slv: in std_ulogic_vector) return std_ulogic is
 | 
			
		||||
  variable res: std_logic := '1';
 | 
			
		||||
begin
 | 
			
		||||
  for i in 0 to slv'length-1 loop
 | 
			
		||||
    res := res and slv(i);
 | 
			
		||||
  end loop;
 | 
			
		||||
  return res;
 | 
			
		||||
end function;
 | 
			
		||||
 | 
			
		||||
function clog2(n : in integer) return integer is            
 | 
			
		||||
   variable i : integer;
 | 
			
		||||
   variable j : integer := n - 1;
 | 
			
		||||
	variable res : integer := 1;                                       
 | 
			
		||||
begin                                                                   
 | 
			
		||||
   for i in 0 to 31 loop
 | 
			
		||||
      if (j > 1) then
 | 
			
		||||
         j := j / 2;
 | 
			
		||||
         res := res + 1;
 | 
			
		||||
      else
 | 
			
		||||
         exit;
 | 
			
		||||
      end if;
 | 
			
		||||
   end loop;
 | 
			
		||||
   return res;        	                                              
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function bus_ratio_enc(n : in integer) return std_ulogic_vector is
 | 
			
		||||
   variable res : std_ulogic_vector(3 downto 0);
 | 
			
		||||
begin
 | 
			
		||||
   case n is
 | 
			
		||||
      when    1    => res := "0000";	
 | 
			
		||||
      when    2    => res := "0001";	
 | 
			
		||||
      when    4    => res := "0010";	
 | 
			
		||||
      when    8    => res := "0011";	
 | 
			
		||||
      when   16    => res := "0100";	
 | 
			
		||||
      when   32    => res := "0101";	   
 | 
			
		||||
      when   64    => res := "0110";	               
 | 
			
		||||
      when  128    => res := "0111";	               
 | 
			
		||||
      when  256    => res := "1000";	
 | 
			
		||||
      when  512    => res := "1001";	                                 
 | 
			
		||||
      when others  => res := "1111";
 | 
			
		||||
   end case;
 | 
			
		||||
   return res;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function bus_width_enc(n : in integer) return std_ulogic_vector is
 | 
			
		||||
   variable res : std_ulogic_vector(2 downto 0);
 | 
			
		||||
begin
 | 
			
		||||
   case n is
 | 
			
		||||
      when   1    => res := "000";	
 | 
			
		||||
      when   2    => res := "001";	
 | 
			
		||||
      when   4    => res := "010";	
 | 
			
		||||
      when   8    => res := "011";	
 | 
			
		||||
      when  16    => res := "100";	                                   
 | 
			
		||||
      when others => res := "111";
 | 
			
		||||
   end case;
 | 
			
		||||
   return res;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
end package body mc_pkg;
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue