Compare commits
No commits in common. "8de2e01b18692c97de6470d5daf9e5a0d68208e5" and "12411c11dcb0399b289350debe698ea948bb1c54" have entirely different histories.
8de2e01b18
...
12411c11dc
@ -20,8 +20,7 @@ entity fifo_buffer is
|
|||||||
valid_in : in std_logic;
|
valid_in : in std_logic;
|
||||||
valid_out : out std_logic;
|
valid_out : out std_logic;
|
||||||
data_in : in std_logic_vector(data_width - 1 downto 0);
|
data_in : in std_logic_vector(data_width - 1 downto 0);
|
||||||
data_out : out std_logic_vector(data_width - 1 downto 0);
|
data_out : out std_logic_vector(data_width - 1 downto 0)
|
||||||
used_slots : out integer range 0 to buffer_size
|
|
||||||
);
|
);
|
||||||
end entity fifo_buffer;
|
end entity fifo_buffer;
|
||||||
|
|
||||||
@ -74,11 +73,6 @@ begin
|
|||||||
comb_proc: process(write_pointer, read_pointer, buffer_full, valid_in, rst)
|
comb_proc: process(write_pointer, read_pointer, buffer_full, valid_in, rst)
|
||||||
variable write_pointer_inc : unsigned(address_bits - 1 downto 0);
|
variable write_pointer_inc : unsigned(address_bits - 1 downto 0);
|
||||||
begin
|
begin
|
||||||
if write_pointer >= read_pointer then
|
|
||||||
used_slots <= to_integer(unsigned(write_pointer) - unsigned(read_pointer));
|
|
||||||
else
|
|
||||||
used_slots <= buffer_size - to_integer(unsigned(read_pointer)) + to_integer(unsigned(write_pointer));
|
|
||||||
end if;
|
|
||||||
ready_out <= not buffer_full;
|
ready_out <= not buffer_full;
|
||||||
write_signal <= (valid_in and not buffer_full) or rst;
|
write_signal <= (valid_in and not buffer_full) or rst;
|
||||||
write_pointer_inc := unsigned(write_pointer) + 1;
|
write_pointer_inc := unsigned(write_pointer) + 1;
|
||||||
|
|||||||
@ -29,7 +29,6 @@ architecture rtl of ganimede_toplevel is
|
|||||||
signal manager_to_socbridge_driver : manager_to_socbridge_driver_t;
|
signal manager_to_socbridge_driver : manager_to_socbridge_driver_t;
|
||||||
signal socbridge_driver_to_buffer : fifo_interface_t;
|
signal socbridge_driver_to_buffer : fifo_interface_t;
|
||||||
signal buffer_to_socbridge_driver : fifo_interface_t;
|
signal buffer_to_socbridge_driver : fifo_interface_t;
|
||||||
signal ip_to_socbridge_driver : ip_to_socbridge_driver_t;
|
|
||||||
signal socbridge_clk : std_logic;
|
signal socbridge_clk : std_logic;
|
||||||
|
|
||||||
--signal gan_socbridge_WE_in : std_logic;
|
--signal gan_socbridge_WE_in : std_logic;
|
||||||
@ -38,9 +37,7 @@ architecture rtl of ganimede_toplevel is
|
|||||||
--signal gan_socbridge_is_full_out : std_logic;
|
--signal gan_socbridge_is_full_out : std_logic;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
--- INTERNAL CONNECTIONS ---
|
--- CONNECT EXTERNAL SIGNALS TO INTERNAL CONNECTIONS ---
|
||||||
ip_to_socbridge_driver.fifo <= buffer_to_socbridge_driver;
|
|
||||||
ip_to_socbridge_driver.flush <= ip_to_ganimede.socbridge.flush;
|
|
||||||
|
|
||||||
--- DRIVER INSTANTIATION ---
|
--- DRIVER INSTANTIATION ---
|
||||||
socbridge_driver_inst: entity gan_socbridge.socbridge_driver
|
socbridge_driver_inst: entity gan_socbridge.socbridge_driver
|
||||||
@ -54,7 +51,7 @@ begin
|
|||||||
socbridge_driver_to_manager => socbridge_driver_to_manager,
|
socbridge_driver_to_manager => socbridge_driver_to_manager,
|
||||||
ext_to_socbridge_driver => ext_to_ganimede.socbridge,
|
ext_to_socbridge_driver => ext_to_ganimede.socbridge,
|
||||||
socbridge_driver_to_ext => ganimede_to_ext.socbridge,
|
socbridge_driver_to_ext => ganimede_to_ext.socbridge,
|
||||||
ip_to_socbridge_driver => ip_to_socbridge_driver,
|
ip_to_socbridge_driver => buffer_to_socbridge_driver,
|
||||||
socbridge_driver_to_ip => socbridge_driver_to_buffer
|
socbridge_driver_to_ip => socbridge_driver_to_buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -81,13 +78,12 @@ begin
|
|||||||
fifo_buffer_to_ip_inst : entity gan_buffer.fifo_buffer
|
fifo_buffer_to_ip_inst : entity gan_buffer.fifo_buffer
|
||||||
generic map (
|
generic map (
|
||||||
buffer_size => 1024
|
buffer_size => 1024
|
||||||
--tech => 60
|
|
||||||
)
|
)
|
||||||
port map(
|
port map(
|
||||||
in_clk => socbridge_clk,
|
in_clk => socbridge_clk,
|
||||||
out_clk => clk,
|
out_clk => clk,
|
||||||
rst => rst,
|
rst => rst,
|
||||||
ready_in => ip_to_ganimede.socbridge.fifo.ready,
|
ready_in => ip_to_ganimede.socbridge.ready,
|
||||||
ready_out => buffer_to_socbridge_driver.ready,
|
ready_out => buffer_to_socbridge_driver.ready,
|
||||||
valid_in => socbridge_driver_to_buffer.valid,
|
valid_in => socbridge_driver_to_buffer.valid,
|
||||||
valid_out => ganimede_to_ip.socbridge.valid,
|
valid_out => ganimede_to_ip.socbridge.valid,
|
||||||
@ -98,7 +94,6 @@ begin
|
|||||||
fifo_buffer_from_ip_inst : entity gan_buffer.fifo_buffer
|
fifo_buffer_from_ip_inst : entity gan_buffer.fifo_buffer
|
||||||
generic map (
|
generic map (
|
||||||
buffer_size => 1024
|
buffer_size => 1024
|
||||||
-- tech => 60
|
|
||||||
)
|
)
|
||||||
port map(
|
port map(
|
||||||
in_clk => clk,
|
in_clk => clk,
|
||||||
@ -106,12 +101,13 @@ begin
|
|||||||
rst => rst,
|
rst => rst,
|
||||||
ready_in => socbridge_driver_to_buffer.ready,
|
ready_in => socbridge_driver_to_buffer.ready,
|
||||||
ready_out => ganimede_to_ip.socbridge.ready,
|
ready_out => ganimede_to_ip.socbridge.ready,
|
||||||
valid_in => ip_to_ganimede.socbridge.fifo.valid,
|
valid_in => ip_to_ganimede.socbridge.valid,
|
||||||
valid_out => buffer_to_socbridge_driver.valid,
|
valid_out => buffer_to_socbridge_driver.valid,
|
||||||
data_in => ip_to_ganimede.socbridge.fifo.data,
|
data_in => ip_to_ganimede.socbridge.data,
|
||||||
data_out => buffer_to_socbridge_driver.data,
|
data_out => buffer_to_socbridge_driver.data
|
||||||
used_slots => buffer_to_socbridge_driver.used_slots
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
--- LATER WE ADD OPTIMIZATIONS HERE ---
|
||||||
|
|
||||||
|
|
||||||
end architecture rtl;
|
end architecture rtl;
|
||||||
|
|||||||
@ -16,7 +16,6 @@ package io_types is
|
|||||||
type fifo_interface_t is record
|
type fifo_interface_t is record
|
||||||
ready, valid : std_logic;
|
ready, valid : std_logic;
|
||||||
data : std_logic_vector(fifo_width - 1 downto 0);
|
data : std_logic_vector(fifo_width - 1 downto 0);
|
||||||
used_slots : integer;
|
|
||||||
end record fifo_interface_t;
|
end record fifo_interface_t;
|
||||||
|
|
||||||
type ext_protocol_def_t is record
|
type ext_protocol_def_t is record
|
||||||
@ -71,10 +70,7 @@ package io_types is
|
|||||||
|
|
||||||
subtype socbridge_driver_to_ip_t is fifo_interface_t;
|
subtype socbridge_driver_to_ip_t is fifo_interface_t;
|
||||||
|
|
||||||
type ip_to_socbridge_driver_t is record
|
subtype ip_to_socbridge_driver_t is fifo_interface_t;
|
||||||
fifo: fifo_interface_t;
|
|
||||||
flush: std_logic;
|
|
||||||
end record ip_to_socbridge_driver_t;
|
|
||||||
|
|
||||||
type controller_to_drivers_t is record
|
type controller_to_drivers_t is record
|
||||||
socbridge : controller_to_socbridge_driver_t;
|
socbridge : controller_to_socbridge_driver_t;
|
||||||
|
|||||||
@ -76,13 +76,10 @@ begin
|
|||||||
-- CLEAR BUFFER TO IP CORE
|
-- CLEAR BUFFER TO IP CORE
|
||||||
end if;
|
end if;
|
||||||
-- Is the controller done executing an instruction
|
-- Is the controller done executing an instruction
|
||||||
else
|
elsif controller_to_manager.done_reading = '1' then
|
||||||
if controller_to_manager.done_reading = '1' then
|
manager_state.memory(0) <= manager_word_reset_val;
|
||||||
manager_state.memory(0) <= manager_word_reset_val;
|
elsif controller_to_manager.done_writing = '1' then
|
||||||
end if;
|
manager_state.memory(1) <= manager_word_reset_val;
|
||||||
if controller_to_manager.done_writing = '1' then
|
|
||||||
manager_state.memory(1) <= manager_word_reset_val;
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
-- Is there a read instruction in memory
|
-- Is there a read instruction in memory
|
||||||
if pack(read_address) /= empty_word and controller_to_manager.ready = '1' and controller_to_manager.done_reading = '0' then
|
if pack(read_address) /= empty_word and controller_to_manager.ready = '1' and controller_to_manager.done_reading = '0' then
|
||||||
|
|||||||
@ -238,8 +238,8 @@ begin
|
|||||||
when TX_W_BODY =>
|
when TX_W_BODY =>
|
||||||
if st.tx_stage > 0 then
|
if st.tx_stage > 0 then
|
||||||
socbridge_driver_to_ip.ready <= '1';
|
socbridge_driver_to_ip.ready <= '1';
|
||||||
if ip_to_socbridge_driver.fifo.valid = '1' then
|
if ip_to_socbridge_driver.valid = '1' then
|
||||||
local_next_data_out := ip_to_socbridge_driver.fifo.data;
|
local_next_data_out := ip_to_socbridge_driver.data;
|
||||||
else
|
else
|
||||||
local_next_data_out := (others => '0');
|
local_next_data_out := (others => '0');
|
||||||
end if;
|
end if;
|
||||||
@ -293,8 +293,7 @@ begin
|
|||||||
if st.curr_rx_transaction = READ or st.curr_rx_transaction = READ_ADD
|
if st.curr_rx_transaction = READ or st.curr_rx_transaction = READ_ADD
|
||||||
or st.curr_rx_transaction = WRITE or st.curr_rx_transaction = WRITE_ADD then
|
or st.curr_rx_transaction = WRITE or st.curr_rx_transaction = WRITE_ADD then
|
||||||
trans_write_next_state <= IDLE;
|
trans_write_next_state <= IDLE;
|
||||||
elsif trans_st.write.curr_inst.request = '1' and (ip_to_socbridge_driver.fifo.used_slots >= MAX_PKT_SIZE
|
elsif trans_st.write.curr_inst.request = '1' then
|
||||||
or ip_to_socbridge_driver.flush = '1') then
|
|
||||||
trans_write_next_state <= SEND;
|
trans_write_next_state <= SEND;
|
||||||
else
|
else
|
||||||
trans_write_next_state <= IDLE;
|
trans_write_next_state <= IDLE;
|
||||||
@ -313,11 +312,7 @@ begin
|
|||||||
when AWAIT =>
|
when AWAIT =>
|
||||||
if trans_st.write.curr_inst.seq_mem_access_count <= MAX_PKT_SIZE and st.curr_tx_state = IDLE then
|
if trans_st.write.curr_inst.seq_mem_access_count <= MAX_PKT_SIZE and st.curr_tx_state = IDLE then
|
||||||
trans_write_next_state <= IDLE;
|
trans_write_next_state <= IDLE;
|
||||||
elsif ip_to_socbridge_driver.fifo.used_slots = 0 and ip_to_socbridge_driver.flush = '1'
|
elsif st.curr_tx_state = IDLE then
|
||||||
and st.curr_tx_state = IDLE then
|
|
||||||
trans_write_next_state <= IDLE;
|
|
||||||
elsif st.curr_tx_state = IDLE and (ip_to_socbridge_driver.fifo.used_slots >= MAX_PKT_SIZE
|
|
||||||
or ip_to_socbridge_driver.flush = '1') then
|
|
||||||
trans_write_next_state <= SEND;
|
trans_write_next_state <= SEND;
|
||||||
else
|
else
|
||||||
trans_write_next_state <= AWAIT;
|
trans_write_next_state <= AWAIT;
|
||||||
@ -350,8 +345,6 @@ begin
|
|||||||
when AWAIT =>
|
when AWAIT =>
|
||||||
if trans_st.read.curr_inst.seq_mem_access_count <= MAX_PKT_SIZE and st.curr_tx_state = IDLE then
|
if trans_st.read.curr_inst.seq_mem_access_count <= MAX_PKT_SIZE and st.curr_tx_state = IDLE then
|
||||||
trans_read_next_state <= IDLE;
|
trans_read_next_state <= IDLE;
|
||||||
elsif ip_to_socbridge_driver.flush = '1'and st.curr_tx_state = IDLE then
|
|
||||||
trans_read_next_state <= IDLE;
|
|
||||||
elsif st.curr_tx_state = IDLE then
|
elsif st.curr_tx_state = IDLE then
|
||||||
trans_read_next_state <= SEND;
|
trans_read_next_state <= SEND;
|
||||||
else
|
else
|
||||||
@ -550,9 +543,7 @@ begin
|
|||||||
trans_st.write.curr_inst.seq_mem_access_count <= trans_st.write.curr_inst.seq_mem_access_count - MAX_PKT_SIZE;
|
trans_st.write.curr_inst.seq_mem_access_count <= trans_st.write.curr_inst.seq_mem_access_count - MAX_PKT_SIZE;
|
||||||
trans_st.write.curr_inst.address <= std_logic_vector(unsigned(trans_st.write.curr_inst.address) + MAX_PKT_SIZE);
|
trans_st.write.curr_inst.address <= std_logic_vector(unsigned(trans_st.write.curr_inst.address) + MAX_PKT_SIZE);
|
||||||
when AWAIT =>
|
when AWAIT =>
|
||||||
if ((ip_to_socbridge_driver.fifo.used_slots = 0 and ip_to_socbridge_driver.flush = '1')
|
if trans_st.write.curr_inst.seq_mem_access_count <= 0 and st.curr_tx_state = IDLE then
|
||||||
or trans_st.write.curr_inst.seq_mem_access_count <= 0)
|
|
||||||
and st.curr_tx_state = TX_W_BODY then
|
|
||||||
trans_st.write.curr_inst.request <= '0';
|
trans_st.write.curr_inst.request <= '0';
|
||||||
trans_st.write.curr_inst.address <= (others => '0');
|
trans_st.write.curr_inst.address <= (others => '0');
|
||||||
trans_st.write.curr_inst.seq_mem_access_count <= 0;
|
trans_st.write.curr_inst.seq_mem_access_count <= 0;
|
||||||
@ -579,7 +570,7 @@ begin
|
|||||||
trans_st.read.curr_inst.seq_mem_access_count <= trans_st.read.curr_inst.seq_mem_access_count - MAX_PKT_SIZE;
|
trans_st.read.curr_inst.seq_mem_access_count <= trans_st.read.curr_inst.seq_mem_access_count - MAX_PKT_SIZE;
|
||||||
trans_st.read.curr_inst.address <= std_logic_vector(unsigned(trans_st.read.curr_inst.address) + MAX_PKT_SIZE);
|
trans_st.read.curr_inst.address <= std_logic_vector(unsigned(trans_st.read.curr_inst.address) + MAX_PKT_SIZE);
|
||||||
when AWAIT =>
|
when AWAIT =>
|
||||||
if (ip_to_socbridge_driver.flush = '1' or trans_st.read.curr_inst.seq_mem_access_count <= 0) and st.curr_tx_state = IDLE then
|
if trans_st.read.curr_inst.seq_mem_access_count <= 0 and st.curr_tx_state = IDLE then
|
||||||
trans_st.read.curr_inst.request <= '0';
|
trans_st.read.curr_inst.request <= '0';
|
||||||
trans_st.read.curr_inst.address <= (others => '0');
|
trans_st.read.curr_inst.address <= (others => '0');
|
||||||
trans_st.read.curr_inst.seq_mem_access_count <= 0;
|
trans_st.read.curr_inst.seq_mem_access_count <= 0;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user