diff --git a/libraries/base/common/src/vhdl/common_mem_pkg.vhd b/libraries/base/common/src/vhdl/common_mem_pkg.vhd index 902bad7ccbbc5f746dc9f6b76200f1c89d6dca07..70490338cbf26aed3fa288c719bd18b82d671af5 100644 --- a/libraries/base/common/src/vhdl/common_mem_pkg.vhd +++ b/libraries/base/common/src/vhdl/common_mem_pkg.vhd @@ -80,6 +80,10 @@ PACKAGE common_mem_pkg IS TYPE t_mem_miso_arr IS ARRAY (INTEGER RANGE <>) OF t_mem_miso; TYPE t_mem_mosi_arr IS ARRAY (INTEGER RANGE <>) OF t_mem_mosi; + -- Reset only the control fields of the MM record + FUNCTION RESET_MEM_MOSI_CTRL(mosi : t_mem_mosi) RETURN t_mem_mosi; + FUNCTION RESET_MEM_MISO_CTRL(miso : t_mem_miso) RETURN t_mem_miso; + -- Resize functions to fit an integer or an SLV in the corresponding t_mem_miso or t_mem_mosi field width FUNCTION TO_MEM_ADDRESS(n : INTEGER) RETURN STD_LOGIC_VECTOR; -- unsigned, use integer to support 32 bit range FUNCTION TO_MEM_DATA( n : INTEGER) RETURN STD_LOGIC_VECTOR; -- unsigned, alias of TO_MEM_DATA() @@ -169,6 +173,23 @@ END common_mem_pkg; PACKAGE BODY common_mem_pkg IS + -- Reset only the control fields of the MM record + FUNCTION RESET_MEM_MOSI_CTRL(mosi : t_mem_mosi) RETURN t_mem_mosi IS + VARIABLE v_mosi : t_mem_mosi := mosi; + BEGIN + v_mosi.rd := '0'; + v_mosi.wr := '0'; + RETURN v_mosi; + END RESET_MEM_MOSI_CTRL; + + FUNCTION RESET_MEM_MISO_CTRL(miso : t_mem_miso) RETURN t_mem_miso IS + VARIABLE v_miso : t_mem_miso := miso; + BEGIN + v_miso.rdval := '0'; + v_miso.waitrequest := '0'; + RETURN v_miso; + END RESET_MEM_MISO_CTRL; + -- Resize functions to fit an integer or an SLV in the corresponding t_mem_miso or t_mem_mosi field width FUNCTION TO_MEM_ADDRESS(n : INTEGER) RETURN STD_LOGIC_VECTOR IS BEGIN diff --git a/libraries/base/mm/src/vhdl/mm_pipeline.vhd b/libraries/base/mm/src/vhdl/mm_pipeline.vhd index 179a3d51adfa85d3b5ed77c5bb1a449a2c50ff24..8a518b18a5e23b97806a778c5471407f0fc10feb 100644 --- a/libraries/base/mm/src/vhdl/mm_pipeline.vhd +++ b/libraries/base/mm/src/vhdl/mm_pipeline.vhd @@ -127,10 +127,11 @@ BEGIN END GENERATE; gen_pipeline : IF g_pipeline = TRUE GENERATE + --p_reg : PROCESS(mm_rst, mosi_reg, mm_clk) -- todo: check with synthesis that it is not necessary to have mosi_reg here p_reg : PROCESS(mm_rst, mm_clk) BEGIN IF mm_rst = '1' THEN - mosi_reg <= c_mem_mosi_rst; + mosi_reg <= RESET_MEM_MOSI_CTRL(mosi_reg); -- todo: check with synthesis that mosi_reg data fields remain wires ELSIF rising_edge(mm_clk) THEN mosi_reg <= nxt_mosi_reg; END IF;