diff --git a/boards/uniboard1/designs/unb1_ddr3/src/vhdl/node_unb1_ddr3.vhd b/boards/uniboard1/designs/unb1_ddr3/src/vhdl/node_unb1_ddr3.vhd index a6d40cb2bccb38242f00825a714baacddad21be5..b1c3e7b0b880e52e3392f2de050707eeeef07574 100644 --- a/boards/uniboard1/designs/unb1_ddr3/src/vhdl/node_unb1_ddr3.vhd +++ b/boards/uniboard1/designs/unb1_ddr3/src/vhdl/node_unb1_ddr3.vhd @@ -105,17 +105,11 @@ ARCHITECTURE str OF node_unb1_ddr3 IS CONSTANT c_nof_streams : NATURAL := 1; CONSTANT c_seq_dat_w : NATURAL := 16; - -- DDR3 DP - SIGNAL wr_siso : t_dp_siso; - SIGNAL wr_sosi : t_dp_sosi; - - SIGNAL rd_siso : t_dp_siso; - SIGNAL rd_sosi : t_dp_sosi; - SIGNAL en_sync : STD_LOGIC; SIGNAL out_siso_arr : t_dp_siso_arr(c_nof_streams-1 DOWNTO 0) := (OTHERS=>c_dp_siso_rdy); -- Default xon='1' SIGNAL out_sosi_arr : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0); -- Output SOSI that contains the waveform data + SIGNAL in_siso_arr : t_dp_siso_arr(c_nof_streams-1 DOWNTO 0) := (OTHERS=>c_dp_siso_rdy); -- Default xon='1' SIGNAL in_sosi_arr : t_dp_sosi_arr(c_nof_streams-1 DOWNTO 0); BEGIN @@ -165,16 +159,16 @@ BEGIN wr_rst => dp_rst, wr_fifo_usedw => OPEN, - wr_sosi => wr_sosi, - wr_siso => wr_siso, + wr_sosi => out_sosi_arr(0), + wr_siso => out_siso_arr(0), -- Read FIFO clock domain rd_clk => dp_clk, rd_rst => dp_rst, rd_fifo_usedw => OPEN, - rd_sosi => rd_sosi, - rd_siso => rd_siso, + rd_sosi => in_sosi_arr(0), + rd_siso => in_siso_arr(0), term_ctrl_out => OPEN, term_ctrl_in => OPEN, @@ -265,7 +259,5 @@ BEGIN in_sosi_arr => in_sosi_arr ); - in_sosi_arr <= out_sosi_arr; - END str; diff --git a/boards/uniboard1/designs/unb1_ddr3/tb/python/tc_unb1_ddr3_seq.py b/boards/uniboard1/designs/unb1_ddr3/tb/python/tc_unb1_ddr3_seq.py index a0b9b6c9894f168ca5d47c34c13bb44d8dfff8dc..2e40ac780259eabf5df4690114e0f7a264e24f6e 100644 --- a/boards/uniboard1/designs/unb1_ddr3/tb/python/tc_unb1_ddr3_seq.py +++ b/boards/uniboard1/designs/unb1_ddr3/tb/python/tc_unb1_ddr3_seq.py @@ -33,6 +33,7 @@ Usage: # System imports import test_case import node_io +import pi_ddr3 import pi_diag_block_gen import pi_diag_tx_seq import pi_diag_data_buffer @@ -60,50 +61,76 @@ io = node_io.NodeIO(tc.nodeImages, tc.base_ip) # Create instances for the periperals c_nof_streams = 1 +c_nof_ddr3 = 1 # possible options: 1 or 2 + bg = pi_diag_block_gen.PiDiagBlockGen(tc, io, nofChannels=c_nof_streams, ramSizePerChannel=2**14) db = pi_diag_data_buffer.PiDiagDataBuffer(tc, io, nofStreams=c_nof_streams) tx_seq = pi_diag_tx_seq.PiDiagTxSeq(tc, io, nof_inst=c_nof_streams) rx_seq = pi_diag_rx_seq.PiDiagRxSeq(tc, io, nof_inst=c_nof_streams) +ddr3 = [] +for i in range(c_nof_ddr3): + ddr3.append(pi_ddr3.PiDDR3(tc, io, [i])) + +# Create object for DDR register map +ddr = pi_io_ddr.PiIoDdr(tc, io, nof_inst = 1) + ################################################################################################################## # Test -# Sequence off -#tx_seq.write(registers=[('control', 0x0 )]) +# Wait for power up (reset release) +io.wait_for_time(hw_time=0.01, sim_time=(1, 'us')) + +# Initialization tx_seq.write_disable() rx_seq.write_disable() -print 'read RX Sequencer result before run:' -result = rx_seq.read_result() -print result +# Read RX Sequencer result before run +rx_seq.read_result() -# Sequence restart -tx_seq.write_init(17) -io.wait_for_time(hw_time=0.01, sim_time=(1, 'us')) +# Wait for the DDR3 to become available +#ddr.read_io_ddr() +do_until_eq(ddr.read_init_done, ms_retry=3000, val=1, s_timeout=3600) + +# Set DDR3 controller in write mode and start writing +start_address = 0 +nof_words = 100 +ddr.set_address(data=start_address) +ddr.set_burstsize(data=nof_words) +ddr.set_write() +ddr.burstbegin() + +# Tx sequence start tx_seq.write_enable_cntr() + +# Tx sequence monitor for rep in range(tc.repeat): io.wait_for_time(hw_time=0.01, sim_time=(1, 'us')) tx_seq.read_cnt() +# Wait until controller write access is done +do_until_eq(ddr.read_done, ms_retry=3000, val=1, s_timeout=3600) + +# Rx sequence start rx_seq.write_enable_cntr() + +# Set DDR3 controller in read mode and start reading +ddr.set_read() +ddr.burstbegin() + +# Rx sequence monitor for rep in range(tc.repeat): io.wait_for_time(hw_time=0.01, sim_time=(1, 'us')) rx_seq.read_cnt() -print 'read RX Sequencer result after run:' -result = rx_seq.read_result() # result: 3 cannot occur, 2 = no data, 1 = error, 0 = ok -print result -#tc.append_log(3, 'result: %d' % result[0]) +# Wait until controller read access is done +do_until_eq(ddr.read_done, ms_retry=3000, val=1, s_timeout=3600) -#tx_seq.write_enable_prbs() +rx_seq.read_result() io.wait_for_time(hw_time=0.01, sim_time=(1, 'us')) -result = rx_seq.read_result() # result: 3 cannot occur, 2 = no data, 1 = error, 0 = ok -#tc.append_log(3, 'result: %d' % result[0]) - -if result[0]!=0: - tc.set_result('FAILED') +rx_seq.read_result() # End