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