Skip to content
Snippets Groups Projects
Commit f7e00a71 authored by Job van Wee's avatar Job van Wee
Browse files

Ready for review.

parent c1a6f9d6
Branches
No related tags found
1 merge request!236Resolve L2SDP-704
Pipeline #28554 passed
...@@ -100,7 +100,6 @@ ARCHITECTURE str OF ddrctrl IS ...@@ -100,7 +100,6 @@ ARCHITECTURE str OF ddrctrl IS
SIGNAL stop : STD_LOGIC; SIGNAL stop : STD_LOGIC;
SIGNAL rd_fifo_usedw: STD_LOGIC_VECTOR(ceil_log2(c_rd_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w) )-1 DOWNTO 0); SIGNAL rd_fifo_usedw: STD_LOGIC_VECTOR(ceil_log2(c_rd_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w) )-1 DOWNTO 0);
SIGNAL rd_ready : STD_LOGIC; SIGNAL rd_ready : STD_LOGIC;
SIGNAL inp_ds : NATURAL; SIGNAL inp_ds : NATURAL;
SIGNAL inp_bsn : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); SIGNAL inp_bsn : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0);
SIGNAL inp_bsn_adr : NATURAL; SIGNAL inp_bsn_adr : NATURAL;
......
...@@ -88,10 +88,6 @@ ARCHITECTURE rtl OF ddrctrl_controller IS ...@@ -88,10 +88,6 @@ ARCHITECTURE rtl OF ddrctrl_controller IS
CONSTANT c_rest : NATURAL := c_rd_data_w-(g_wr_data_w mod c_rd_data_w); -- 96 CONSTANT c_rest : NATURAL := c_rd_data_w-(g_wr_data_w mod c_rd_data_w); -- 96
CONSTANT c_max_read_cnt : NATURAL := (c_max_adr+1)/c_burstsize; -- 256 CONSTANT c_max_read_cnt : NATURAL := (c_max_adr+1)/c_burstsize; -- 256
-- not needed hopefully
--CONSTANT c_gcd : NATURAL := GCD(c_rd_data_w, g_wr_data_w); -- 24
--CONSTANT c_ofset_repeat : NATURAL := c_rd_data_wc/c_gcd; -- 7
-- type for statemachine -- type for statemachine
TYPE t_state IS (RESET, WRITING, SET_STOP, STOP_WRITING, START_READING, READING, STOP_READING, IDLE); TYPE t_state IS (RESET, WRITING, SET_STOP, STOP_WRITING, START_READING, READING, STOP_READING, IDLE);
...@@ -153,7 +149,9 @@ BEGIN ...@@ -153,7 +149,9 @@ BEGIN
WHEN WRITING => WHEN WRITING =>
IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_adr-1 DOWNTO 0) = c_zeros THEN -- if adr mod c_burstsize = 0 -- if adr mod c_burstsize = 0
-- this makes sure that only ones every 64 writes a writeburst is started.
IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_adr-1 DOWNTO 0) = c_zeros THEN
v.dvr_mosi.burstbegin := '1'; v.dvr_mosi.burstbegin := '1';
IF inp_adr = 0 THEN IF inp_adr = 0 THEN
v.dvr_mosi.address := TO_UVEC(c_max_adr-c_burstsize, dvr_mosi.address'length); v.dvr_mosi.address := TO_UVEC(c_max_adr-c_burstsize, dvr_mosi.address'length);
...@@ -193,7 +191,9 @@ BEGIN ...@@ -193,7 +191,9 @@ BEGIN
v.stop_adr(c_bitshift_adr-1 DOWNTO 0) := c_zeros; v.stop_adr(c_bitshift_adr-1 DOWNTO 0) := c_zeros;
-- still a write cyle -- still a write cyle
IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_adr-1 DOWNTO 0) = c_zeros THEN -- adr mod 64 = 0 -- if adr mod c_burstsize = 0
-- this makes sure that only ones every 64 writes a writeburst is started.
IF TO_UVEC(inp_adr, c_adr_w)(c_bitshift_adr-1 DOWNTO 0) = c_zeros THEN
v.dvr_mosi.burstbegin := '1'; v.dvr_mosi.burstbegin := '1';
IF inp_adr = 0 THEN IF inp_adr = 0 THEN
v.dvr_mosi.address := TO_UVEC(c_max_adr-c_burstsize, dvr_mosi.address'length); v.dvr_mosi.address := TO_UVEC(c_max_adr-c_burstsize, dvr_mosi.address'length);
...@@ -225,7 +225,8 @@ BEGIN ...@@ -225,7 +225,8 @@ BEGIN
WHEN STOP_WRITING => WHEN STOP_WRITING =>
v.dvr_mosi.burstbegin := '0'; v.dvr_mosi.burstbegin := '0';
IF dvr_miso.done = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN -- wait until the write burst is finished -- wait until the write burst is finished
IF dvr_miso.done = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN
v.stopped := '1'; v.stopped := '1';
v.wr_sosi.valid := '0'; v.wr_sosi.valid := '0';
v.dvr_mosi.flush := '1'; v.dvr_mosi.flush := '1';
...@@ -254,7 +255,7 @@ BEGIN ...@@ -254,7 +255,7 @@ BEGIN
END IF; END IF;
END LOOP; END LOOP;
v.outp_bsn := TO_UVEC(TO_UINT(inp_bsn)-((inp_bsn_adr+(c_max_adr-TO_UINT(q_reg.stop_adr)))*g_wr_data_w+v.outp_ds-inp_ds)/c_rd_data_w, c_dp_stream_bsn_w); -- maths WRONG, wil be fixed after L2SDP-705, 706, 707 and 708 v.outp_bsn := TO_UVEC(TO_UINT(inp_bsn)-((inp_bsn_adr+(c_max_adr-TO_UINT(q_reg.stop_adr)))*g_wr_data_w+v.outp_ds-inp_ds)/c_rd_data_w, c_dp_stream_bsn_w); -- WRONG, wil be fixed after L2SDP-705, 706, 707 and 708
IF rst = '1' THEN IF rst = '1' THEN
...@@ -265,14 +266,12 @@ BEGIN ...@@ -265,14 +266,12 @@ BEGIN
WHEN READING => WHEN READING =>
-- rd_fifo needs a refil after rd_fifo_usedw <= 10 because of delays, if you wait until rd_fifo_usedw = 0 then you get an empty fifo which results in your outputs sosi.valid not being constatly valid.
IF TO_UINT(rd_fifo_usedw) <= 10 AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' AND dvr_miso.done = '1' THEN -- rd_fifo needs a refil after rd_fifo_usedw <= 10 because of delays, if you wait until rd_fifo_usedw = 0 then you get an empty fifo for to long IF TO_UINT(rd_fifo_usedw) <= 10 AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' AND dvr_miso.done = '1' THEN
IF TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+c_burstsize*q_reg.read_cnt >= c_max_adr THEN IF TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+c_burstsize*q_reg.read_cnt >= c_max_adr THEN
v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC((TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+c_burstsize*q_reg.read_cnt)-c_max_adr-1, c_adr_w); v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC((TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+c_burstsize*q_reg.read_cnt)-c_max_adr-1, c_adr_w);
--assert false report "1. address: " & natural'image((TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+c_burstsize*q_reg.read_cnt)-c_max_adr) severity note;
ELSE ELSE
v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+c_burstsize*q_reg.read_cnt, c_adr_w); v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+c_burstsize*q_reg.read_cnt, c_adr_w);
--assert false report "2. address: " & natural'image((TO_UINT(q_reg.stop_adr(c_adr_w-1 DOWNTO 0))+c_burstsize*q_reg.read_cnt)) severity note;
END IF; END IF;
v.dvr_mosi.burstbegin := '1'; v.dvr_mosi.burstbegin := '1';
v.read_cnt := v.read_cnt+1; v.read_cnt := v.read_cnt+1;
...@@ -281,7 +280,8 @@ BEGIN ...@@ -281,7 +280,8 @@ BEGIN
v.dvr_mosi.burstbegin := '0'; v.dvr_mosi.burstbegin := '0';
END IF; END IF;
IF TO_UINT(rd_fifo_usedw) = 11 THEN -- make sure the fifo is filled before asking for another rd request. to prevent 4 rd burst to happend directly after one another. -- makes sure the fifo is filled before asking for another rd request. to prevent 4 rd burst to happend directly after one another.
IF TO_UINT(rd_fifo_usedw) = 11 THEN
v.rd_burst_en := '1'; v.rd_burst_en := '1';
END IF; END IF;
...@@ -294,10 +294,9 @@ BEGIN ...@@ -294,10 +294,9 @@ BEGIN
END IF; END IF;
WHEN IDLE =>
WHEN IDLE =>
-- the statemachine goes to Idle when its finished or when its waiting on other components.
IF rst = '1' THEN IF rst = '1' THEN
v.state := RESET; v.state := RESET;
ELSIF stop_in = '1' THEN ELSIF stop_in = '1' THEN
......
...@@ -22,15 +22,12 @@ ...@@ -22,15 +22,12 @@
-- stored in a DDR RAM-stick. -- stored in a DDR RAM-stick.
-- --
-- Description: -- Description:
-- First the data from the sosi array gets collected into one data vector. -- First the data from the ddr memory gets resized into its original size
-- After that this data vector gets resized to the right size data vector in -- after that the data gets assigned a bsn.
-- order to make it storable in a DDR RAM-stick.
-- After that a address gets assigned to the data so the data can be found back.
-- --
-- Remark: -- Remark:
-- Use VHDL coding template from: -- Use VHDL coding template from:
-- https://support.astron.nl/confluence/display/SBe/VHDL+design+patterns+for+RTL+coding -- https://support.astron.nl/confluence/display/SBe/VHDL+design+patterns+for+RTL+coding
-- The maximum value of the address is determend by g_tech_ddr.
LIBRARY IEEE, technology_lib, tech_ddr_lib, common_lib, dp_lib; LIBRARY IEEE, technology_lib, tech_ddr_lib, common_lib, dp_lib;
USE IEEE.std_logic_1164.ALL; USE IEEE.std_logic_1164.ALL;
...@@ -65,7 +62,7 @@ END ddrctrl_output; ...@@ -65,7 +62,7 @@ END ddrctrl_output;
ARCHITECTURE str OF ddrctrl_output IS ARCHITECTURE str OF ddrctrl_output IS
-- constant for readability -- constant for readability
CONSTANT c_out_data_w : NATURAL := g_nof_streams*g_data_w; -- the input data with for ddrctrl_repack 168 CONSTANT c_out_data_w : NATURAL := g_nof_streams*g_data_w; -- the input data width for ddrctrl_repack 168
-- signals for connecting the components -- signals for connecting the components
SIGNAL sosi : t_dp_sosi := c_dp_sosi_init; SIGNAL sosi : t_dp_sosi := c_dp_sosi_init;
......
...@@ -93,8 +93,9 @@ BEGIN ...@@ -93,8 +93,9 @@ BEGIN
CASE q_reg.state IS CASE q_reg.state IS
WHEN READING => WHEN READING =>
-- generating output from the data already present in c_v
v.out_ready := '0'; v.out_ready := '0';
v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
v.out_sosi.valid := '1'; v.out_sosi.valid := '1';
v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1); v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1);
v.op_data_cnt := q_reg.op_data_cnt+1; v.op_data_cnt := q_reg.op_data_cnt+1;
...@@ -118,8 +119,9 @@ BEGIN ...@@ -118,8 +119,9 @@ BEGIN
WHEN OVER_HALF => WHEN OVER_HALF =>
-- generating output data from c_v but past the halfway point of c_v so there needs to be new data added
v.out_ready := '1'; v.out_ready := '1';
v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of);
v.out_sosi.valid := '1'; v.out_sosi.valid := '1';
v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1); v.out_sosi.bsn(c_dp_stream_bsn_w-1 DOWNTO 0) := INCR_UVEC(q_reg.out_sosi.bsn, 1);
v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w); v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w);
...@@ -147,7 +149,8 @@ BEGIN ...@@ -147,7 +149,8 @@ BEGIN
WHEN FIRST_READ => WHEN FIRST_READ =>
v.out_ready := '1'; -- fills the first half of c_v and generates a output from it.
v.out_ready := '0';
v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
v.dd_fresh := '0'; v.dd_fresh := '0';
v.a_of := in_ds+2-((12-5)*14); -- will be fixed after in_ds is fixed in ddrctrl_controller. v.a_of := in_ds+2-((12-5)*14); -- will be fixed after in_ds is fixed in ddrctrl_controller.
...@@ -170,7 +173,8 @@ BEGIN ...@@ -170,7 +173,8 @@ BEGIN
END IF; END IF;
WHEN SECOND_READ => WHEN SECOND_READ =>
v.out_ready := '1'; -- fills the second half of c_v and generates a output from it.
v.out_ready := '0';
v.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); v.c_v(g_in_data_w*2-1 DOWNTO g_in_data_w) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0);
v.dd_fresh := '0'; v.dd_fresh := '0';
v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v(g_out_data_w*2+q_reg.a_of-1 DOWNTO g_out_data_w+q_reg.a_of); v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := v.c_v(g_out_data_w*2+q_reg.a_of-1 DOWNTO g_out_data_w+q_reg.a_of);
...@@ -212,6 +216,7 @@ BEGIN ...@@ -212,6 +216,7 @@ BEGIN
END IF; END IF;
WHEN IDLE => WHEN IDLE =>
-- the statemachine goes to Idle when its finished or when its waiting on other components.
v.out_ready := '1'; v.out_ready := '1';
v.out_sosi.valid := '0'; v.out_sosi.valid := '0';
...@@ -234,6 +239,7 @@ BEGIN ...@@ -234,6 +239,7 @@ BEGIN
WHEN OFF => WHEN OFF =>
-- the stamachine has a state off so it knows when to go to first read, it can't go to first read from IDLE
v.out_ready := '1'; v.out_ready := '1';
v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0); v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0);
......
...@@ -175,11 +175,10 @@ BEGIN ...@@ -175,11 +175,10 @@ BEGIN
ASSERT FALSE REPORT "Test: OK" SEVERITY FAILURE; ASSERT FALSE REPORT "Test: OK" SEVERITY FAILURE;
END PROCESS; END PROCESS;
p_checking_output_data : PROCESS -- first do tickets L2SDP-708 and L2SDP-707 before finsishing this is worth my time p_checking_output_data : PROCESS -- first do tickets L2SDP-708 and L2SDP-707 before finsishing this is worth time
BEGIN BEGIN
WAIT UNTIL rising_edge(clk); WAIT UNTIL rising_edge(clk);
IF out_sosi_arr(0).valid = '1' THEN IF out_sosi_arr(0).valid = '1' THEN
--assert false report "checking" severity note;
FOR I IN 0 TO g_nof_streams-1 LOOP FOR I IN 0 TO g_nof_streams-1 LOOP
IF c_output_stop_adr+output_data_cnt <= c_max_adr THEN IF c_output_stop_adr+output_data_cnt <= c_max_adr THEN
--ASSERT out_sosi_arr(I).data(c_in_data_w-1 DOWNTO 0) = c_total_vector(g_data_w*(I+1)+(c_output_stop_adr+output_data_cnt)*c_ctrl_data_w-1 DOWNTO g_data_w*I+(c_output_stop_adr+output_data_cnt)*c_ctrl_data_w) REPORT "wrong output data at: " & NATURAL'image(c_output_stop_adr+output_data_cnt) SEVERITY ERROR; --ASSERT out_sosi_arr(I).data(c_in_data_w-1 DOWNTO 0) = c_total_vector(g_data_w*(I+1)+(c_output_stop_adr+output_data_cnt)*c_ctrl_data_w-1 DOWNTO g_data_w*I+(c_output_stop_adr+output_data_cnt)*c_ctrl_data_w) REPORT "wrong output data at: " & NATURAL'image(c_output_stop_adr+output_data_cnt) SEVERITY ERROR;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment