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
095f72b1
Commit
095f72b1
authored
7 years ago
by
Pieter Donker
Browse files
Options
Downloads
Patches
Plain Diff
processed review notes Eric
parent
1dabc7a4
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
libraries/dsp/beamformer/tb/vhdl/tb_beamformer.vhd
+93
-55
93 additions, 55 deletions
libraries/dsp/beamformer/tb/vhdl/tb_beamformer.vhd
libraries/dsp/beamformer/tb/vhdl/tb_tb_beamformer.vhd
+1
-3
1 addition, 3 deletions
libraries/dsp/beamformer/tb/vhdl/tb_tb_beamformer.vhd
with
94 additions
and
58 deletions
libraries/dsp/beamformer/tb/vhdl/tb_beamformer.vhd
+
93
−
55
View file @
095f72b1
...
...
@@ -77,13 +77,16 @@ ARCHITECTURE tb OF tb_beamformer IS
SIGNAL
verify_addr_en
:
STD_LOGIC
:
=
'0'
;
SIGNAL
verify_data_en
:
STD_LOGIC
:
=
'0'
;
CONSTANT
min_snk_in_val
:
INTEGER
:
=
-
(
2
**
g_data_w
/
2
);
CONSTANT
max_snk_in_val
:
INTEGER
:
=
(
2
**
g_data_w
/
2
)
-1
;
-- MM
CONSTANT
c_unb_nr
:
NATURAL
:
=
0
;
CONSTANT
c_node_nr
:
NATURAL
:
=
0
;
-- choose node 0 is FN 0
CONSTANT
c_mm_file_ram_beamformer
:
STRING
:
=
mmf_unb_file_prefix
(
c_unb_nr
,
c_node_nr
)
&
"RAM_BEAMFORMER_"
&
int_to_str
(
g_tb_index
);
SIGNAL
s
rc
_in_enable
:
STD_LOGIC
:
=
'0'
;
SIGNAL
s
rc
_in
:
t_dp_sosi
:
=
c_dp_sosi_rst
;
SIGNAL
s
nk
_in_enable
:
STD_LOGIC
:
=
'0'
;
SIGNAL
s
nk
_in
:
t_dp_sosi
:
=
c_dp_sosi_rst
;
-----------------------------------------------------------------------------
-- beamformer
...
...
@@ -99,13 +102,13 @@ ARCHITECTURE tb OF tb_beamformer IS
SIGNAL
addr_stimulus_weight_addr
:
STD_LOGIC_VECTOR
(
ceil_log2
(
g_nof_weights
)
-1
DOWNTO
0
)
:
=
(
OTHERS
=>
'0'
);
SIGNAL
data_stimulus_weight_addr
:
STD_LOGIC_VECTOR
(
ceil_log2
(
g_nof_weights
)
-1
DOWNTO
0
)
:
=
(
OTHERS
=>
'0'
);
SIGNAL
rd_data
:
STD_LOGIC_VECTOR
(
c_word_w
-1
DOWNTO
0
);
SIGNAL
rd_data_mm_stimuli
:
STD_LOGIC_VECTOR
(
c_word_w
-1
DOWNTO
0
);
SIGNAL
rd_data_addr_stimuli
:
STD_LOGIC_VECTOR
(
c_word_w
-1
DOWNTO
0
);
-- used to set s
rc
_in re data
SIGNAL
s
rc
_re_data
:
STD_LOGIC_VECTOR
(
g_data_w
-1
DOWNTO
0
)
:
=
"00000001"
;
SIGNAL
s
rc
_im_data
:
STD_LOGIC_VECTOR
(
g_data_w
-1
DOWNTO
0
)
:
=
"00000001"
;
-- used to set s
nk
_in re data
SIGNAL
s
nk
_re_data
:
STD_LOGIC_VECTOR
(
g_data_w
-1
DOWNTO
0
)
:
=
TO_SVEC
(
1
,
g_data_w
);
SIGNAL
s
nk
_im_data
:
STD_LOGIC_VECTOR
(
g_data_w
-1
DOWNTO
0
)
:
=
TO_SVEC
(
0
,
g_data_w
);
BEGIN
-----------------------------------------------------------------------------
-- Clocks and reset
...
...
@@ -117,18 +120,18 @@ ARCHITECTURE tb OF tb_beamformer IS
mm_rst
<=
'1'
,
'0'
AFTER
c_mm_clk_period
*
7
;
----------------------------------------------------------------------------
-- Stimuli s
rc
_in
-- Stimuli s
nk
_in
----------------------------------------------------------------------------
-- sync, valid, sop, eop
proc_common_gen_duty_pulse
(
0
,
1
,
c_in_sync_interval
,
'1'
,
dp_rst
,
dp_clk
,
s
rc
_in_enable
,
s
rc
_in
.
sync
);
proc_common_gen_duty_pulse
(
0
,
c_in_block_size
,
c_in_block_interval
,
'1'
,
dp_rst
,
dp_clk
,
s
rc
_in_enable
,
s
rc
_in
.
valid
);
proc_common_gen_duty_pulse
(
0
,
1
,
c_in_block_interval
,
'1'
,
dp_rst
,
dp_clk
,
s
rc
_in_enable
,
s
rc
_in
.
sop
);
proc_common_gen_duty_pulse
(
c_in_block_size
-1
,
1
,
c_in_block_interval
,
'1'
,
dp_rst
,
dp_clk
,
s
rc
_in_enable
,
s
rc
_in
.
eop
);
-- DUT uses eop
proc_common_gen_duty_pulse
(
0
,
1
,
c_in_sync_interval
,
'1'
,
dp_rst
,
dp_clk
,
s
nk
_in_enable
,
s
nk
_in
.
sync
);
proc_common_gen_duty_pulse
(
0
,
c_in_block_size
,
c_in_block_interval
,
'1'
,
dp_rst
,
dp_clk
,
s
nk
_in_enable
,
s
nk
_in
.
valid
);
proc_common_gen_duty_pulse
(
0
,
1
,
c_in_block_interval
,
'1'
,
dp_rst
,
dp_clk
,
s
nk
_in_enable
,
s
nk
_in
.
sop
);
proc_common_gen_duty_pulse
(
c_in_block_size
-1
,
1
,
c_in_block_interval
,
'1'
,
dp_rst
,
dp_clk
,
s
nk
_in_enable
,
s
nk
_in
.
eop
);
-- DUT uses eop
-- bsn
s
rc
_in
.
bsn
<=
INCR_UVEC
(
s
rc
_in
.
bsn
,
1
)
WHEN
rising_edge
(
dp_clk
)
AND
s
rc
_in
.
eop
=
'1'
;
s
nk
_in
.
bsn
<=
INCR_UVEC
(
s
nk
_in
.
bsn
,
1
)
WHEN
rising_edge
(
dp_clk
)
AND
s
nk
_in
.
eop
=
'1'
;
-- re/im data
s
rc
_in
.
re
<=
TO_DP_DSP_DATA
(
TO_
U
INT
(
s
rc
_re_data
));
s
rc
_in
.
im
<=
TO_DP_DSP_DATA
(
TO_
U
INT
(
s
rc
_im_data
));
s
nk
_in
.
re
<=
TO_DP_DSP_DATA
(
TO_
S
INT
(
s
nk
_re_data
));
s
nk
_in
.
im
<=
TO_DP_DSP_DATA
(
TO_
S
INT
(
s
nk
_im_data
));
-- set master OK
OK
<=
mm_ok
and
addr_ok
and
data_ok
;
...
...
@@ -156,32 +159,39 @@ ARCHITECTURE tb OF tb_beamformer IS
proc_common_wait_until_low
(
dp_clk
,
dp_rst
);
proc_common_wait_some_cycles
(
dp_clk
,
10
);
-- enable s
rc
_in generator
s
rc
_in_enable
<=
'1'
;
proc_common_wait_until_hi_lo
(
dp_clk
,
s
rc
_in
.
sync
);
-- enable s
nk
_in generator
s
nk
_in_enable
<=
'1'
;
proc_common_wait_until_hi_lo
(
dp_clk
,
s
nk
_in
.
sync
);
REPORT
"Start mm stumulus"
;
FOR
I
IN
0
TO
g_nof_inputs
-1
LOOP
FOR
J
IN
0
TO
g_nof_weights
-1
LOOP
-- write MM page
mmf_mm_bus_wr
(
c_mm_file_ram_beamformer
,
I
*
g_nof_weights
+
J
,
J
,
mm_clk
);
mmf_mm_bus_wr
(
c_mm_file_ram_beamformer
,
I
*
g_nof_weights
+
J
,
(
J
+
1
)
*
2
**
16
+
J
+
1
,
mm_clk
);
END
LOOP
;
END
LOOP
;
FOR
I
IN
0
TO
g_nof_inputs
-1
LOOP
FOR
J
IN
0
TO
g_nof_weights
-1
LOOP
-- read back MM page
mmf_mm_bus_rd
(
c_mm_file_ram_beamformer
,
I
*
g_nof_weights
+
J
,
rd_data
,
mm_clk
);
IF
TO_
U
INT
(
rd_data
)
/=
J
THEN
mmf_mm_bus_rd
(
c_mm_file_ram_beamformer
,
I
*
g_nof_weights
+
J
,
rd_data
_mm_stimuli
,
mm_clk
);
IF
TO_
S
INT
(
rd_data
_mm_stimuli
(
c_word_w
/
2-1
DOWNTO
0
)
)
/=
J
+
1
THEN
ASSERT
FALSE
REPORT
"MM Wrong weight"
&
", expected="
&
int_to_str
(
J
)
&
", readback="
&
int_to_str
(
INTEGER
(
TO_UINT
(
rd_data
)))
REPORT
"MM Wrong weight for re"
&
", expected="
&
int_to_str
(
J
+
1
)
&
", readback="
&
int_to_str
(
INTEGER
(
TO_UINT
(
rd_data_mm_stimuli
(
c_word_w
/
2-1
DOWNTO
0
))))
SEVERITY
ERROR
;
mm_ok
<=
'0'
;
END
IF
;
IF
TO_SINT
(
rd_data_mm_stimuli
(
c_word_w
-1
DOWNTO
c_word_w
/
2
))
/=
J
+
1
THEN
ASSERT
FALSE
REPORT
"MM Wrong weight for im"
&
", expected="
&
int_to_str
(
J
+
1
)
&
", readback="
&
int_to_str
(
INTEGER
(
TO_UINT
(
rd_data_mm_stimuli
(
c_word_w
-1
DOWNTO
c_word_w
/
2
))))
SEVERITY
ERROR
;
mm_ok
<=
'0'
;
END
IF
;
END
LOOP
;
END
LOOP
;
verify_addr_en
<=
'1'
;
-- enable second check
...
...
@@ -190,25 +200,35 @@ ARCHITECTURE tb OF tb_beamformer IS
END
PROCESS
;
-- second check, activate weights and check effect on output
-- for this test snk_in must be (1+0j)
addr_stimulus
:
PROCESS
BEGIN
proc_common_wait_until_high
(
dp_clk
,
verify_addr_en
);
REPORT
"Start weights addr stimulus"
;
-- loop over all weights adresses
FOR
i
IN
0
TO
g_nof_weights
-1
LOOP
--REPORT "Start weights addr stimulus for weight " & int_to_str(i);
addr_stimulus_weight_addr
<=
TO_UVEC
(
i
,
ceil_log2
(
g_nof_weights
));
proc_common_wait_some_cycles
(
dp_clk
,
5
+
ceil_log2
(
g_nof_inputs
));
IF
TO_UINT
(
beamformer_weight_addr
)
*
g_nof_inputs
/=
TO_UINT
(
beamformer_src_out
.
re
)
THEN
FOR
I
IN
0
TO
g_nof_inputs
-1
LOOP
FOR
J
IN
0
TO
g_nof_weights
-1
LOOP
addr_stimulus_weight_addr
<=
TO_UVEC
(
J
,
ceil_log2
(
g_nof_weights
));
proc_common_wait_some_cycles
(
dp_clk
,
4
+
ceil_log2
(
g_nof_inputs
)
+
1
);
mmf_mm_bus_rd
(
c_mm_file_ram_beamformer
,
I
*
g_nof_weights
+
J
,
rd_data_addr_stimuli
,
mm_clk
);
IF
TO_SINT
(
rd_data_addr_stimuli
(
c_word_w
/
2-1
DOWNTO
0
))
*
g_nof_inputs
*
TO_SINT
(
snk_in
.
re
)
/=
TO_SINT
(
beamformer_src_out
.
re
)
THEN
ASSERT
FALSE
REPORT
"Beamformer wrong weights"
&
", expected="
&
int_to_str
(
TO_
U
INT
(
beamformer_weight_addr
)
*
g_nof_inputs
)
&
", readback="
&
int_to_str
(
TO_
U
INT
(
beamformer_src_out
.
re
))
REPORT
"Beamformer wrong weights
for re
"
&
", expected="
&
int_to_str
(
TO_
S
INT
(
rd_data_addr_stimuli
(
c_word_w
/
2-1
DOWNTO
0
))
*
g_nof_inputs
*
TO_SINT
(
snk_in
.
re
)
)
&
", readback="
&
int_to_str
(
TO_
S
INT
(
beamformer_src_out
.
re
))
SEVERITY
ERROR
;
addr_ok
<=
'0'
;
END
IF
;
IF
TO_SINT
(
rd_data_addr_stimuli
(
c_word_w
-1
DOWNTO
c_word_w
/
2
))
*
g_nof_inputs
*
TO_SINT
(
snk_in
.
re
)
/=
TO_SINT
(
beamformer_src_out
.
im
)
THEN
ASSERT
FALSE
REPORT
"Beamformer wrong weights for im"
&
", expected="
&
int_to_str
(
TO_SINT
(
rd_data_addr_stimuli
(
c_word_w
-1
DOWNTO
c_word_w
/
2
))
*
g_nof_inputs
*
TO_SINT
(
snk_in
.
im
))
&
", readback="
&
int_to_str
(
TO_SINT
(
beamformer_src_out
.
im
))
SEVERITY
ERROR
;
addr_ok
<=
'0'
;
END
IF
;
END
LOOP
;
END
LOOP
;
verify_data_en
<=
'1'
;
-- enable third check
WAIT
;
...
...
@@ -220,26 +240,46 @@ ARCHITECTURE tb OF tb_beamformer IS
proc_common_wait_until_high
(
dp_clk
,
verify_data_en
);
REPORT
"Start data stimulus"
;
-- loop over weight address 1..2
FOR
I
IN
1
TO
2
LOOP
-- set weights for test on addr 0 and 1 for all inputs
-- with weight (1+1j) output: re=0, im=(snk_in.re+snk_in.im)*nof_inputs
-- with weight (1+0j) output: re=snk_in.re*nof_inputs, im=snk_in.im*nof_inputs
FOR
I
IN
0
TO
g_nof_inputs
LOOP
mmf_mm_bus_wr
(
c_mm_file_ram_beamformer
,
I
*
g_nof_weights
,
1
*
2
**
16
+
1
,
mm_clk
);
-- (1+1j)
mmf_mm_bus_wr
(
c_mm_file_ram_beamformer
,
I
*
g_nof_weights
+
1
,
1
,
mm_clk
);
-- (1+0j)
END
LOOP
;
proc_common_wait_some_cycles
(
dp_clk
,
1
);
-- loop over weight address 0..1
FOR
I
IN
0
TO
1
LOOP
data_stimulus_weight_addr
<=
TO_UVEC
(
I
,
ceil_log2
(
g_nof_weights
));
proc_common_wait_some_cycles
(
dp_clk
,
2
);
-- loop over input data.re 1..127
FOR
J
IN
1
TO
127
LOOP
--REPORT "Start data stimulus with input " & int_to_str(i);
src_re_data
<=
TO_UVEC
(
J
,
g_data_w
);
proc_common_wait_some_cycles
(
dp_clk
,
4
+
ceil_log2
(
g_nof_inputs
)
+
1
);
IF
TO_UINT
(
beamformer_weight_addr
)
*
g_nof_inputs
*
J
/=
TO_UINT
(
beamformer_src_out
.
re
)
THEN
ASSERT
FALSE
REPORT
"Beamformer wrong data"
&
", expected="
&
int_to_str
(
TO_UINT
(
beamformer_weight_addr
)
*
g_nof_inputs
*
J
)
&
", readback="
&
int_to_str
(
TO_UINT
(
beamformer_src_out
.
re
))
SEVERITY
ERROR
;
data_ok
<=
'0'
;
END
IF
;
proc_common_wait_some_cycles
(
dp_clk
,
1
);
-- loop over input data
FOR
J
IN
min_snk_in_val
TO
max_snk_in_val
LOOP
snk_re_data
<=
TO_SVEC
(
J
,
g_data_w
);
snk_im_data
<=
TO_SVEC
(
J
,
g_data_w
);
proc_common_wait_some_cycles
(
dp_clk
,
4
+
ceil_log2
(
g_nof_inputs
)
+
1
);
IF
I
*
g_nof_inputs
*
J
/=
TO_SINT
(
beamformer_src_out
.
re
)
THEN
ASSERT
FALSE
REPORT
"Beamformer wrong data for re"
&
", expected="
&
int_to_str
(
TO_SINT
(
beamformer_weight_addr
)
*
g_nof_inputs
*
J
)
&
", readback="
&
int_to_str
(
TO_SINT
(
beamformer_src_out
.
re
))
SEVERITY
ERROR
;
data_ok
<=
'0'
;
END
IF
;
-- (2-I): (I=0), doubles value for weight (1+1j)
IF
g_nof_inputs
*
J
*
(
2
-
I
)
/=
TO_SINT
(
beamformer_src_out
.
im
)
THEN
ASSERT
FALSE
REPORT
"Beamformer wrong data for im"
&
", expected="
&
int_to_str
(
g_nof_inputs
*
J
*
(
2
-
I
))
&
", readback="
&
int_to_str
(
TO_SINT
(
beamformer_src_out
.
im
))
SEVERITY
ERROR
;
data_ok
<=
'0'
;
END
IF
;
END
LOOP
;
-- input data
END
LOOP
;
-- weigth address
proc_common_wait_some_cycles
(
dp_clk
,
1
);
IF
OK
=
'0'
THEN
REPORT
"TEST WENT WRONG."
;
ELSE
...
...
@@ -257,9 +297,7 @@ ARCHITECTURE tb OF tb_beamformer IS
u_mm_file_ram_beamformer
:
ENTITY
mm_lib
.
mm_file
GENERIC
MAP
(
c_mm_file_ram_beamformer
)
PORT
MAP
(
mm_rst
,
mm_clk
,
ram_beamformer_mosi
,
ram_beamformer_miso
);
-- assign input_source to snk_in_arr
gen_beamformer_snk_in_arr
:
FOR
i
IN
0
TO
g_nof_inputs
-1
GENERATE
beamformer_snk_in_arr
(
i
)
<=
src_in
;
-- Copy the block gen stream 'g_nof_inputs' times
END
GENERATE
;
beamformer_snk_in_arr
<=
(
OTHERS
=>
snk_in
);
u_beamformer
:
ENTITY
work
.
beamformer
GENERIC
MAP
(
...
...
This diff is collapsed.
Click to expand it.
libraries/dsp/beamformer/tb/vhdl/tb_tb_beamformer.vhd
+
1
−
3
View file @
095f72b1
...
...
@@ -52,8 +52,6 @@ BEGIN
-- do test for different number of inputs
sim_i1_beamformer
:
ENTITY
work
.
tb_beamformer
GENERIC
MAP
(
1
,
1
,
32
,
8
);
sim_i2_beamformer
:
ENTITY
work
.
tb_beamformer
GENERIC
MAP
(
2
,
2
,
32
,
8
);
sim_i3_beamformer
:
ENTITY
work
.
tb_beamformer
GENERIC
MAP
(
3
,
3
,
32
,
8
);
sim_i8_beamformer
:
ENTITY
work
.
tb_beamformer
GENERIC
MAP
(
4
,
8
,
32
,
8
);
sim_i32_beamformer
:
ENTITY
work
.
tb_beamformer
GENERIC
MAP
(
5
,
32
,
32
,
8
);
sim_i32_beamformer
:
ENTITY
work
.
tb_beamformer
GENERIC
MAP
(
3
,
32
,
32
,
8
);
END
tb
;
\ No newline at end of file
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