UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 13979

XST - 「WARNING:Xst:737 - Found n-bit latch for signal <name>」という警告メッセージが表示される

説明

キーワード: , HDL Advisor, ラッチ, 推論

重要度 : 標準

概要 :
HDL 合成でラッチ推論が検知されると、XST の HDL Advisor で次のような警告メッセージが表示されます。

"WARNING:Xst:737 - Found n-bit latch for signal <name>."

n は、ラッチの幅です。

ラッチの推論が意図したものであれば、このメッセージは無視しても問題ありません。 ただし、コードの記述方法によって不要なラッチが推論されることがあるので、 コードを解析して結果が意図したものであるかどうかを確認してください。 次に、ラッチの推論を回避する例を示します。

ソリューション

1

case 文に可能な分岐をすべて含めます。

Verilog

always @ (SEL or DIN1 or DIN2)
begin
case (SEL)
2'b00 : DOUT <= DIN1 + DIN2;
2'b01 : DOUT <= DIN1 - DIN2;
2'b10 : DOUT <= DIN1;
endcase
end

VHDL

process (SEL, DIN1, DIN2)
begin
case SEL is
when "00" => DOUT <= DIN1 + DIN2;
when "01" => DOUT <= DIN1 - DIN2;
when "10" => DOUT <= DIN1;
end case;
end process;

この 2 つの例では、SEL= "11" の分岐が指定されていないため、ラッチが作成されます。 ラッチが作成されないようにするには、次の行を追加します。

Verilog

2'b11 : DOUT <= DIN2;

VHDL

when "11" => DOUT <= DIN2;

DEFAULT (Verilog) または WHEN OTHERS (VHDL) も使用できますが、余分なロジックが作成されてしまうことがあります。 この方法は最も無難ですが、不明なステートのロジックを既知のステートにする必要があるため、デザインのサイズが大きくなり、スピードが遅くなることがあります。

2

各分岐ですべての出力に値を割り当てます。

Verilog

always @ (SEL or DIN1 or DIN2)
begin
case (SEL)
2'b00 : DOUT <= DIN1 + DIN2;
2'b01 : DOUT <= DIN1 - DIN2;
2'b10 : DOUT <= DIN1;
2'b11 :
begin
DOUT <= DIN2;
TEMP <= DIN1;
end
endcase
end

VHDL

process (SEL, DIN1, DIN2)
begin
case SEL is
when "00" => DOUT <= DIN1 + DIN2;
when "01" => DOUT <= DIN1 - DIN2;
when "10" => DOUT <= DIN1;
when "11" =>
DOUT <= DIN2;
TEMP <= DIN1;
end case;
end process;

この例では、11 の分岐では 2 つの出力に割り当てており、ほかの分岐は 1 つの出力にしか割り当てていないので、ラッチが推論されます。 この文で TEMP に注目すると、4 つの分岐のうち 1 つしか指定されないため、不完全です。 各分岐ですべての出力に値を割り当て、この状況を回避してください。

3

if 文および else if 文の後に else 文があるかどうかを確認してください。

VHDL :

<code>
process (ge, din) is begin
if (ge = '1') then
dout_a <= din;
else
dout_a <= '0'; -- これが else 文
end if;
end process;
</code>

Verilog :

<code>
always @(ge or din)
if (ge) dout_a <= din;
else dout_a <= 1'b0; // これが else 文
</code>
AR# 13979
日付 12/15/2012
ステータス アクティブ
種類 一般
このページをブックマークに追加