Vhdl ISim后路由模拟错误

Vhdl ISim后路由模拟错误,vhdl,simulation,fpga,xilinx,xilinx-ise,Vhdl,Simulation,Fpga,Xilinx,Xilinx Ise,我试图在ISE中用Isim模拟器测试一个VHDL项目。行为模拟工作正常,而Post Route会产生大量此类错误: 警告:/X_FF RST上的脉冲宽度高违规; 预期值:=1.794纳秒;观测值:=1.369纳秒 为什么会出现这个错误?我该怎么解决呢? 我试图在我的Basys2板上加载相对位流,但它不起作用。可能是因为这个模拟错误吗?谢谢 控制单元代码: type state is (IDLE, INIT, LSHIFT, ADD, SUB, SETQ); signal curr

我试图在ISE中用Isim模拟器测试一个VHDL项目。行为模拟工作正常,而Post Route会产生大量此类错误:

警告:/X_FF RST上的脉冲宽度高违规; 预期值:=1.794纳秒;观测值:=1.369纳秒

为什么会出现这个错误?我该怎么解决呢? 我试图在我的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;
类型状态为(IDLE、INIT、LSShift、ADD、SUB、SETQ);
信号电流,nxt:状态:=空闲;
开始
p0:进程(时钟、复位)
开始
如果reset_n_in='0',则

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

  • 您正在尝试跟踪可疑的工具错误(不太可能!)
  • 您正在验证涉及多个时钟和时钟域交叉或异步外部信号的设计
  • 您不确定您的时间限制覆盖范围
  • 通常,在遵循良好同步设计实践的设计中,行为模拟验证设计,静态计时分析比计时模拟更彻底地验证设计是否满足计时约束:假设您正确设置了计时约束。解释为什么这种方法工作得很好(考虑到有效的时间限制)

    但是,了解如何运行计时模拟是值得的。考虑到后路由模拟模型近似于实际的设备定时,而不是delta循环模型,它可能与行为测试台进行不同的交互

    因此,可能需要对试验台进行一些调整,以使其能够与行为模型和路线后模型同样良好地工作

    我不知道有什么好的文本来描述如何做到这一点,但它帮助我抓住了其中的问题(并让提问者接近他的问题)


    使用这种方法的一个好迹象是,如果你能让行为模型和后路线模型以同样的方式使测试台失败。

    正如Brian在其回答下面的评论中所强调的那样:

    你需要时间限制

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

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

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

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

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

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

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

    NET "clock" TNM_NET = "clock_group";
    TIMESPEC "TS_clock" = PERIOD "clock_group" 20 ns HIGH 40%;
    
    只有在同一时钟的上升沿触发了两个触发器,而下降沿触发了其他触发器时,占空比的实际值才是重要的。如果电路板手册中没有规定,只需选择50%


    关于时间限制和UCF文件语法的更多信息,您可以在中找到。

    如果没有任何代码和刺激,我们无法帮助您解决这个问题……至少从错误消息本身我可以看出,您没有为输入RST保留时间。我的项目中有很多代码。因为篇幅太长,所以我没有发。然而,如果这可以帮助,我可以张贴它没有问题。关于错误消息,你重置脉冲是短。如何生成重置?@Paebels我添加了我项目的代码。它应该负责恢复分区。然而,重置信号在顶部实体中,在测试台中始终设置为零。感谢您的回答。从我的目的来看,我对VHDL和时序模拟非常陌生。我尝试了路由后模拟,因为我试图调试我的代码,因为它在basys2板上不起作用,而行为模拟工作正常。从您最近的评论到问题,您需要时间限制-可能只是在这个阶段的时钟周期-然后重新运行合成和P&R,并检查它们是否符合时间要求。如果是这样,请再次尝试硬件设计。(您可能还需要输入和输出引脚约束,具体取决于它连接到什么)最后,如果您的设计是针对100 MHz时钟编写的,那么您还将跳线设置为100 MHz,将UCF文件设置为100 MHz。好的。。。在时钟上添加了定时约束,但在路由后模拟中没有任何更改。我仍然会遇到同样的错误。好的,那么你有两个选择:a)如果你只是想让它在FPGA板上工作,那么仔细检查所有引脚分配是否正确,时钟跳线是否设置为100 MHz。b) 如果错误仍然存在,那么您应该遵循Brian关于如何编写的建议