Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
H
HDL
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
RTSD
HDL
Commits
5476475b
Commit
5476475b
authored
10 years ago
by
Eric Kooistra
Browse files
Options
Downloads
Patches
Plain Diff
Use rd_reg. Now also verify g_mm_broadcast=FALSE AND g_nof_streams>1
parent
a26d62cf
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd
+82
-32
82 additions, 32 deletions
libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd
with
82 additions
and
32 deletions
libraries/base/diag/tb/vhdl/tb_mms_diag_seq.vhd
+
82
−
32
View file @
5476475b
...
...
@@ -37,6 +37,7 @@ USE common_lib.tb_common_mem_pkg.ALL;
USE
common_lib
.
tb_common_pkg
.
ALL
;
USE
dp_lib
.
dp_stream_pkg
.
ALL
;
USE
dp_lib
.
tb_dp_pkg
.
ALL
;
USE
work
.
diag_pkg
.
ALL
;
USE
work
.
tb_diag_pkg
.
ALL
;
ENTITY
tb_mms_diag_seq
IS
...
...
@@ -44,8 +45,8 @@ ENTITY tb_mms_diag_seq IS
-- general
g_flow_control_verify
:
t_dp_flow_control_enum
:
=
e_active
;
-- always active or random flow control
-- specific
g_nof_streams
:
NATURAL
:
=
2
;
g_mm_broadcast_tx
:
BOOLEAN
:
=
TRU
E
;
g_nof_streams
:
NATURAL
:
=
1
;
g_mm_broadcast_tx
:
BOOLEAN
:
=
FALS
E
;
g_data_w
:
NATURAL
:
=
40
;
-- >= g_seq_dat_w
g_seq_dat_w
:
NATURAL
:
=
32
);
...
...
@@ -55,12 +56,14 @@ ARCHITECTURE str of tb_mms_diag_seq IS
CONSTANT
mm_clk_period
:
TIME
:
=
8
ns
;
-- 125 MHz
CONSTANT
dp_clk_period
:
TIME
:
=
5
ns
;
-- 200 MHz
CONSTANT
c_random_w
:
NATURAL
:
=
16
;
SIGNAL
random
:
STD_LOGIC_VECTOR
(
1
5
DOWNTO
0
)
:
=
(
OTHERS
=>
'0'
);
-- use different lengths to have different random sequences
SIGNAL
random
:
STD_LOGIC_VECTOR
(
c_random_w
-
1
DOWNTO
0
)
:
=
(
OTHERS
=>
'0'
);
-- use different lengths to have different random sequences
SIGNAL
ready
:
STD_LOGIC
;
SIGNAL
tb_end
:
STD_LOGIC
:
=
'0'
;
SIGNAL
tb_mode
:
t_tb_diag_seq_mode_enum
:
=
s_off
;
SIGNAL
tb_mode_multi
:
t_tb_diag_seq_mode_enum
:
=
s_off
;
SIGNAL
tb_verify
:
STD_LOGIC
:
=
'0'
;
SIGNAL
mm_rst
:
STD_LOGIC
;
SIGNAL
mm_clk
:
STD_LOGIC
:
=
'0'
;
...
...
@@ -73,11 +76,12 @@ ARCHITECTURE str of tb_mms_diag_seq IS
SIGNAL
reg_rx_mosi
:
t_mem_mosi
:
=
c_mem_mosi_rst
;
SIGNAL
reg_rx_miso
:
t_mem_miso
;
SIGNAL
rd_reg
:
t_diag_seq_mm_reg
;
SIGNAL
rd_reg
_arr
:
t_diag_seq_mm_reg
_arr
(
g_nof_streams
DOWNTO
0
);
-- use +1 to support g_nof_streams=1, 2 in p_stimuli_and_verify
SIGNAL
tx_src_out_arr
:
t_dp_sosi_arr
(
g_nof_streams
-1
DOWNTO
0
);
SIGNAL
tx_src_in_arr
:
t_dp_siso_arr
(
g_nof_streams
-1
DOWNTO
0
);
SIGNAL
stream_index
:
NATURAL
;
SIGNAL
force_low_error
:
STD_LOGIC
;
SIGNAL
force_replicate_error
:
STD_LOGIC
;
...
...
@@ -107,104 +111,148 @@ BEGIN
-- Stimuli
------------------------------------------------------------------------------
p_stimuli_and_verify
:
PROCESS
-- Cannot use non static rd_reg_arr(I) variable index in procedure argument, therefor use constant index rd_reg_arr(c_st_0) or rd_reg_arr(c_st_1).
CONSTANT
c_st_0
:
NATURAL
:
=
0
;
CONSTANT
c_st_1
:
NATURAL
:
=
1
;
BEGIN
stream_index
<=
0
;
-- default verify stream 0
force_low_error
<=
'0'
;
force_replicate_error
<=
'0'
;
tb_mode
<=
s_off
;
proc_common_wait_until_low
(
mm_clk
,
mm_rst
);
proc_common_wait_some_cycles
(
mm_clk
,
10
);
proc_diag_seq_verify
(
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
);
-------------------------------------------------------------------------
-- Verify s_off
-------------------------------------------------------------------------
proc_diag_seq_verify
(
c_st_0
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg_arr
(
c_st_0
));
IF
g_nof_streams
>
1
THEN
stream_index
<=
1
;
-- try stream 1
proc_diag_seq_verify
(
c_st_1
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode_multi
,
tb_verify
,
rd_reg_arr
(
c_st_1
));
stream_index
<=
0
;
-- back to stream 0
END
IF
;
-------------------------------------------------------------------------
-- Verify Tx and Rx on and both with the same pattern
-------------------------------------------------------------------------
tb_mode
<=
s_expect_ok
;
proc_diag_seq_tx_disable
(
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_rx_disable
(
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_tx_enable
(
"CNTR"
,
17
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_rx_enable
(
"CNTR"
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_tx_disable
(
c_st_0
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
proc_diag_seq_rx_disable
(
c_st_0
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
proc_diag_seq_tx_enable
(
c_st_0
,
"CNTR"
,
17
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
proc_diag_seq_rx_enable
(
c_st_0
,
"CNTR"
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
-- Run test and read and verify Rx status
proc_common_wait_some_cycles
(
mm_clk
,
200
);
proc_diag_seq_verify
(
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
);
proc_diag_seq_verify
(
c_st_0
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
_arr
(
c_st_0
)
);
-- Check that there is valid data
IF
g_flow_control_verify
=
e_active
THEN
ASSERT
rx_snk_in_arr
(
0
)
.
valid
=
'1'
REPORT
"Wrong diag result: no valid data at rx_snk_in_arr(0)."
SEVERITY
ERROR
;
END
IF
;
-------------------------------------------------------------------------
-- Verify Tx and Rx on but with different pattern
-------------------------------------------------------------------------
tb_mode
<=
s_expect_error
;
proc_diag_seq_tx_enable
(
"PSRG"
,
17
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_tx_enable
(
c_st_0
,
"PSRG"
,
17
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
-- Run test and read and verify Rx status
proc_common_wait_some_cycles
(
mm_clk
,
200
);
proc_diag_seq_verify
(
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
);
proc_diag_seq_verify
(
c_st_0
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
_arr
(
c_st_0
)
);
-------------------------------------------------------------------------
-- Verify Rx off
-------------------------------------------------------------------------
tb_mode
<=
s_expect_no_result
;
proc_diag_seq_rx_disable
(
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_rx_disable
(
c_st_0
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
-- Run test and read and verify Rx status
proc_common_wait_some_cycles
(
mm_clk
,
200
);
proc_diag_seq_verify
(
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
);
proc_diag_seq_verify
(
c_st_0
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
_arr
(
c_st_0
)
);
IF
g_mm_broadcast_tx
=
FALSE
THEN
-------------------------------------------------------------------------
-- Verify Tx and Rx on with error in sequence low part
-------------------------------------------------------------------------
tb_mode
<=
s_expect_ok
;
proc_diag_seq_tx_disable
(
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_rx_disable
(
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_tx_enable
(
"CNTR"
,
17
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_rx_enable
(
"CNTR"
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_tx_disable
(
c_st_0
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
proc_diag_seq_rx_disable
(
c_st_0
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
proc_diag_seq_tx_enable
(
c_st_0
,
"CNTR"
,
17
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
proc_diag_seq_rx_enable
(
c_st_0
,
"CNTR"
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
-- Run test and read and verify Rx status
proc_common_wait_some_cycles
(
mm_clk
,
200
);
proc_diag_seq_verify
(
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
);
proc_diag_seq_verify
(
c_st_0
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
_arr
(
c_st_0
)
);
tb_mode
<=
s_expect_error
;
proc_common_wait_some_cycles
(
dp_clk
,
1
);
force_low_error
<=
'1'
;
proc_common_wait_some_cycles
(
dp_clk
,
1
);
proc_common_wait_some_cycles
(
dp_clk
,
c_random_w
);
-- sufficently long to affect a valid data in case g_flow_control_verify=e_random
force_low_error
<=
'0'
;
proc_common_wait_some_cycles
(
mm_clk
,
200
);
proc_diag_seq_verify
(
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
);
proc_diag_seq_verify
(
c_st_0
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg_arr
(
c_st_0
));
END
IF
;
IF
g_mm_broadcast_tx
=
FALSE
AND
g_data_w
>
g_seq_dat_w
THEN
-------------------------------------------------------------------------
-- Verify Tx and Rx on with error in sequence replicate part
-------------------------------------------------------------------------
tb_mode
<=
s_expect_ok
;
proc_diag_seq_tx_disable
(
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_rx_disable
(
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_tx_enable
(
"CNTR"
,
17
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_rx_enable
(
"CNTR"
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_tx_disable
(
c_st_0
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
proc_diag_seq_rx_disable
(
c_st_0
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
proc_diag_seq_tx_enable
(
c_st_0
,
"CNTR"
,
17
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
proc_diag_seq_rx_enable
(
c_st_0
,
"CNTR"
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
_arr
(
c_st_0
)
);
-- Run test and read and verify Rx status
proc_common_wait_some_cycles
(
mm_clk
,
200
);
proc_diag_seq_verify
(
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
);
proc_diag_seq_verify
(
c_st_0
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
_arr
(
c_st_0
)
);
tb_mode
<=
s_expect_error
;
proc_common_wait_some_cycles
(
dp_clk
,
1
);
force_replicate_error
<=
'1'
;
proc_common_wait_some_cycles
(
dp_clk
,
1
);
proc_common_wait_some_cycles
(
dp_clk
,
c_random_w
);
-- sufficently long to affect a valid data in case g_flow_control_verify=e_random
force_replicate_error
<=
'0'
;
proc_common_wait_some_cycles
(
mm_clk
,
200
);
proc_diag_seq_verify
(
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
);
proc_diag_seq_verify
(
c_st_0
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg_arr
(
c_st_0
));
END
IF
;
IF
g_mm_broadcast_tx
=
FALSE
AND
g_nof_streams
>
1
THEN
stream_index
<=
1
;
-- try stream 1
-------------------------------------------------------------------------
-- Verify Tx and Rx on and both with the same pattern for stream 1
-------------------------------------------------------------------------
proc_diag_seq_tx_disable
(
c_st_1
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg_arr
(
c_st_1
));
proc_diag_seq_rx_disable
(
c_st_1
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg_arr
(
c_st_1
));
proc_diag_seq_tx_enable
(
c_st_1
,
"CNTR"
,
17
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg_arr
(
c_st_1
));
proc_diag_seq_rx_enable
(
c_st_1
,
"CNTR"
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg_arr
(
c_st_1
));
-- Run test and read and verify Rx status
proc_common_wait_some_cycles
(
mm_clk
,
200
);
tb_mode_multi
<=
s_expect_ok
;
proc_diag_seq_verify
(
c_st_1
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode_multi
,
tb_verify
,
rd_reg_arr
(
c_st_1
));
-- Check that there is valid data
IF
g_flow_control_verify
=
e_active
THEN
ASSERT
rx_snk_in_arr
(
1
)
.
valid
=
'1'
REPORT
"Wrong diag result: no valid data at rx_snk_in_arr(1)."
SEVERITY
ERROR
;
END
IF
;
stream_index
<=
0
;
-- back to stream 0
END
IF
;
-------------------------------------------------------------------------
-- Both off
-------------------------------------------------------------------------
tb_mode
<=
s_off
;
proc_diag_seq_tx_disable
(
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg
);
proc_diag_seq_tx_disable
(
c_st_0
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg_arr
(
c_st_0
));
proc_diag_seq_rx_disable
(
c_st_0
,
mm_clk
,
dp_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
rd_reg_arr
(
c_st_0
));
proc_common_wait_some_cycles
(
mm_clk
,
100
);
proc_diag_seq_verify
(
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
);
proc_diag_seq_verify
(
c_st_0
,
mm_clk
,
reg_tx_miso
,
reg_tx_mosi
,
reg_rx_miso
,
reg_rx_mosi
,
tb_mode
,
tb_verify
,
rd_reg
_arr
(
c_st_0
)
);
proc_common_wait_some_cycles
(
mm_clk
,
10
);
tb_end
<=
'1'
;
WAIT
;
END
PROCESS
;
p_verify_mm_broadcast
:
PROCESS
(
rx_snk_in_arr
)
VARIABLE
v_snk_in
:
t_dp_sosi
;
BEGIN
...
...
@@ -265,7 +313,9 @@ BEGIN
p_connect
:
PROCESS
(
tx_src_out_arr
,
force_low_error
,
force_replicate_error
)
BEGIN
-- Default lopoback all streams
rx_snk_in_arr
<=
tx_src_out_arr
;
-- Optionally apply errors on stream 0
IF
force_low_error
=
'1'
THEN
rx_snk_in_arr
(
0
)
.
data
(
0
)
<=
NOT
tx_src_out_arr
(
0
)
.
data
(
0
);
END
IF
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment