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;

Sythesis 工作正常,但是,当应用以下约束文件时,我得到 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

正如查尔斯所说,您的信号可能正在被优化掉。

如果您将综合属性设置为保留层次结构,那么您的端口将被保留(但您会错过一些优化)。

我想你并不像你对时间那样关心信号。在这种情况下,请在约束中使用起点和终点,而不是网络名称。

或者,您可以在源代码中为信号设置keep属性。这当然会使您的源代码的可移植性降低。我的建议是使用起点和终点。

testip是你的顶级吗?如果不试试

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

这个网被检测到了吗?

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

实际上,我错过了更明显的东西,testip 实例的名称是什么?在您的约束中使用它而不是 testip 。IE

u_test_ip : testip

然后

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