AR# 2270

5.1i XST - ブロック RAM を推論すると「WARNING:Xst:646 - Signal <address_a> is assigned but never used」という警告メッセージが表示される

説明

キーワード : distributed, infer, Virtex, XST, 分散, ブロック, 推論

ブロック RAM を推論するコードを記述しています。コード内に未使用のアドレス行が含まれているために、次の警告メッセージが表示されます。

"WARNING:Xst:646 - Signal <address_a> is assigned but never used.
WARNING:Xst:647 - Input <address_b> is never used."

また、ブロック RAM の代わりに分散 RAM が推論されてしまいます。 次に、余分なアドレス行を含む例を示します。

Verilog の場合 :

module ram1(clk,en,we,addr,di,do);

parameter ADDRESSWIDTH = 5;
parameter DATAWIDTH = 10;
parameter RAMDEPTH = 10;

input clk,en,we;
input [ADDRESSWIDTH-1:0] addr;
input [DATAWIDTH-1:0] di;
output [DATAWIDTH-1:0] do;

reg [DATAWIDTH-1:0] ram [RAMDEPTH-1:0];

reg [ADDRESSWIDTH-1:0] read_addr;

always @(posedge clk)
begin
if (en == 1'b1)
begin
if (we == 1'b1)
ram[addr] <= di;
read_addr <= addr;
end
end
assign do = ram[read_addr];

endmodule

VHDL の場合 :

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity ram1 is
generic (addresswidth : integer := 5;
datawidth : integer :=10;
ramdepth : integer :=10);
port (di : in std_logic_vector (datawidth - 1 downto 0);
addr : in std_logic_vector (addresswidth - 1 downto 0);
clk : in std_logic;
en : in std_logic;
we : in std_logic;
do : out std_logic_vector(datawidth - 1 downto 0));
end entity;

architecture ram1_arch of ram1 is

type ram_type is array (datawidth - 1 downto 0) of std_logic_vector (ramdepth - 1 downto 0);
signal ram : ram_type;
signal read_addr : std_logic_vector(addresswidth - 1 downto 0);

begin

process (clk)
begin
if clk'event and clk = '1' then
if en = '1' then
if we = '1' then
ram(conv_integer(addr)) <= di;
end if;
read_addr <= addr;
end if;
end if;
end process;

do <= ram(conv_integer(read_addr));

end architecture;

ソリューション

1

これらの警告メッセージを回避するには、HDL コードで使用されるアドレスのみが正しく記述されるように不要なアドレス行を削除します。

Verilog の場合 :

module ram1(clk,en,we,addr,di,do);

parameter ADDRESSWIDTH = 4; //ここでアドレス幅が 5 から 4 に変更されている
parameter DATAWIDTH = 10;
parameter RAMDEPTH = 10;

input clk,en,we;
input [ADDRESSWIDTH-1:0] addr;
input [DATAWIDTH-1:0] di;
output [DATAWIDTH-1:0] do;

reg [DATAWIDTH-1:0] ram [RAMDEPTH-1:0];

reg [ADDRESSWIDTH-1:0] read_addr;

always @(posedge clk)
begin
if (en == 1'b1)
begin
if (we == 1'b1)
ram[addr] <= di;
read_addr <= addr;
end
end
assign do = ram[read_addr];

endmodule
この問題は、ISE 5.2i サービス パック で修正されています。

2

これらの警告メッセージを回避するには、使用されるアドレスの
みが正しく記述されるように不要なアドレス行を削除します。

VHDL の場合 :

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity ram1 is
generic (addresswidth : integer := 4; -- ここでアドレス幅が 5 から 4 に変更されている
datawidth : integer :=10;
ramdepth : integer :=10);
port (di : in std_logic_vector (datawidth - 1 downto 0);
addr : in std_logic_vector (addresswidth - 1 downto 0);
clk : in std_logic;
en : in std_logic;
we : in std_logic;
do : out std_logic_vector(datawidth - 1 downto 0));
end entity;

architecture ram1_arch of ram1 is

type ram_type is array (datawidth - 1 downto 0) of std_logic_vector (ramdepth - 1 downto 0);
signal ram : ram_type;
signal read_addr : std_logic_vector(addresswidth - 1 downto 0);

begin

process (clk)
begin
if clk'event and clk = '1' then
if en = '1' then
if we = '1' then
ram(conv_integer(addr)) <= di;
end if;
read_addr <= addr;
end if;
end if;
end process;

do <= ram(conv_integer(read_addr));

end architecture;
AR# 2270
日付 12/15/2012
ステータス アクティブ
種類 一般