インテルのみ表示可能 — GUID: mwh1409959588216
Ixiasoft
インテルのみ表示可能 — GUID: mwh1409959588216
Ixiasoft
1.4.1.9. 混合幅デュアルポートRAM
Verilog-1995は混合幅のRAMをサポートしません。この規格には異なる読み出し幅、書き込み幅、またはその両方をモデル化する多次元配列がありません。Verilog-2001は混合幅のRAMをサポートしません。このタイプのロジックにはパッキングされた次元が複数必要です。合成ツールによっては、これらのメモリーのサポートが異なる場合があります。このセクションでは、 インテル® Quartus® Prime プロ・エディションの合成における推論規則について説明します。
多次元パッキング配列の最初の次元は、幅の広いポートと幅の狭いポートの比率を表します。2番目の次元は、幅の狭いポートのポート幅を表します。読み出しおよび書き込みポートの幅では、ターゲットデバイスのメモリーブロックでサポートされる読み出しまたは書き込みの比率を指定する必要があります。これを行わないと、合成ツールはRAMを推論しません。
インテル® Quartus® PrimeのHDLテンプレートを参照し、サポートされる読み出し幅と書き込み幅の組み合わせでパラメーター化されている例を確認してください。また、混合幅の2つの読み出しポートと混合幅の2つの書き込みポートを備えるトゥルー・デュアルポートRAMの例も提供されています。
SystemVerilog混合幅RAM (読み出し幅が書き込み幅より小さい)
module mixed_width_ram // 256x32 write and 1024x8 read ( input [7:0] waddr, input [31:0] wdata, input we, clk, input [9:0] raddr, output logic [7:0] q ); logic [3:0][7:0] ram[0:255]; always_ff@(posedge clk) begin if(we) ram[waddr] <= wdata; q <= ram[raddr / 4][raddr % 4]; end endmodule : mixed_width_ram
SystemVerilog混合幅RAM (読み出し幅が書き込み幅より大きい)
module mixed_width_ram // 1024x8 write and 256x32 read ( input [9:0] waddr, input [31:0] wdata, input we, clk, input [7:0] raddr, output logic [9:0] q ); logic [3:0][7:0] ram[0:255]; always_ff@(posedge clk) begin if(we) ram[waddr / 4][waddr % 4] <= wdata; q <= ram[raddr]; end endmodule : mixed_width_ram
VHDL混合幅RAM (読み出し幅が書き込み幅より小さい)
library ieee; use ieee.std_logic_1164.all; package ram_types is type word_t is array (0 to 3) of std_logic_vector(7 downto 0); type ram_t is array (0 to 255) of word_t; end ram_types; library ieee; use ieee.std_logic_1164.all; library work; use work.ram_types.all; entity mixed_width_ram is port ( we, clk : in std_logic; waddr : in integer range 0 to 255; wdata : in word_t; raddr : in integer range 0 to 1023; q : out std_logic_vector(7 downto 0)); end mixed_width_ram; architecture rtl of mixed_width_ram is signal ram : ram_t; begin -- rtl process(clk, we) begin if(rising_edge(clk)) then if(we = '1') then ram(waddr) <= wdata; end if; q <= ram(raddr / 4 )(raddr mod 4); end if; end process; end rtl;
VHDL混合幅RAM (読み出し幅が書き込み幅より大きい)
library ieee; use ieee.std_logic_1164.all; package ram_types is type word_t is array (0 to 3) of std_logic_vector(7 downto 0); type ram_t is array (0 to 255) of word_t; end ram_types; library ieee; use ieee.std_logic_1164.all; library work; use work.ram_types.all; entity mixed_width_ram is port ( we, clk : in std_logic; waddr : in integer range 0 to 1023; wdata : in std_logic_vector(7 downto 0); raddr : in integer range 0 to 255; q : out word_t); end mixed_width_ram; architecture rtl of mixed_width_ram is signal ram : ram_t; begin -- rtl process(clk, we) begin if(rising_edge(clk)) then if(we = '1') then ram(waddr / 4)(waddr mod 4) <= wdata; end if; q <= ram(raddr); end if; end process; end rtl;