仅对英特尔可见 — GUID: mwh1409959589276
Ixiasoft
1.4.1.1. 使用同步的存储器模块
1.4.1.2. 避免不受支持的复位和控制条件
1.4.1.3. 检查Read-During-Write行为
1.4.1.4. 控制RAM推断和实现
1.4.1.5. 具有旧数据Read-During-Write行为的单时钟同步RAM
1.4.1.6. 具有新数据Read-During-Write行为的单时钟同步RAM
1.4.1.7. 简单双端口,双时钟同步RAM
1.4.1.8. 真双端口同步RAM
1.4.1.9. 混合宽度双端口RAM
1.4.1.10. 带Byte-Enable信号的RAM
带字节使能的SystemVerilog简单双端口同步RAM
带字节使能的VHDL简单双端口同步RAM
1.4.1.11. 上电时指定初始存储器内容
仅对英特尔可见 — GUID: mwh1409959589276
Ixiasoft
1.4.1.10. 带Byte-Enable信号的RAM
本节中的RAM代码示例显示SystemVerilog和VHDL代码,这些代码通过将单个字节写入存储字或字节使能信号的控件来推断RAM。
综合通过创建包含两个索引的写表达式并写入RAM “word”的一部分来对字节使能信号进行建模。通过这些实现,您还可以通过使能相应的字节使能(byte enable)一次写入多个字节。
Verilog-1995不支持混合宽度RAM,因为此标准缺少用于对不同的读取宽度和/或写入宽度进行建模的多维数组。Verilog-2001不支持混合宽度RAM,因为这种类型的逻辑需要多个封装尺寸。不同的综合工具对这些存储器的支持可能有所不同。本节描述 Intel® Quartus® Prime Pro Edition综合的推断规则。
请参考 Intel® Quartus® Prime HDL模板来了解用于不同地址宽度的参数化示例,以及带有两个读端口和两个写端口的真双端口RAM示例。
带字节使能的SystemVerilog简单双端口同步RAM
module byte_enabled_simple_dual_port_ram
(
input we, clk,
input [ADDRESS_WIDTH-1:0] waddr, raddr,// address width = 6
input [NUM_BYTES-1:0] be, // 4 bytes per word
input [(BYTE_WIDTH * NUM_BYTES -1):0] wdata, // byte width = 8, 4 bytes per word
output reg [(BYTE_WIDTH * NUM_BYTES -1):0] q // byte width = 8, 4 bytes per word
);
parameter ADDRESS_WIDTH = 6;
parameter DEPTH = 2**ADDRESS_WIDTH;
parameter BYTE_WIDTH = 8;
parameter NUM_BYTES = 4;
// use a multi-dimensional packed array
//to model individual bytes within the word
logic [NUM_BYTES-1:0][BYTE_WIDTH-1:0] ram[0:DEPTH-1];
// # words = 1 << address width
// port A
always@(posedge clk)
begin
if(we) begin
for (int i = 0; i < NUM_BYTES; i = i + 1) begin
if(be[i]) ram[waddr][i] <= wdata[i*BYTE_WIDTH +: BYTE_WIDTH];
end
end
q <= ram[raddr];
end
endmodule
带字节使能的VHDL简单双端口同步RAM
library ieee;
use ieee.std_logic_1164.all;
library work;
entity byte_enabled_simple_dual_port_ram is
generic (DEPTH : integer := 64;
NUM_BYTES : integer := 4;
BYTE_WIDTH : integer := 8
);
port (
we, clk : in std_logic;
waddr, raddr : in integer range 0 to DEPTH -1 ; -- address width = 6
be : in std_logic_vector (NUM_BYTES-1 downto 0); -- 4 bytes per word
wdata: in std_logic_vector((NUM_BYTES * BYTE_WIDTH -1) downto 0); -- width = 32
q : out std_logic_vector((NUM_BYTES * BYTE_WIDTH -1) downto 0) ); -- width = 32
end byte_enabled_simple_dual_port_ram;
architecture rtl of byte_enabled_simple_dual_port_ram is
-- build up 2D array to hold the memory
type word_t is array (0 to NUM_BYTES-1) of std_logic_vector(BYTE_WIDTH-1 downto 0);
type ram_t is array (0 to DEPTH-1) of word_t;
signal ram : ram_t;
signal q_local : word_t;
begin -- Re-organize the read data from the RAM to match the output
unpack: for i in 0 to NUM_BYTES-1 generate
q(BYTE_WIDTH*(i+1) - 1 downto BYTE_WIDTH*i) <= q_local(i);
end generate unpack;
-- port A
process(clk)
begin
if(rising_edge(clk)) then
if(we = '1') then
for I in (NUM_BYTES-1) downto 0 loop
if(be(I) = '1') then
ram(waddr)(I) <= wdata(((I+1)*BYTE_WIDTH-1) downto I*BYTE_WIDTH);
end if;
end loop;
end if;
q_local <= ram(raddr);
end if;
end process;
end rtl;