Skip to content
Snippets Groups Projects
Commit 5dd1e818 authored by BRONES Romain's avatar BRONES Romain
Browse files

New minor version: Register control, filter wrong frames

* Separated and fixed error flags
* Dedicated register to reset flags
* Data stream stopped on reset
* Do not forward erroneous frames
parents 496e1685 d0e562f8
No related branches found
No related tags found
No related merge requests found
...@@ -112,6 +112,7 @@ architecture rtl of ccn_pack is ...@@ -112,6 +112,7 @@ architecture rtl of ccn_pack is
signal fifo_tlast : std_logic; signal fifo_tlast : std_logic;
signal fifo_tuser : std_logic_vector(0 downto 0); signal fifo_tuser : std_logic_vector(0 downto 0);
signal fifo_tuser_slv : std_logic_vector(7 downto 0); signal fifo_tuser_slv : std_logic_vector(7 downto 0);
signal fifo_err_rst : std_logic;
-- Some constant for mapping -- Some constant for mapping
constant C_TKEEP_S00 : std_logic_vector(23 downto 0) := (others => '1'); constant C_TKEEP_S00 : std_logic_vector(23 downto 0) := (others => '1');
...@@ -244,12 +245,13 @@ begin ...@@ -244,12 +245,13 @@ begin
header_tdata(103 downto 96) <= mac_length(15 downto 8); header_tdata(103 downto 96) <= mac_length(15 downto 8);
header_tdata(111 downto 104) <= mac_length(7 downto 0); header_tdata(111 downto 104) <= mac_length(7 downto 0);
header_tdata(119 downto 112) <= G_PROTOCOL_ID; header_tdata(119 downto 112) <= G_PROTOCOL_ID;
header_tdata(127 downto 120) <= (others => '0'); header_tdata(127 downto 120) <= pkt_reg_tuser(7 downto 0);
header_tdata(191 downto 128) <= timeref; header_tdata(191 downto 128) <= timeref;
sup_arb_res_s1 <= not header_tready; sup_arb_res_s1 <= not header_tready;
pkt_ix_tdata <= pkt_reg_tdata; pkt_ix_tdata <= pkt_reg_tdata when frame_error = '0' else
(others => '0');
pkt_ix_tvalid <= frame_error or reg_tvalid; pkt_ix_tvalid <= frame_error or reg_tvalid;
pkt_ix_tlast <= frame_error or pkt_cnt_zero; pkt_ix_tlast <= frame_error or pkt_cnt_zero;
pkt_ix_tuser <= (others => frame_error); pkt_ix_tuser <= (others => frame_error);
...@@ -290,10 +292,11 @@ begin ...@@ -290,10 +292,11 @@ begin
-- FIFO -- -- FIFO --
---------- ----------
fifo_tuser(0) <= or_reduce(fifo_tuser_slv); fifo_tuser(0) <= or_reduce(fifo_tuser_slv);
fifo_err_rst <= (not fifo_tuser(0)) and aresetn;
inst_fifo: entity work.ccn_axis_fifo_pframe inst_fifo: entity work.ccn_axis_fifo_pframe
port map( port map(
s_axis_aresetn => aresetn, s_axis_aresetn => fifo_err_rst,
s_axis_aclk => aclk, s_axis_aclk => aclk,
m_axis_aclk => m_axis_clk, m_axis_aclk => m_axis_clk,
s_axis_tvalid => fifo_tvalid, s_axis_tvalid => fifo_tvalid,
......
...@@ -28,6 +28,7 @@ entity ccn_unpack is ...@@ -28,6 +28,7 @@ entity ccn_unpack is
err_mac_dst : out std_logic; err_mac_dst : out std_logic;
err_mac_src : out std_logic; err_mac_src : out std_logic;
pkt_mcts : out std_logic_vector(63 downto 0); pkt_mcts : out std_logic_vector(63 downto 0);
frame_counter : out std_logic_vector(31 downto 0);
-- AXIS Frame input -- AXIS Frame input
s_axis_clk : in std_logic; -- Only S_AXIS signals on this clk domain s_axis_clk : in std_logic; -- Only S_AXIS signals on this clk domain
...@@ -82,12 +83,15 @@ architecture rtl of ccn_unpack is ...@@ -82,12 +83,15 @@ architecture rtl of ccn_unpack is
signal header_mac_len : std_logic_vector(15 downto 0); signal header_mac_len : std_logic_vector(15 downto 0);
signal header_pkt_id : std_logic_vector(7 downto 0); signal header_pkt_id : std_logic_vector(7 downto 0);
signal header_pkt_mcts : std_logic_vector(63 downto 0); signal header_pkt_mcts : std_logic_vector(63 downto 0);
signal header_framenum : std_logic_vector(7 downto 0);
-- Status and stats -- Status and stats
signal frame_cnt : unsigned(31 downto 0); signal frame_cnt : unsigned(31 downto 0);
begin begin
frame_counter <= std_logic_vector(frame_cnt);
---------------- ----------------
-- INPUT FIFO -- -- INPUT FIFO --
---------------- ----------------
...@@ -131,7 +135,7 @@ begin ...@@ -131,7 +135,7 @@ begin
); );
m_axis_tvalid <= wconv_out_tvalid; m_axis_tvalid <= wconv_out_tvalid;
m_axis_tlast <= wconv_out_tvalid; m_axis_tlast <= wconv_out_tvalid;
m_axis_tuser <= std_logic_vector(frame_cnt(m_axis_tuser'range)); m_axis_tuser <= std_logic_vector(header_framenum(m_axis_tuser'range));
wconv_in_tvalid <= (not fsm_dump) and fifo_tvalid; wconv_in_tvalid <= (not fsm_dump) and fifo_tvalid;
...@@ -218,6 +222,7 @@ begin ...@@ -218,6 +222,7 @@ begin
header_mac_len <= (others => '0'); header_mac_len <= (others => '0');
header_pkt_id <= (others => '0'); header_pkt_id <= (others => '0');
frame_cnt <= (others => '0'); frame_cnt <= (others => '0');
header_framenum <= (others => '0');
err_pid <= '0'; err_pid <= '0';
err_mac_dst <= '0'; err_mac_dst <= '0';
err_mac_src <= '0'; err_mac_src <= '0';
...@@ -245,7 +250,8 @@ begin ...@@ -245,7 +250,8 @@ begin
header_mac_src(7 downto 0) <= fifo_tdata(31 downto 24); header_mac_src(7 downto 0) <= fifo_tdata(31 downto 24);
header_mac_len(15 downto 8) <= fifo_tdata(39 downto 32); header_mac_len(15 downto 8) <= fifo_tdata(39 downto 32);
header_mac_len(7 downto 0) <= fifo_tdata(47 downto 40); header_mac_len(7 downto 0) <= fifo_tdata(47 downto 40);
header_pkt_id(7 downto 0) <= fifo_tdata(55 downto 48); header_pkt_id <= fifo_tdata(55 downto 48);
header_framenum <= fifo_tdata(63 downto 56);
end if; end if;
if fsm_state = G_THREE then if fsm_state = G_THREE then
......
...@@ -69,6 +69,12 @@ architecture rtl of top_ccn_packeter is ...@@ -69,6 +69,12 @@ architecture rtl of top_ccn_packeter is
signal areset : std_logic; signal areset : std_logic;
-- Flags
signal s_err_timeout : std_logic;
signal f_err_timeout : std_logic;
signal s_err_seq : std_logic;
signal f_err_seq : std_logic;
begin begin
areset <= not aresetn; areset <= not aresetn;
...@@ -107,18 +113,18 @@ begin ...@@ -107,18 +113,18 @@ begin
aresetn => aresetn, aresetn => aresetn,
-- Control -- Control
packeter_run => addrmap_o.packeter_bpm_frame.run.data(0), packeter_run => addrmap_o.control.enable.data(0),
mac_dst => mac_dst, mac_dst => mac_dst,
mac_src => mac_src, mac_src => mac_src,
mac_length => addrmap_o.mac_length.length.data, mac_length => addrmap_o.mac_length.data.data,
packet_timeout => addrmap_o.packeter_bpm_frame.timeout.data, packet_timeout => addrmap_o.timeout.data.data,
expect_pkt_cnt => addrmap_o.packeter_bpm_frame.count.data, expect_pkt_cnt => addrmap_o.npacket.data.data,
timeref => timeref, timeref => timeref,
-- Status -- Status
status_err_seq => addrmap_i.packeter_error.seq.data(0), status_err_seq => s_err_seq,
status_err_timeout => addrmap_i.packeter_error.timeout.data(0), status_err_timeout => s_err_timeout,
status_frame_count => addrmap_i.packeter_count.count.data, status_frame_count => addrmap_i.packeter_count.data.data,
-- AXIS Packet input -- AXIS Packet input
s_axis_tdata => s_axis_tdata, s_axis_tdata => s_axis_tdata,
...@@ -137,5 +143,35 @@ begin ...@@ -137,5 +143,35 @@ begin
); );
------------------
-- STICKY FLAGS --
------------------
addrmap_i.packeter_error.timeout.data(0) <= f_err_timeout;
addrmap_i.packeter_error.seq.data(0) <= f_err_seq;
p_flags:process(aclk, aresetn)
begin
if aresetn = '0' then
f_err_timeout <= '0';
f_err_seq <= '0';
elsif rising_edge(aclk) then
if addrmap_o.reset_error.reset.data(0) = '1' then
f_err_timeout <= '0';
f_err_seq <= '0';
else
if s_err_timeout = '1' then
f_err_timeout <= '1';
end if;
if s_err_seq = '1' then
f_err_seq <= '1';
end if;
end if;
end if;
end process;
end architecture; end architecture;
...@@ -70,6 +70,17 @@ architecture struct of top_ccn_unpacketer is ...@@ -70,6 +70,17 @@ architecture struct of top_ccn_unpacketer is
signal areset : std_logic; signal areset : std_logic;
-- Error flags
signal f_err_pid : std_logic;
signal f_err_mac_len : std_logic;
signal f_err_mac_dst : std_logic;
signal f_err_mac_src : std_logic;
signal s_err_pid : std_logic;
signal s_err_mac_len : std_logic;
signal s_err_mac_dst : std_logic;
signal s_err_mac_src : std_logic;
begin begin
areset <= not aresetn; areset <= not aresetn;
...@@ -117,11 +128,12 @@ begin ...@@ -117,11 +128,12 @@ begin
mac_src => mac_src, mac_src => mac_src,
-- Status -- Status
err_pid => addrmap_i.unpack_error.err_pid.data(0), err_pid => s_err_pid,
err_mac_len => addrmap_i.unpack_error.err_mac_len.data(0), err_mac_len => s_err_mac_len,
err_mac_dst => addrmap_i.unpack_error.err_mac_dst.data(0), err_mac_dst => s_err_mac_dst,
err_mac_src => addrmap_i.unpack_error.err_mac_src.data(0), err_mac_src => s_err_mac_src,
pkt_mcts => open, pkt_mcts => open,
frame_counter => addrmap_i.frame_cnt.data.data,
-- AXIS Frame input -- AXIS Frame input
s_axis_clk => s_axis_clk, s_axis_clk => s_axis_clk,
...@@ -142,4 +154,49 @@ begin ...@@ -142,4 +154,49 @@ begin
); );
------------------
-- STICKY FLAGS --
------------------
addrmap_i.unpack_error.err_pid.data(0) <= f_err_pid;
addrmap_i.unpack_error.err_mac_len.data(0) <= f_err_mac_len;
addrmap_i.unpack_error.err_mac_dst.data(0) <= f_err_mac_dst;
addrmap_i.unpack_error.err_mac_src.data(0) <= f_err_mac_src;
p_flags:process(aclk, aresetn)
begin
if aresetn = '0' then
f_err_pid <= '0';
f_err_mac_len <= '0';
f_err_mac_dst <= '0';
f_err_mac_src <= '0';
elsif rising_edge(aclk) then
if addrmap_o.reset_error.reset.data(0) = '1' then
f_err_pid <= '0';
f_err_mac_len <= '0';
f_err_mac_dst <= '0';
f_err_mac_src <= '0';
else
if s_err_pid = '1' then
f_err_pid <= '1';
end if;
if s_err_mac_len = '1' then
f_err_mac_len <= '1';
end if;
if s_err_mac_dst = '1' then
f_err_mac_dst <= '1';
end if;
if s_err_mac_src = '1' then
f_err_mac_src <= '1';
end if;
end if;
end if;
end process;
end architecture struct; end architecture struct;
...@@ -40,31 +40,43 @@ addrmap ccn_packeter { ...@@ -40,31 +40,43 @@ addrmap ccn_packeter {
} MAC_SRC_MSB; } MAC_SRC_MSB;
reg { reg {
desc="Ethernet MAC frame length. Should be PACKETER_BPM_FRAME.COUNT+8"; desc="Ethernet MAC frame length. Should be (NPACKET+1)*PACKETSIZE+10";
field {hw=r; sw=rw;} LENGTH[16]; field {hw=r; sw=rw;} data[16];
} MAC_LENGTH; } MAC_LENGTH;
reg { reg {
desc="Packeter control."; desc="Packeter control.";
field {hw=r; sw=rw; desc="Timeout limit. One unit is 4 ns."; default hw=r; default sw=rw;
} TIMEOUT[16]; field {desc="Enable the BPM packeter.";} ENABLE;
field {hw=r; sw=rw; desc="Number of BPM packet to aggregate."; } CONTROL;
} COUNT[8];
field {hw=r; sw=rw; desc="Start the BPM packeter."; reg {
} RUN; default hw=r; default sw=rw;
} PACKETER_BPM_FRAME; field {desc="Timeout limit. One unit is 4 ns.";} data[16];
} TIMEOUT;
reg {
default hw=r; default sw=rw;
field {desc="Number of BPM packet to aggregate -1 .";} data[8];
} NPACKET;
reg { reg {
desc="Number of output Position Packets counted"; desc="Number of output Position Packets counted";
field {hw=w; sw=r;} COUNT[32]; field {hw=w; sw=r;} data[32];
} PACKETER_COUNT; } PACKETER_COUNT;
reg { reg {
desc="Error detected by the packeter. Cleared on read."; desc="Error detected by the packeter. Cleared on read.";
field {hw=w; sw=r; rclr; sticky; desc="New FA sequence received before reaching expected number of BPM packets."; field {hw=w; sw=r; desc="New FA sequence received before reaching expected number of BPM packets.";
} SEQ; } SEQ;
field {hw=w; sw=r; rclr; sticky; desc="Timeout waiting for a new BPM packet."; field {hw=w; sw=r; desc="Timeout waiting for a new BPM packet.";
} TIMEOUT; } TIMEOUT;
} PACKETER_ERROR; } PACKETER_ERROR;
reg {
desc="Reset error flags";
default hw=r; default sw=rw;
field {desc="Start the BPM packeter.";} RESET;
} RESET_ERROR;
}; };
...@@ -40,27 +40,37 @@ addrmap ccn_unpacketer { ...@@ -40,27 +40,37 @@ addrmap ccn_unpacketer {
} MAC_SRC_MSB; } MAC_SRC_MSB;
reg { reg {
desc="Ethernet MAC frame length. Should be PACKETER_BPM_FRAME.COUNT+8"; desc="Ethernet MAC frame length. Should be (CONFIGURE.NPACKET+1)*PACKETSIZE+10";
field {hw=r; sw=rw;} LENGTH[16]; field {hw=r; sw=rw;} LENGTH[16];
} MAC_LENGTH; } MAC_LENGTH;
reg { reg {
desc="Unpacketer control."; desc="Unpacketer control.";
field {hw=r; sw=rw; desc="Start the BPM packeter."; default hw=r; default sw=rw;
} enable; field {desc="Start the BPM packeter.";} ENABLE;
} control; } CONTROL;
reg { reg {
desc="Error detected by the packeter. Cleared on read."; desc="Error detected by the packeter. Cleared on read.";
field {hw=w; sw=r; rclr; sticky; desc="Protocol ID mismatch."; field {hw=w; sw=r; desc="Protocol ID mismatch.";
} ERR_PID; } ERR_PID;
field {hw=w; sw=r; rclr; sticky; desc="Incomming MAC frame length not expected."; field {hw=w; sw=r; desc="Incomming MAC frame length not expected.";
} ERR_MAC_LEN; } ERR_MAC_LEN;
field {hw=w; sw=r; rclr; sticky; desc="Incomming MAC source address not expected."; field {hw=w; sw=r; desc="Incomming MAC source address not expected.";
} ERR_MAC_SRC; } ERR_MAC_SRC;
field {hw=w; sw=r; rclr; sticky; desc="Incomming MAC destination address not expected."; field {hw=w; sw=r; desc="Incomming MAC destination address not expected.";
} ERR_MAC_DST; } ERR_MAC_DST;
} UNPACK_ERROR; } UNPACK_ERROR;
reg {
desc="Reset error flags";
default hw=r; default sw=rw;
field {desc="Start the BPM packeter.";} RESET;
} RESET_ERROR;
reg {
desc="Unpacked frames counter.";
field {hw=rw; sw=r;} data[32];
} FRAME_CNT;
}; };
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment