From 64fa9dc190b8ad6e3f72c731dba93f8896e8e361 Mon Sep 17 00:00:00 2001 From: Eric Kooistra <kooistra@astron.nl> Date: Wed, 16 Apr 2025 13:43:06 +0200 Subject: [PATCH] Avoid using same address for wr_adr_b as for wr_adr_a. --- .../base/common/src/vhdl/common_paged_ram_w_rr.vhd | 14 ++++++++++++++ .../tb/vhdl/tb_tb_common_paged_ram_ww_rr.vhd | 5 ++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/libraries/base/common/src/vhdl/common_paged_ram_w_rr.vhd b/libraries/base/common/src/vhdl/common_paged_ram_w_rr.vhd index 4c25313123..55958505fe 100644 --- a/libraries/base/common/src/vhdl/common_paged_ram_w_rr.vhd +++ b/libraries/base/common/src/vhdl/common_paged_ram_w_rr.vhd @@ -19,6 +19,7 @@ -- ------------------------------------------------------------------------------- +-- Author: E. Kooistra -- Purpose: Dual page memory with single wr in one page and dual rd in other page -- Description: -- When next_page pulses then the next access will occur in the other page. @@ -63,7 +64,19 @@ entity common_paged_ram_w_rr is end common_paged_ram_w_rr; architecture str of common_paged_ram_w_rr is + signal wr_adr_b : std_logic_vector(wr_adr'range); begin + -- Make used wr_adr_b for page b always differ from wr_adr for port a, to avoid read and write at same address, + -- which would yield undefined data result in simulation (and maybe also on HW even though wr_en_b = '0') when + -- block RAM mixed_port_feed_through_mode = DONT_CARE. + p_wr_adr_b : process(wr_adr) + begin + wr_adr_b <= (others => '0'); + if to_uint(wr_adr) = 0 then + wr_adr_b(0) <= '1'; + end if; + end process; + u_ww_rr : entity work.common_paged_ram_ww_rr generic map ( g_technology => g_technology, @@ -83,6 +96,7 @@ begin wr_adr_a => wr_adr, wr_en_a => wr_en, wr_dat_a => wr_dat, + wr_adr_b => wr_adr_b, -- double read access from the other one page rd_adr_a => rd_adr_a, rd_en_a => rd_en_a, diff --git a/libraries/base/common/tb/vhdl/tb_tb_common_paged_ram_ww_rr.vhd b/libraries/base/common/tb/vhdl/tb_tb_common_paged_ram_ww_rr.vhd index 4a6aa138ca..ec7add9704 100644 --- a/libraries/base/common/tb/vhdl/tb_tb_common_paged_ram_ww_rr.vhd +++ b/libraries/base/common/tb/vhdl/tb_tb_common_paged_ram_ww_rr.vhd @@ -38,7 +38,10 @@ begin -- g_pipeline_out : NATURAL := 0; -- >= 0 -- g_page_sz : NATURAL := 10 -- >= 1 - u_1 : entity work.tb_common_paged_ram_ww_rr generic map (0, 0, 1); + -- Cannot support g_page_sz = 1, when block RAM mixed_port_feed_through_mode = DONT_CARE, because with only one + -- word the adr_a cannot be different from adr_b. Using g_page_sz = 1 is an extreme corner case, because the + -- RAM only has one word, so acts as a register. + --u_1 : entity work.tb_common_paged_ram_ww_rr generic map (0, 0, 1); u_2 : entity work.tb_common_paged_ram_ww_rr generic map (0, 0, 2); u_8 : entity work.tb_common_paged_ram_ww_rr generic map (0, 0, 8); -- GitLab