网络实例化的问题

时间:2010-11-01 17:24:54

标签: vhdl fpga

我有一个非常简单的状态机,它设置一些控制信号以与第三方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”未找到。 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他们只是不存在。我只是认为这些网不存在或已经重命名,所以我不能再找到它们了。感谢

3 个答案:

答案 0 :(得分:2)

信号可能已经被优化了......看起来你有一个生成ip_ce的线路循环,你正在用不存在的fifo_dataout驱动ip_datain。您没有指出您的目标,但是现代FPGA合成默认非常积极地去除未使用/未驱动的逻辑,通常只需要日志中的信息或警告消息。抓取您的综合日志,查找与您正在寻找的信号有关的奇怪内容。

答案 1 :(得分:1)

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

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

我猜你并不是因为关于时间而对信号感到困扰。在这种情况下,请使用起点和终点,而不是约束中的网络名称。

或者,您可以在源代码中的信号上设置 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;

答案 2 :(得分:1)

我认为keep属性区分大小写,您是否尝试"true"而不是"True"