【问题标题】:ISim Post-Route Simulation ERRORISim 路由后模拟错误
【发布时间】:2016-02-25 17:09:20
【问题描述】:

我试图在 ISE 中使用 Isim Simulator 测试 VHDL 项目。行为模拟工作正常,而 Post-Route 会产生很多此类错误:

警告:/X_FF PULSE WIDTH High VIOLATION ON RST; 预期:= 1.794 ns;观察到:=1.369 ns。

为什么会出现这个错误?我该如何解决? 我试图在我的 Basys2 板上加载相关比特流,但它不起作用。可能是由于这个模拟错误吗?谢谢

控制单元代码:

    type state is (IDLE, INIT, LSHIFT, ADD, SUB, SETQ);
    signal curr, nxt : state := IDLE;


begin

p0: process(clock, reset_n_in)
begin
    if reset_n_in = '0' then
        curr <= IDLE;
    elsif rising_edge(clock) then
        curr <= nxt;
    end if;
end process;

fsm : process (curr, start,reset_n_in,fine_conteggio,S)
begin
--          if reset_n_in = '0' then 
--              reset_n_out <='0';
--          else
--              reset_n_out <='1';
--          end if;


        done <='0';
        en_write_Q <= '0';
        en_shift <= '0';
        en_M <= '0';
        incrementa_conteggio <= '0';
        en_write_S_A <= '0';
        carica_operando_Q <= '0';
        subtract <= '0';

        case curr is
            when IDLE =>
                if start = '1' then
                    reset_n_out <='0';
                    done <='0';                     
                    nxt <= INIT;
                else
                    nxt <= IDLE;
                end if;
                if fine_conteggio = '1' then
                    done <='1';
                    nxt <= IDLE;
                end if;

            when INIT =>
                en_M <= '1';
                en_write_S_A <= '1';
                en_write_Q <= '1';
                reset_n_out <='1';
                carica_operando_Q <= '1';
                nxt <= LSHIFT;

            when LSHIFT =>
                en_shift <= '1';
                nxt <= SUB;

            when SUB =>

                subtract <= '1';
                en_write_S_A <= '1';
                nxt <= SETQ;

            when ADD =>

                en_write_S_A <= '1';

                if fine_conteggio = '0' then
                    incrementa_conteggio <= '1';
                    nxt <= LSHIFT;
                else
                    nxt <= IDLE;
                end if;


            when SETQ =>
                en_write_Q <= '1';

                if S = '1' then
                    nxt <= ADD;
                else
                    if fine_conteggio = '0' then
                        incrementa_conteggio <='1';
                        nxt <= LSHIFT;
                    else
                        nxt <= IDLE;
                    end if;
                end if;

        end case;
end process;

【问题讨论】:

  • 如果没有任何代码和刺激,我们无法帮助您......
  • 至少从它自己的错误消息中我可以看出你没有遵守输入 RST 的保持时间
  • 我的项目中有很多代码。因为篇幅原因我没有发。但是,如果这有帮助,我可以毫无问题地发布它。
  • 关于错误信息,您的复位脉冲太短。您如何生成重置?
  • @Paebbels 我添加了我的项目的代码。它应该做恢复部门。然而,复位信号在顶层实体中,并且在测试台中始终设置为零。

标签: vhdl simulation fpga xilinx xilinx-ise


【解决方案1】:

时序仿真不是基于 VHDL 的 FPGA 设计流程的常规部分,除非:

  1. 您正在尝试追踪可疑的工具错误(不太可能!)
  2. 您正在验证涉及多个时钟和时钟域交叉或异步外部信号的设计。
  3. 您不确定自己的时序约束覆盖范围。

通常,在遵循良好同步设计实践的设计中,行为仿真会验证设计,而静态时序分析会比时序仿真更彻底地验证您的设计是否满足其时序约束:假设您已正确设置你的时间限制。一些解释为什么这种方法效果很好(给定有效的时序约束)here

但是,了解如何运行时序仿真是值得的。鉴于布线后仿真模型近似于实际设备时序而不是增量周期模型,它可能与行为测试台进行不同的交互。

因此,可能需要对测试平台进行一些调整,以使其与行为模型和路由后模型同样出色地工作。

我不知道描述如何做到这一点的好文字,但 here's my empirical approach 帮助我抓住了它的问题份额(并使提问者接近他的问题)。

使用这种方法的一个好迹象是,如果您可以让行为模型和路由后模型以相同的方式在测试台上失败。

【讨论】:

  • 感谢您的回答布赖恩。我对 VHDL 非常陌生,并且时序仿真符合我的目的。我尝试了路由后模拟,因为我试图调试我的代码,因为它在 basys2 板上不起作用,而行为模拟工作正常。
  • 从您的最新评论到您需要时序约束的问题——在这个阶段可能只是时钟周期——然后重新运行综合和 P&R 并检查它们是否符合时序。如果是这样,请再次尝试硬件设计。 (您可能还需要输入和输出引脚约束,具体取决于它所连接的对象)
【解决方案2】:

正如 Brian 在他的回答下方的评论中已经强调的那样:

您需要时间限制。

即使你的教授还没有谈过。只有在时序约束下,静态时序分析器 (STA) 才能发挥作用。此外,Place&Route 算法尊重时序约束,并尝试在两个单元之间找到更好的路由和/或将逻辑放置到单元上,以便满足请求的时序(例如时钟频率)。

您的 Basys2 FPGA 板提供可配置的时钟振荡器。您可以通过跳线将其配置为 25 MHz、50 MHz 或 100 MHz,如board manual 中所述。默认设置为 50 MHz,而您的测试台模拟 100 MHz 时钟。

Xilinx ISE 工具链使用所谓的“用户约束文件”(简称 UCF)来指定时序约束。 在 Xilinx ISE 的 Project Navigator 中,您可以通过菜单 Project -> New File -> Implementation Constraints File 添加 UCF 文件。指定文件名并按下一步。然后新文件将显示在设计层次结构中(在左侧)。您可以通过双击来编辑它。它只是一个文本文件。

要指定 100 MHz 时钟,您必须在 UCF 文件中键入:

NET "clock" TNM_NET = "clock_group";
TIMESPEC "TS_clock" = PERIOD "clock_group" 10 ns HIGH 50%;

第一行将连接到信号clock 的所有触发器添加到(新创建的)时序组clock_group。然后第二行将该组限制为特定的时钟频率,此处为 10 ns 用于 100 MHz,具有特定的占空比(此处为 50%)。有效时钟边沿是上升沿 (HIGH)。计时规范还有一个名称,必须TS 开头。 STA 的时序报告然后引用此名称。

编辑 UCF 文件后,您必须再次运行“实施设计”步骤,以便应用新的约束。

要指定占空比为 40% 的 50 MHz 时钟,您可以改为:

NET "clock" TNM_NET = "clock_group";
TIMESPEC "TS_clock" = PERIOD "clock_group" 20 ns HIGH 40%;

只有在同一时钟的上升沿触发了两个触发器,而在同一时钟的下降沿触发了其他触发器时,占空比的实际值才重要。如果电路板手册中没有指定,只需选择 50%。

有关时序约束和 UCF 文件语法的更多信息,请参阅Xilinx Constraints Guide

【讨论】:

  • 最后,如果您的设计是为 100 MHz 时钟编写的,那么您还将跳线设置为 100 MHz,将 UCF 文件设置为 100 MHz。
  • ok... 在时钟上添加了时序约束,但在布线后仿真中没有任何变化。我仍然遇到同样的错误。
  • 好的,那么您有两个选择:a) 如果您只想让它在 FPGA 板上工作,那么请仔细检查所有引脚分配是否正确以及时钟跳线是否设置为 100 MHz . b) 如果错误仍然存​​在,那么您应该遵循 Brian 关于如何编写路由后测试平台的建议。我在这里帮不上忙,因为我以前没有做过。
  • 好的,伙计们。经过几天的调试,我去找我的教授,他建议我重写控制单元 fsm(我编辑了代码,现在只显示 fsm)。我想我发现了问题,它在信号reset_n_out 中。看起来代码中注释的 if 语句会产生一些问题,因为没有它,行为和后路由模拟确实匹配(具有错误行为)。但是如何修改代码?我试图在第一个进程(p0)中分配reset_n_out,但这会导致我在另一个进程中分配它时出现多重分配错误。谢谢
  • 我刚刚尝试过,即使我在代码中保留了 if 块的注释,但我在 IDLE 和 INIT 状态下删除了 reset_n_out 赋值,模拟也没有出错。所以我猜是因为某些原因他们不能在一起??
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2013-11-05
  • 2017-03-09
  • 2017-03-26
  • 2010-09-18
相关资源
最近更新 更多