ISim后路线模拟错误

时间:2016-02-25 17:09:20

标签: vhdl simulation fpga xilinx xilinx-ise

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

警告:/ X_FF PULSE WIDTH 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;

2 个答案:

答案 0 :(得分:1)

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

  1. 您正试图追踪可疑的工具错误(不太可能!)
  2. 您正在验证涉及多个时钟和时钟域交叉或异步外部信号的设计。
  3. 您不确定您的时间限制覆盖范围。
  4. 通常情况下,在遵循良好的同步设计实践的设计中,行为仿真验证了设计,静态时序分析可以更加全面地验证您的设计是否满足时序约束而不是时序仿真可以:假设您已正确设置你的时间限制。解释为什么这种方法运行良好(给定有效的时序约束)here

    然而,值得知道如何运行时序模拟。鉴于路径后仿真模型近似于实际设备时序而不是delta-cycle模型,它可能与行为测试平台的交互方式不同。

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

    我不知道如何做到这一点的好文章,但是here's my empirical approach帮助我抓住了它的一部分问题(并让那个提问者接近他的问题)。

    使用这种方法的一个好兆头是,如果你能够以相同的方式使行为和路由后模型失败,那么

答案 1 :(得分:0)

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

  

您需要时间限制。

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

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

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

要指定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中找到。