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
ae0b9b89
Commit
ae0b9b89
authored
2 years ago
by
Reinier van der Walle
Browse files
Options
Downloads
Patches
Plain Diff
processed review comments
parent
478ef67f
No related branches found
No related tags found
2 merge requests
!319
Resolve HPR-87
,
!315
Resolve HPR-87
Pipeline
#46136
passed
2 years ago
Stage: simulation
Stage: synthesis
Changes
1
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
libraries/base/axi4/tb/vhdl/tb_axi4_lite_ram.vhd
+108
-115
108 additions, 115 deletions
libraries/base/axi4/tb/vhdl/tb_axi4_lite_ram.vhd
with
108 additions
and
115 deletions
libraries/base/axi4/tb/vhdl/tb_axi4_lite_ram.vhd
+
108
−
115
View file @
ae0b9b89
...
@@ -36,26 +36,25 @@ USE common_lib.common_pkg.ALL;
...
@@ -36,26 +36,25 @@ USE common_lib.common_pkg.ALL;
USE
common_lib
.
common_mem_pkg
.
ALL
;
USE
common_lib
.
common_mem_pkg
.
ALL
;
USE
work
.
axi4_lite_pkg
.
ALL
;
USE
work
.
axi4_lite_pkg
.
ALL
;
ENTITY
tb_axi4_lite_ram
IS
ENTITY
tb_axi4_lite_ram
IS
END
tb_axi4_lite_ram
;
END
tb_axi4_lite_ram
;
ARCHITECTURE
tb
OF
tb_axi4_lite_ram
IS
ARCHITECTURE
tb
OF
tb_axi4_lite_ram
IS
CONSTANT
mm_clk_period
:
TIME
:
=
40
ns
;
CONSTANT
c_
mm_clk_period
:
TIME
:
=
40
ns
;
CONSTANT
usr_clk_period
:
TIME
:
=
10
ns
;
CONSTANT
c_
usr_clk_period
:
TIME
:
=
10
ns
;
CONSTANT
c_reset_len
:
NATURAL
:
=
16
;
CONSTANT
c_reset_len
:
NATURAL
:
=
16
;
CONSTANT
dat_w
:
INTEGER
:
=
32
;
CONSTANT
c_
dat_w
:
INTEGER
:
=
32
;
CONSTANT
adr_w
:
INTEGER
:
=
8
;
CONSTANT
c_
adr_w
:
INTEGER
:
=
8
;
CONSTANT
c_mm_usr_ram
:
t_c_mem
:
=
(
latency
=>
1
,
CONSTANT
c_mm_usr_ram
:
t_c_mem
:
=
(
latency
=>
1
,
adr_w
=>
5
,
c_
adr_w
=>
5
,
dat_w
=>
8
,
c_
dat_w
=>
8
,
nof_dat
=>
32
,
nof_dat
=>
32
,
init_sl
=>
'0'
);
init_sl
=>
'0'
);
CONSTANT
ram_addr_base
:
NATURAL
:
=
to_integer
(
shift_right
(
to_unsigned
(
0
,
32
),
ceil_log2
(
c_mm_usr_ram
.
nof_dat
)))
;
CONSTANT
c_
ram_addr_base
:
NATURAL
:
=
to_integer
(
shift_right
(
to_unsigned
(
0
,
32
),
ceil_log2
(
c_mm_usr_ram
.
nof_dat
)))
;
SIGNAL
mm_rst
:
STD_LOGIC
;
SIGNAL
mm_rst
:
STD_LOGIC
;
SIGNAL
mm_clk
:
STD_LOGIC
:
=
'0'
;
SIGNAL
mm_clk
:
STD_LOGIC
:
=
'0'
;
...
@@ -64,38 +63,35 @@ ARCHITECTURE tb OF tb_axi4_lite_ram IS
...
@@ -64,38 +63,35 @@ ARCHITECTURE tb OF tb_axi4_lite_ram IS
SIGNAL
sim_finished
:
STD_LOGIC
:
=
'0'
;
SIGNAL
sim_finished
:
STD_LOGIC
:
=
'0'
;
SIGNAL
tb_end
:
STD_LOGIC
:
=
'0'
;
SIGNAL
tb_end
:
STD_LOGIC
:
=
'0'
;
SIGNAL
rd_dat
:
STD_LOGIC_VECTOR
(
c_dat_w
-1
DOWNTO
0
);
SIGNAL
rd_dat
:
STD_LOGIC_VECTOR
(
dat_w
-1
DOWNTO
0
);
SIGNAL
wr_dat
:
STD_LOGIC_VECTOR
(
c_dat_w
-1
DOWNTO
0
);
SIGNAL
wr_dat
:
STD_LOGIC_VECTOR
(
dat_w
-1
DOWNTO
0
);
SIGNAL
wr_val
:
STD_LOGIC
;
SIGNAL
wr_val
:
STD_LOGIC
;
SIGNAL
rd_val
:
STD_LOGIC
;
SIGNAL
rd_val
:
STD_LOGIC
;
SIGNAL
reg_wren
:
STD_LOGIC
;
SIGNAL
reg_wren
:
STD_LOGIC
;
SIGNAL
reg_rden
:
STD_LOGIC
;
SIGNAL
reg_rden
:
STD_LOGIC
;
SIGNAL
wr_adr
:
STD_LOGIC_VECTOR
(
adr_w
-1
DOWNTO
0
);
SIGNAL
wr_adr
:
STD_LOGIC_VECTOR
(
c_
adr_w
-1
DOWNTO
0
);
SIGNAL
rd_adr
:
STD_LOGIC_VECTOR
(
adr_w
-1
DOWNTO
0
);
SIGNAL
rd_adr
:
STD_LOGIC_VECTOR
(
c_
adr_w
-1
DOWNTO
0
);
SIGNAL
ram_wr_en
:
STD_LOGIC
;
SIGNAL
ram_wr_en
:
STD_LOGIC
;
SIGNAL
ram_rd_en
:
STD_LOGIC
;
SIGNAL
ram_rd_en
:
STD_LOGIC
;
SIGNAL
ram_adr
:
STD_LOGIC_VECTOR
(
c_mm_usr_ram
.
adr_w
-1
DOWNTO
0
);
SIGNAL
ram_adr
:
STD_LOGIC_VECTOR
(
c_mm_usr_ram
.
c_
adr_w
-1
DOWNTO
0
);
SIGNAL
ram_rd_dat
:
STD_LOGIC_VECTOR
(
c_mm_usr_ram
.
dat_w
-1
DOWNTO
0
);
SIGNAL
ram_rd_dat
:
STD_LOGIC_VECTOR
(
c_mm_usr_ram
.
c_
dat_w
-1
DOWNTO
0
);
SIGNAL
axi_copi
:
t_axi4_lite_copi
;
SIGNAL
axi_copi
:
t_axi4_lite_copi
;
SIGNAL
axi_cipo
:
t_axi4_lite_cipo
;
SIGNAL
axi_cipo
:
t_axi4_lite_cipo
;
BEGIN
BEGIN
mm_clk
<=
NOT
mm_clk
OR
sim_finished
AFTER
c_mm_clk_period
/
2
;
mm_rst
<=
'1'
,
'0'
AFTER
c_mm_clk_period
*
c_reset_len
;
usr_clk
<=
NOT
usr_clk
OR
sim_finished
AFTER
c_usr_clk_period
/
2
;
mm_clk
<=
NOT
mm_clk
OR
sim_finished
AFTER
mm_clk_period
/
2
;
usr_rst
<=
'1'
,
'0'
AFTER
c_usr_clk_period
*
c_reset_len
;
mm_rst
<=
'1'
,
'0'
AFTER
mm_clk_period
*
c_reset_len
;
usr_clk
<=
NOT
usr_clk
OR
sim_finished
AFTER
usr_clk_period
/
2
;
usr_rst
<=
'1'
,
'0'
AFTER
usr_clk_period
*
c_reset_len
;
u_mem_to_axi4_lite
:
ENTITY
work
.
mem_to_axi4_lite
u_mem_to_axi4_lite
:
ENTITY
work
.
mem_to_axi4_lite
GENERIC
MAP
(
GENERIC
MAP
(
g_adr_w
=>
adr_w
,
g
_c
_adr_w
=>
c_
adr_w
,
g_dat_w
=>
dat_w
)
g
_c
_dat_w
=>
c_
dat_w
)
PORT
MAP
(
PORT
MAP
(
rst
=>
mm_rst
,
rst
=>
mm_rst
,
clk
=>
mm_clk
,
clk
=>
mm_clk
,
...
@@ -110,14 +106,13 @@ BEGIN
...
@@ -110,14 +106,13 @@ BEGIN
rd_adr
=>
rd_adr
,
rd_adr
=>
rd_adr
,
rd_dat
=>
rd_dat
,
rd_dat
=>
rd_dat
,
rd_busy
=>
'0'
,
rd_busy
=>
'0'
,
rd_val
=>
rd_val
);
rd_val
=>
rd_val
);
ram_wr_en
<=
reg_wren
AND
is_true
(
ram_addr_base
=
unsigned
(
wr_adr
(
wr_adr
'
length
-1
downto
c_mm_usr_ram
.
adr_w
)));
ram_wr_en
<=
reg_wren
AND
is_true
(
c_
ram_addr_base
=
UNSIGNED
(
wr_adr
(
wr_adr
'
LENGTH
-1
DOWNTO
c_mm_usr_ram
.
c_
adr_w
)));
ram_rd_en
<=
reg_rden
AND
is_true
(
ram_addr_base
=
unsigned
(
rd_adr
(
rd_adr
'
length
-1
downto
c_mm_usr_ram
.
adr_w
)));
ram_rd_en
<=
reg_rden
AND
is_true
(
c_
ram_addr_base
=
UNSIGNED
(
rd_adr
(
rd_adr
'
LENGTH
-1
DOWNTO
c_mm_usr_ram
.
c_
adr_w
)));
ram_adr
<=
wr_adr
(
c_mm_usr_ram
.
adr_w
-1
downto
0
)
WHEN
ram_wr_en
=
'1'
ELSE
ram_adr
<=
wr_adr
(
c_mm_usr_ram
.
c_adr_w
-1
DOWNTO
0
)
WHEN
ram_wr_en
=
'1'
ELSE
rd_adr
(
c_mm_usr_ram
.
c_adr_w
-1
DOWNTO
0
);
rd_adr
(
c_mm_usr_ram
.
adr_w
-1
downto
0
);
u_ram
:
ENTITY
common_lib
.
common_ram_crw_crw
u_ram
:
ENTITY
common_lib
.
common_ram_crw_crw
GENERIC
MAP
(
GENERIC
MAP
(
...
@@ -131,7 +126,7 @@ BEGIN
...
@@ -131,7 +126,7 @@ BEGIN
clken_a
=>
'1'
,
clken_a
=>
'1'
,
clken_b
=>
'1'
,
clken_b
=>
'1'
,
wr_en_a
=>
ram_wr_en
,
wr_en_a
=>
ram_wr_en
,
wr_dat_a
=>
wr_dat
(
c_mm_usr_ram
.
dat_w
-1
downto
0
),
wr_dat_a
=>
wr_dat
(
c_mm_usr_ram
.
c_
dat_w
-1
DOWNTO
0
),
adr_a
=>
ram_adr
,
adr_a
=>
ram_adr
,
rd_en_a
=>
ram_rd_en
,
rd_en_a
=>
ram_rd_en
,
rd_dat_a
=>
ram_rd_dat
,
rd_dat_a
=>
ram_rd_dat
,
...
@@ -147,45 +142,43 @@ BEGIN
...
@@ -147,45 +142,43 @@ BEGIN
u_ram_wr_val
:
ENTITY
common_lib
.
common_pipeline
u_ram_wr_val
:
ENTITY
common_lib
.
common_pipeline
GENERIC
MAP
(
GENERIC
MAP
(
g_pipeline
=>
c_mm_usr_ram
.
latency
,
g_pipeline
=>
c_mm_usr_ram
.
latency
,
g_in_dat_w
=>
1
,
g_in_c_dat_w
=>
1
,
g_out_dat_w
=>
1
)
g_out_c_dat_w
=>
1
)
PORT
MAP
(
PORT
MAP
(
clk
=>
mm_clk
,
clk
=>
mm_clk
,
clken
=>
'1'
,
clken
=>
'1'
,
in_dat
(
0
)
=>
ram_wr_en
,
in_dat
(
0
)
=>
ram_wr_en
,
out_dat
(
0
)
=>
wr_val
);
out_dat
(
0
)
=>
wr_val
);
rd_dat
<=
"000000000000000000000000"
&
ram_rd_dat
WHEN
rd_val
=
'1'
ELSE
(
OTHERS
=>
'0'
);
rd_dat
<=
RESIZE_UVEC
(
ram_rd_dat
,
c_dat_w
)
WHEN
rd_val
=
'1'
ELSE
(
OTHERS
=>
'0'
);
--
-- Testbench writes a number of words to memory and then reads them back trough the AXI interface.
-- It uses the axi_lite_transaction to write, read and verify the data.
tb
:
PROCESS
tb
:
PROCESS
VARIABLE
data_in
:
t_slv_32_arr
(
0
TO
10
);
variable
data_in
:
t_slv_32_arr
(
0
TO
10
);
BEGIN
BEGIN
axi_lite_init
(
mm_rst
,
mm_clk
,
axi_cipo
,
axi_copi
);
axi_lite_init
(
mm_rst
,
mm_clk
,
axi_cipo
,
axi_copi
);
-- Read and write a number of words to memory
-- Read and write a number of words to memory
for
i
in
0
to
10
loop
FOR
i
IN
0
TO
10
LOOP
data_in
(
i
)
:
=
std_logic_vector
(
to_unsigned
(
57
+
i
,
32
));
data_in
(
i
)
:
=
std_logic_vector
(
to_unsigned
(
57
+
i
,
32
));
end
loop
;
END
LOOP
;
axi_lite_transaction
(
mm_clk
,
axi_cipo
,
axi_copi
,
0
,
true
,
data_in
,
mask
=>
c_mask_zeros
);
axi_lite_transaction
(
mm_clk
,
axi_cipo
,
axi_copi
,
0
,
true
,
data_in
,
mask
=>
c_mask_zeros
);
for
i
in
0
to
10
loop
FOR
i
IN
0
TO
10
LOOP
data_in
(
i
)
:
=
std_logic_vector
(
to_unsigned
(
57
+
i
,
32
));
data_in
(
i
)
:
=
std_logic_vector
(
to_unsigned
(
57
+
i
,
32
));
end
loop
;
END
LOOP
;
axi_lite_transaction
(
mm_clk
,
axi_cipo
,
axi_copi
,
0
,
false
,
data_in
,
validate
=>
true
);
axi_lite_transaction
(
mm_clk
,
axi_cipo
,
axi_copi
,
0
,
false
,
data_in
,
validate
=>
true
);
sim_finished
<=
'1'
;
sim_finished
<=
'1'
;
tb_end
<=
'1'
;
tb_end
<=
'1'
;
wait
for
1
us
;
WAIT
FOR
1
us
;
REPORT
"Finished Simulation"
SEVERITY
FAILURE
;
REPORT
"Finished Simulation"
SEVERITY
FAILURE
;
WAIT
;
WAIT
;
END
PROCESS
tb
;
END
PROCESS
tb
;
END
tb
;
END
tb
;
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