forked from cores/microwatt
parent
9747879643
commit
b3a52bf931
@ -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