Commit 82800325 authored by Andrey Filippov's avatar Andrey Filippov

made the whole program to run automatically from the command file

parent 5d662c48
...@@ -2838,7 +2838,7 @@ class X393McntrlAdjust(object): ...@@ -2838,7 +2838,7 @@ class X393McntrlAdjust(object):
return cmd_odelay return cmd_odelay
def measure_all(self, def measure_all(self,
tasks="CWRPOAZ", tasks="ICWRPOASZ",
prim_steps=1, prim_steps=1,
primary_set_in=2, primary_set_in=2,
primary_set_out=2, primary_set_out=2,
...@@ -2869,9 +2869,14 @@ class X393McntrlAdjust(object): ...@@ -2869,9 +2869,14 @@ class X393McntrlAdjust(object):
safe_phase=0.25 # 0: strictly follow cmda_odelay, >0 -program with this fraction of clk period from the margin safe_phase=0.25 # 0: strictly follow cmda_odelay, >0 -program with this fraction of clk period from the margin
commonFine=True, # use same values for fine delay for address/bank lines commonFine=True, # use same values for fine delay for address/bank lines
addr_odly_max_err= 0.125 # 1/8 period addr_odly_max_err= 0.125 # 1/8 period
task_data=[
{'key':'I',
'func':self.x393_pio_sequences.task_set_up,
'comment':'Initial setup - memory controller, sequnces',
'params':{'quiet':quiet+1}},
task_data=[{'key':'C', {'key':'C',
'func':self.adjust_cmda_odelay, 'func':self.adjust_cmda_odelay,
'comment':'Measuring CMDA output delay for each clock phase', 'comment':'Measuring CMDA output delay for each clock phase',
'params':{'start_phase':0, 'params':{'start_phase':0,
...@@ -2957,6 +2962,17 @@ class X393McntrlAdjust(object): ...@@ -2957,6 +2962,17 @@ class X393McntrlAdjust(object):
'max_err':addr_odly_max_err, 'max_err':addr_odly_max_err,
'quiet':quiet+1}}, 'quiet':quiet+1}},
{'key':'S',
'func':self.get_delays_vs_phase,
'comment':'Setting calculated delays to global parameters to be used when setting phase',
'params':{'filter_dqo': 2,
'filter_dqi': 2,
'filter_dqso':2,
'filter_dqsi':2,
'filter_cmda':2,
'keep_all':False,
'set_table':True,
'quiet':quiet+1}},
{'key':'Z', {'key':'Z',
'func':self.show_all_vs_phase, 'func':self.show_all_vs_phase,
'comment':'Printing results table (delays and errors vs. phase)- all, including invalid phases', 'comment':'Printing results table (delays and errors vs. phase)- all, including invalid phases',
......
...@@ -105,6 +105,7 @@ class X393McntrlTests(object): ...@@ -105,6 +105,7 @@ class X393McntrlTests(object):
((0,1)[write_mem],1), # write_mem, ((0,1)[write_mem],1), # write_mem,
((0,1)[enable], 1), #enable, ((0,1)[enable], 1), #enable,
((1,0)[chn_reset],1)) # ~chn_reset}; ((1,0)[chn_reset],1)) # ~chn_reset};
'''
def task_set_up(self, def task_set_up(self,
set_per_pin_delays=0): set_per_pin_delays=0):
""" """
...@@ -121,7 +122,7 @@ class X393McntrlTests(object): ...@@ -121,7 +122,7 @@ class X393McntrlTests(object):
write buffer latency write buffer latency
<set_per_pin_delays> - 1 - set individual (per-pin) I/O delays, 0 - use common for the whole class <set_per_pin_delays> - 1 - set individual (per-pin) I/O delays, 0 - use common for the whole class
Returns 1 if phase was set, 0 if it failed Returns 1 if phase was set, 0 if it failed
"""
#reset memory controller #reset memory controller
self.x393_axi_tasks.enable_memcntrl(0) self.x393_axi_tasks.enable_memcntrl(0)
#enable memory controller #enable memory controller
...@@ -133,7 +134,7 @@ class X393McntrlTests(object): ...@@ -133,7 +134,7 @@ class X393McntrlTests(object):
# set patterns for DM (always 0) and DQS - always the same (may try different for write lev.) # set patterns for DM (always 0) and DQS - always the same (may try different for write lev.)
self.x393_mcntrl_timing.axi_set_dqs_dqm_patterns() self.x393_mcntrl_timing.axi_set_dqs_dqm_patterns()
# prepare all sequences # prepare all sequences
self.set_all_sequences() self.x393_pio_sequences.set_all_sequences()
# prepare write buffer # prepare write buffer
self.x393_mcntrl_buffers.write_block_buf_chn(0,0,256); # fill block memory (channel, page, number) self.x393_mcntrl_buffers.write_block_buf_chn(0,0,256); # fill block memory (channel, page, number)
# set all delays # set all delays
...@@ -159,36 +160,8 @@ class X393McntrlTests(object): ...@@ -159,36 +160,8 @@ class X393McntrlTests(object):
self.x393_mcntrl_timing.axi_set_wbuf_delay(vrlg.WBUF_DLY_DFLT) self.x393_mcntrl_timing.axi_set_wbuf_delay(vrlg.WBUF_DLY_DFLT)
self.x393_axi_tasks.read_all_status() self.x393_axi_tasks.read_all_status()
return 1 return 1
'''
def set_all_sequences(self):
"""
Set all sequences: MRS, REFRESH, WRITE LEVELLING, READ PATTERN, WRITE BLOCK, READ BLOCK
"""
if self.verbose>0: print("SET MRS")
self.x393_pio_sequences.set_mrs(1) # reset DLL
if self.verbose>0: print("SET REFRESH")
self.x393_pio_sequences.set_refresh(
vrlg.T_RFC, # input [ 9:0] t_rfc; # =50 for tCK=2.5ns
vrlg.T_REFI) #input [ 7:0] t_refi; # 48/97 for normal, 16 - for simulation
if self.verbose>0: print("SET WRITE LEVELING")
self.x393_pio_sequences.set_write_lev(16) # write leveling, 16 times (full buffer - 128)
if self.verbose>0: print("SET READ PATTERNt")
self.x393_pio_sequences.set_read_pattern(8) # 8x2*64 bits, 32x32 bits to read
if self.verbose>0: print("SET WRITE BLOCK")
self.x393_pio_sequences.set_write_block(
5, # 3'h5, # bank
0x1234, # 15'h1234, # row address
0x100 # 10'h100 # column address
)
if self.verbose>0: print("SET READ BLOCK");
self.x393_pio_sequences.set_read_block (
5, # 3'h5, # bank
0x1234, # 15'h1234, # row address
0x100 # 10'h100 # column address
)
self.x393_axi_tasks.set_sequences_set(1) # Mark sequences as being set
def init_ddr3(self, def init_ddr3(self,
refresh=1, refresh=1,
wait_complete=True): wait_complete=True):
......
...@@ -164,18 +164,18 @@ class X393McntrlTiming(object): ...@@ -164,18 +164,18 @@ class X393McntrlTiming(object):
# self.x393_axi_tasks.write_contol_register(vrlg.LD_DLY_LANE1_IDELAY + 8, vrlg.DLY_LANE1_DQS_WLV_IDELAY) # self.x393_axi_tasks.write_contol_register(vrlg.LD_DLY_LANE1_IDELAY + 8, vrlg.DLY_LANE1_DQS_WLV_IDELAY)
self.x393_axi_tasks.write_contol_register(vrlg.DLY_SET,0) self.x393_axi_tasks.write_contol_register(vrlg.DLY_SET,0)
def axi_set_delays(self): # set all individual delays def axi_set_delays(self,quiet=1): # set all individual delays
""" """
Set all DDR3 I/O delays to individual parameter-defined values (using default values, Set all DDR3 I/O delays to individual parameter-defined values (using default values,
current ones are supposed to be synchronized) current ones are supposed to be synchronized)
""" """
self.axi_set_dq_idelay() self.axi_set_dq_idelay(quiet=quiet)
self.axi_set_dqs_idelay() self.axi_set_dqs_idelay(quiet=quiet)
self.axi_set_dq_odelay() self.axi_set_dq_odelay(quiet=quiet)
self.axi_set_dqs_odelay() self.axi_set_dqs_odelay(quiet=quiet)
self.axi_set_dm_odelay() self.axi_set_dm_odelay(quiet=quiet)
self.axi_set_cmda_odelay() self.axi_set_cmda_odelay(quiet=quiet)
self.axi_set_phase() self.axi_set_phase(quiet=quiet)
def axi_set_dq_idelay(self, # sets same delay to all dq idelay def axi_set_dq_idelay(self, # sets same delay to all dq idelay
delay=None, # input [7:0] delay; delay=None, # input [7:0] delay;
......
...@@ -32,6 +32,7 @@ __status__ = "Development" ...@@ -32,6 +32,7 @@ __status__ = "Development"
#import x393_mem #import x393_mem
#x393_pio_sequences #x393_pio_sequences
#from import_verilog_parameters import VerilogParameters #from import_verilog_parameters import VerilogParameters
from x393_mcntrl_timing import X393McntrlTiming
from x393_mem import X393Mem from x393_mem import X393Mem
#from x393_axi_control_status import X393AxiControlStatus #from x393_axi_control_status import X393AxiControlStatus
import x393_axi_control_status import x393_axi_control_status
...@@ -48,6 +49,7 @@ class X393PIOSequences(object): ...@@ -48,6 +49,7 @@ class X393PIOSequences(object):
# vpars=None # vpars=None
x393_mem=None x393_mem=None
x393_axi_tasks=None #x393X393AxiControlStatus x393_axi_tasks=None #x393X393AxiControlStatus
x393_mcntrl_timing=None
target_phase=0 # TODO: set! target_phase=0 # TODO: set!
def __init__(self, debug_mode=1,dry_mode=True): def __init__(self, debug_mode=1,dry_mode=True):
self.DEBUG_MODE=debug_mode self.DEBUG_MODE=debug_mode
...@@ -56,6 +58,7 @@ class X393PIOSequences(object): ...@@ -56,6 +58,7 @@ class X393PIOSequences(object):
# self.x393_axi_tasks=X393AxiControlStatus(debug_mode,dry_mode) # self.x393_axi_tasks=X393AxiControlStatus(debug_mode,dry_mode)
self.x393_axi_tasks=x393_axi_control_status.X393AxiControlStatus(debug_mode,dry_mode) self.x393_axi_tasks=x393_axi_control_status.X393AxiControlStatus(debug_mode,dry_mode)
self.x393_mcntrl_buffers= X393McntrlBuffers(debug_mode,dry_mode) self.x393_mcntrl_buffers= X393McntrlBuffers(debug_mode,dry_mode)
self.x393_mcntrl_timing= X393McntrlTiming(debug_mode,dry_mode)
# self.__dict__.update(VerilogParameters.__dict__["_VerilogParameters__shared_state"]) # Add verilog parameters to the class namespace # self.__dict__.update(VerilogParameters.__dict__["_VerilogParameters__shared_state"]) # Add verilog parameters to the class namespace
''' '''
Maybe import parameters into the module, not class namespace to use directly, w/o self. ? Maybe import parameters into the module, not class namespace to use directly, w/o self. ?
...@@ -911,6 +914,44 @@ class X393PIOSequences(object): ...@@ -911,6 +914,44 @@ class X393PIOSequences(object):
self.x393_mem.axi_write_single_w(cmd_addr, data, verbose) self.x393_mem.axi_write_single_w(cmd_addr, data, verbose)
cmd_addr += 1 cmd_addr += 1
def set_all_sequences(self, quiet=1):
"""
Set all sequences: MRS, REFRESH, WRITE LEVELLING, READ PATTERN, WRITE BLOCK, READ BLOCK
"""
if quiet < 3 :
print("SET MRS")
self.set_mrs(1) # reset DLL
if quiet < 3 :
print("SET REFRESH")
self.set_refresh(
vrlg.T_RFC, # input [ 9:0] t_rfc; # =50 for tCK=2.5ns
vrlg.T_REFI) #input [ 7:0] t_refi; # 48/97 for normal, 16 - for simulation
if quiet < 3:
print("SET WRITE LEVELING")
self.set_write_lev(16) # write leveling, 16 times (full buffer - 128)
if quiet < 3:
print("SET READ PATTERNt")
self.set_read_pattern(8) # 8x2*64 bits, 32x32 bits to read
if quiet < 3:
print("SET WRITE BLOCK")
self.set_write_block(
5, # 3'h5, # bank
0x1234, # 15'h1234, # row address
0x100 # 10'h100 # column address
)
if quiet < 3:
print("SET READ BLOCK");
self.set_read_block (
5, # 3'h5, # bank
0x1234, # 15'h1234, # row address
0x100 # 10'h100 # column address
)
self.x393_axi_tasks.set_sequences_set(1) # Mark sequences as being set
def read_pattern(self, def read_pattern(self,
num, num,
show_rslt, show_rslt,
...@@ -1115,3 +1156,52 @@ class X393PIOSequences(object): ...@@ -1115,3 +1156,52 @@ class X393PIOSequences(object):
wait_complete ); # wait_complete; # Do not request a newe transaction from the scheduler until previous memory transaction is finished wait_complete ); # wait_complete; # Do not request a newe transaction from the scheduler until previous memory transaction is finished
# Wait PS PIO sequence DOEN # Wait PS PIO sequence DOEN
self.wait_ps_pio_done(vrlg.DEFAULT_STATUS_MODE, 1 , 2.0); # wait FIFO not half full, sync sequences, timeout 2 sec self.wait_ps_pio_done(vrlg.DEFAULT_STATUS_MODE, 1 , 2.0); # wait FIFO not half full, sync sequences, timeout 2 sec
def task_set_up(self,
quiet = 1):
"""
Initial setup of the memory controller, including:
disable (and reset) memory controller
enable memory controller
setup status generation in all modules
tristate patterns
DQS/DQM patterns
all sequences
channel 0 buffer data
I/O delays
clock phase
write buffer latency
<set_per_pin_delays> - 1 - set individual (per-pin) I/O delays, 0 - use common for the whole class
Returns 1 if phase was set, 0 if it failed
"""
#reset memory controller
self.x393_axi_tasks.enable_memcntrl(0)
#enable memory controller
self.x393_axi_tasks.enable_memcntrl(1)
#program status for all used modules to refresh at any bit change
self.x393_axi_tasks.program_status_all(3, 0)
# set dq /dqs tristate on/off patterns
self.x393_mcntrl_timing.axi_set_tristate_patterns()
# set patterns for DM (always 0) and DQS - always the same (may try different for write lev.)
self.x393_mcntrl_timing.axi_set_dqs_dqm_patterns()
# prepare all sequences
self.set_all_sequences(quiet)
# prepare write buffer
self.x393_mcntrl_buffers.write_block_buf_chn(0,0,256,quiet); # fill block memory (channel, page, number)
# set all delays
# Make it an only option TODO: do the same for the simulation!!
self.x393_mcntrl_timing.axi_set_delays() # set all individual delays, aslo runs axi_set_phase()
# set clock phase relative to DDR clk
#phase already set in axi_set_delays
# print("Debugging: sleeping for 1 second")
# sleep(1)
# phaseOK=self.x393_mcntrl_timing.axi_set_phase(vrlg.DLY_PHASE,wait_phase_en=True); # wait for phase set
# if not phaseOK:
# print("Failed to set clock phase")
# return 0
# read and print status (optional)
self.x393_mcntrl_timing.axi_set_wbuf_delay(vrlg.WBUF_DLY_DFLT)
self.x393_axi_tasks.read_all_status()
return 1
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment