Xilinx 设计的最小时钟周期随着输入的变化而不断变化

Minimum clock period for Xilinx designs keeps varying as the input is changed

我使用 VHDL 在 Xilinx 中设计了一个 MIPS 单周期处理器。抽象设计是基于Patterson和Henessy的书提供的理论。完成设计后,我 运行 几个汇编代码来检查它的功能并给出了预期的结果。 我的问题是设计总结报告(“.SYR”文件)中的 "TIMING SUMMARY"。 每次我更改存储在指令存储器(这是我的 ROM)中的汇编代码时,单周期处理器的最小时钟周期都会不断变化。不太明白是什么原因?

时序总结:
--------------
速度等级:-4

   最小周期:17.561ns(最大频率:56.945MHz)
   时钟前的最小输入到达时间:未找到路径
   时钟后最大输出所需时间:16.296ns
   最大组合路径延迟:找不到路径

时间细节:
--------------
所有值以纳秒 (ns) 为单位显示

================================================ =======================
时序约束:时钟的默认周期分析 'clk'
  时钟周期:17.561ns(频率:56.945MHz)
  路径/目标端口总数:6965792 / 616
---------------------------------------------- ----------------------
延迟:17.561ns(逻辑级 = 22)
  资料来源:MIPS_processor_unit/Datapath_comp/PC_reg/q_5_1 (FF)
  目的地:MIPS_processor_unit/Datapath_comp/RegF/memory_0_0 (FF)
  源时钟:clk rising
  目标时钟:clk rising

  数据路径:MIPS_processor_unit/Datapath_comp/PC_reg/q_5_1 到 MIPS_processor_unit/Datapath_comp/RegF/memory_0_0
                                门网
    Cell:in->out fanout Delay 延迟逻辑名称(网络名称)
    -------------------------------------------------- --
    FDCE:C->Q 2 0.591 0.622 MIPS_processor_unit/Datapath_comp/PC_reg/q_5_1 >>(MIPS_processor_unit/Datapath_comp/PC_reg/q_5_1)
     LUT2_L:I0->LO 1 0.704 0.104 Instruction_memory_unit/Mrom_Instruction_out391220_SW0 (N1361)
     LUT4:I3->O 3 0.704 0.535 Instruction_memory_unit/Mrom_Instruction_out391236_SW0 (N141)
     LUT4:I3->O 17 0.704 1.051 Instruction_memory_unit/Mrom_Instruction_out391236 (Instruction_tl_s)
     MUXF5:S->O 2 0.739 0.526 MIPS_processor_unit/Datapath_comp/RegF/mux8_8_f5 (MIPS_processor_unit/Datapath_comp/RegF/mux8_8_f5)
     LUT4:I1->O 1 0.704 0.000 MIPS_processor_unit/Datapath_comp/ALUSrc_mux/y1_F (N276)
     MUXF5:I0->O 3 0.321 0.610 MIPS_processor_unit/Datapath_comp/ALUSrc_mux/y1 (MIPS_processor_unit/Datapath_comp/ALU_2nd_input_s)
     LUT2:I1->O 1 0.704 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_lut (MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_lut)
     MUXCY:S->O 1 0.464 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy)
     MUXCY:CI->O 1 0.059 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy)
     MUXCY:CI->O 1 0.059 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy)
     MUXCY:CI->O 1 0.059 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy)
     MUXCY:CI->O 1 0.059 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy)
     MUXCY:CI->O 1 0.059 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy)
     MUXCY:CI->O 0 0.059 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_cy)
     XORCY:CI->O 1 0.804 0.424 MIPS_processor_unit/Datapath_comp/ALU_comp/Msub_y_sig_addsub0001_xor (MIPS_processor_unit/Datapath_comp/ALU_comp/y_sig_addsub0001)
     LUT4:I3->O 1 0.704 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/y_sig_mux0000_f5_G (N237)
     MUXF5:I1->O 259 0.321 1.334 MIPS_processor_unit/Datapath_comp/ALU_comp/y_sig_mux0000_f5 (Output_address_0_OBUF)
     RAM32X1S:A0->O 1 1.025 0.499 Data_memory_unit/Mram_data_mem1 (N10)
     LUT3:I1->O 1 0.704 0.000 inst_LPM_MUX_6 (inst_LPM_MUX_6)
     MUXF5:I0->O 1 0.321 0.000 inst_LPM_MUX_4_f5 (inst_LPM_MUX_4_f5)
     MUXF6:I0->O 1 0.521 0.455 inst_LPM_MUX_2_f6 (Read_data_tl_s)
     LUT3:I2->O 8 0.704 0.000 MIPS_processor_unit/Datapath_comp/WB_mux/y1 (MIPS_processor_unit/Datapath_comp/write_data_s)
     FDCE:D 0.308 MIPS_processor_unit/Datapath_comp/RegF/memory_0_0
    --------------------------------------
    总计 17.561ns(逻辑 11.401ns,路由 6.160ns)
                                       (逻辑 64.9%,路由 35.1%)

================================================ =======================


时序总结:
--------------
速度等级:-4

   最小周期:13.551ns(最大频率:73.798MHz)
   时钟前的最小输入到达时间:未找到路径
   时钟后最大输出所需时间:14.466ns
   最大组合路径延迟:找不到路径

时间细节:
--------------
所有值以纳秒 (ns) 为单位显示

================================================ =======================
时序约束:时钟的默认周期分析 'clk'
  时钟周期:13.551ns(频率:73.798MHz)
  路径/目标端口总数:256927 / 278
---------------------------------------------- ----------------------
延迟:13.551ns(逻辑级 = 13)
  资料来源:MIPS_processor_unit/Datapath_comp/PC_reg/q_6 (FF)
  目的地:MIPS_processor_unit/Datapath_comp/PC_reg/q_2 (FF)
  源时钟:clk rising
  目标时钟:clk rising

  数据路径:MIPS_processor_unit/Datapath_comp/PC_reg/q_6 到 MIPS_processor_unit/Datapath_comp/PC_reg/q_2
                                门网
    Cell:in->out fanout Delay 延迟逻辑名称(网络名称)
    -------------------------------------------------- --
     FDCE:C->Q 71 0.591 1.354 MIPS_processor_unit/Datapath_comp/PC_reg/q_6 (MIPS_processor_unit/Datapath_comp/PC_reg/q_6)
     LUT3_D:I1->O 8 0.704 0.761 Instruction_memory_unit/Mrom_Instruction_out4711110 (N91)
     LUT4:I3->O 17 0.704 1.051 Instruction_memory_unit/Mrom_Instruction_out43111_2 (Instruction_memory_unit/Mrom_Instruction_out43111_1)
     MUXF5:S->O 1 0.739 0.000 MIPS_processor_unit/Datapath_comp/RegF/mux3_7_f5_0 (MIPS_processor_unit/Datapath_comp/RegF/mux3_7_f51)
     MUXF6:I0->O 1 0.521 0.424 MIPS_processor_unit/Datapath_comp/RegF/mux3_5_f6_0 (MIPS_processor_unit/Datapath_comp/RegF/mux3_5_f61)
     LUT4:I3->O 1 0.704 0.424 MIPS_processor_unit/Datapath_comp/RegF/read_data_11 (MIPS_processor_unit/Datapath_comp/read_data_1_s)
     LUT4:I3->O 1 0.704 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_lut (MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_lut)
     MUXCY:S->O 1 0.464 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_cy)
     MUXCY:CI->O 1 0.059 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_cy)
     MUXCY:CI->O 1 0.059 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_cy)
     MUXCY:CI->O 0 0.059 0.000 MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_cy (MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_cy)
     XORCY:CI->O 18 0.804 1.072 MIPS_processor_unit/Datapath_comp/ALU_comp/Maddsub_y_sig_addsub0000_xor (MIPS_processor_unit/Datapath_comp/write_data_s)
     LUT4_D:I3->O 5 0.704 0.637 MIPS_processor_unit/Controller_comp/PCSrc9 (MIPS_processor_unit/Controller_comp/PCSrc9)
     LUT4:I3->O 1 0.704 0.000 MIPS_processor_unit/Datapath_comp/Jump_mux/y1 (MIPS_processor_unit/Datapath_comp/Next_PC_1_s)
     FDCE:D 0.308 MIPS_processor_unit/Datapath_comp/PC_reg/q_6
    --------------------------------------
    总计 13.551ns(逻辑 7.828ns,路由 5.723ns)
                                       (逻辑 57.8%,路由 42.2%)

================================================ =======================

可以看出我给了我 Instruction_memory_unit 两个不同的汇编代码和单周期处理器的最小周期 changes.These 是我的疑问:

1) 每次我更改汇编代码时,xilinx 是否会根据我在汇编代码中指定的指令评估关键路径?如果'Yes',那么我应该如何获得我的设计的一般最小周期?

2) 我有 RegF 作为我的寄存器文件,它基本上是包含 MIPS 处理器的 32 个寄存器的 RAM。我无法理解的是,在这两个时间摘要中 'Gate delay + Net Delay' 是不同的。理论上,作为内存的寄存器文件不应该有固定的读取时间吗?

每次实现设计时,即使没有任何逻辑更改,时序结果也可能不同。在某些情况下,路由拥塞、多条路径中的多级逻辑或多条 "difficult" 条路径,您可能会遇到来自 运行 运行.

的截然不同的结果

作为实验,在您的设计中不做任何更改,运行实施 2 或 3 次。我打赌你至少会在 运行 中得到 一些 的变化。

您可以使用一些句柄来最大程度地减少这种可变性,但我不推荐这样做(例如:在实施过程中使用固定种子)。可能这里发生了其他事情。

其他可能的因素:

  1. 您的所有IO是否都固定到特定的IO位置?如果不是,工具可能会为您设计的IO随机选择IO管脚,这将极大地影响时序。
  2. 您是否尝试过对您的设计施加约束(例如,在您的时钟上)?这将指示工具 "how hard they should try" 以改进您的设计以满足特定目标。如果您考虑了一些性能(例如 66MHz、100MHz...等),您可以将其作为约束提供给工具,它们将尝试满足该约束。
  3. 看看你的 ROM/RAM 是如何实际实现的。 这些工具可能会根据 内容 的 ROM,这在某些情况下可能会简化设计(基于内容)。简而言之,它可能将您的设计实现为 LUT 而不是 RAM 类型的原语。这可能会帮助您,它可能只是您此时如何实现事物(编码风格、重置等)的产物。如果将来 ROM 变得更通用(例如一些 运行 时间的加载过程),这些工具将无法采用相同的优化自由,并且将具有类似的性能 运行-to-运行.

总而言之,我不认为更改 ROM/RAM 的内容是您所看到的时间变化的罪魁祸首,而是其他一些因素。

它可能会将您的 ROM 合成为门或 LUT 或 SRL16。 ...检查设备使用情况(就在 .syr 文件中的计时报告之前)以查看它是否正在为 ROM 使用块内存 - 它可能不是。

事实上,根据时序报告,这似乎确实是问题所在:那里有很多 LUT,但没有 BRAM 的迹象。

如果这是问题所在,请在 Xilinx 约束指南中查找 "attribute ram_style=blockram"(我的 spellisg/syntax 可能略有错误)- 如果将其应用于包含 ROM 的阵列,您可能能够克服这个。一旦数据在内存中,时序应该更稳定。

注意 BlockRams 是同步的:您在一个时钟周期内提供地址并在一个周期后获取内容。如果这不符合您的流水线模型,您将不得不重新考虑,以便让综合在块内存中实现 ROM。