1

いくつかの制御信号を設定してサードパーティの IP とやり取りする非常に単純なステートマシンがあります。コードはおおよそ次のようになります。

entity testip is
  port (
  ...
    fifo_dataout        : in  std_logic_vector(0 to 31);
    ip_dataout          : in  std_logic_vector(0 to 31);
    ip_ce                 : out std_logic;
    ip_we                : out std_logic;
    ip_datain            : out std_logic_vector(0 to 31);
  );
end entity testip;

architecture imp of testip is

  signal ip_ce_ns     : std_logic;
  signal ip_we_ns     : std_logic;
  signal ip_ce_cs     : std_logic;
  signal ip_we_cs     : std_logic;
  signal ip_dataout_i : std_logic_vector(0 to 31);
  ...

  attribute keep: string;
  attribute keep of ip_ce    : signal is "True";
  attribute keep of ip_we    : signal is "True";

  begin

  COMB : process (...)
      begin
        ip_ce_ns          <= ip_ce_cs;
        ip_we_ns          <= ip_we_cs;

     case ip_nstate_cs is
        when IDLE      =>
        ...

     end case;
 end process COMB;

 REG: process (Clk) is
   begin
      if (Clk'event and Clk = '1') then
         if (Rst = '1') then
              ip_ce_cs                <= '1';
              ip_we_cs                <= '1';
              ...
         else          
              ip_ce_cs                <= ip_ce_ns;
              ip_we_cs                <= ip_we_ns;
              ...
         end if;
    end if;
 end process REG;

S0:     ip_ce                 <= ip_ce_cs;
S1:     ip_we                <= ip_we_cs;
S2:     ip_datain           <= fifo_dataout;
S3:     ip_dataout_i       <= Ip_dataout;

end architecture imp;

合成は問題なく動作しますが、次の制約ファイルを適用すると、ERROR:ConstraintSystem:59 - NET "testip/ip_we" not found が発生します。testip/ip_datain と testip/ip_ce についても同じことが起こります。

 Net testip/ip_datain<*> MAXDELAY = 2 ns;
 Net testip/ip_ce MAXDELAY = 2 ns;
 Net testip/ip_we MAXDELAY = 2 ns;

ネットリストを確認しましたが、実際には、testip/ip_we、testip/ip_ce、testip/ip_datain ネットのいずれもありません。他のネットがネットリストにない理由は誰にでもわかりますが、すべて非常に混乱しています。

フィードバックをお寄せいただきありがとうございます。

編集:トップモジュールファイルに添付された詳細なインスタンス化を参照してください:

icap0 : entity icap.hwicap
    generic map (pindex => 2, paddr => 2, pmask => 16#FFE#, C_SIMULATION => 2,
           C_FAMILY => "virtex5")
    port map (rst => rstn, clk => clkm, apbi => apbi, apbo => apbo(2));


Net icap0/icap_statemachine_I1/Icap_datain<*> MAXDELAY = 2 ns;
Net icap0/icap_statemachine_I1/Icap_ce MAXDELAY = 2 ns;
Net icap0/icap_statemachine_I1/Icap_we MAXDELAY = 2 ns;

これでうまくいくはずですが、ネットリストを見て信号 Icap_ce または Icap_we を探すと、それらは存在しません。これらのネットは存在しないか、名前が変更されたため、もう見つけることができないと思います。ありがとう

4

3 に答える 3

2

信号はおそらく最適化されています... ip_ce を生成するワイヤー ループがあり、存在しない fifo_dataout で ip_datain を駆動しているようです。何を対象としているかは示していませんが、最新の FPGA 合成はデフォルトで未使用/駆動されていないロジックの削除に非常に積極的であり、通常はログに情報または警告メッセージが表示されるだけです。合成ログをクロールして、探している信号に関連する奇妙なものを探します。

于 2010-11-01T20:03:32.507 に答える
1

keep属性は大文字と小文字が区別される"true"と思います"True"

于 2010-11-03T15:09:08.520 に答える
1

チャールズが言うように、あなたの信号はおそらく最適化されています.

合成アトリビュートをpreserve hierarchyに設定すると、ポートは維持されます (ただし、一部の最適化は失われます)。

タイミングほど信号については気にしていないと思います。その場合は、制約でネット名ではなく開始点と終了点を使用してください。

または、ソース コードで信号にkeep属性を設定することもできます。もちろん、それによってソースコードの移植性が低下する可能性があります。私のお勧めは、開始点と終了点を使用することです。

testip はあなたのトップレベルですか? 試していない場合

Net "*/testip/ip_ce" MAXDELAY = 2 ns;

このネットは検出されていますか?

Net "*/testip/ip_ce_cs" MAXDELAY = 2 ns;

実際、私はもっと明白なことを見逃していました.testipのインスタンスの名前は何ですか? 制約で testip の代わりにそれを使用します。すなわち

u_test_ip : testip

それから

Net "*/u_test_ip/ip_ce" MAXDELAY = 2 ns;
于 2010-11-02T09:54:13.283 に答える