如何在Intel Quartus Timing Analyzer中获取模块真实时延验证速度关系?
我设计了三个模块:模余数生成器(remainder_modulo)、模加法器(adder_modulo)和模华莱士加法器(adder_modulo_wallace),预期速度关系为 remainder_modulo > adder_modulo_wallace > adder_modulo。但Intel Quartus的Timing Analyzer仅给出器件频率,无法满足需求,我需要获取模块的真实时延以验证该速度关系,应参考哪些时序指标?
模块Verilog代码
module remainder_modulo #(parameter n) ( input wire [n-1:0] A, input wire [n-1:0] P, output wire [n:0] S, output Po ); wire [n:0] A_factor = {A, 1'b0}; wire [n:0] P_extended = {1'b0, P}; wire [n:0] S_temp; multidigitAdder #(.n(n+1)) multAdd(.A(A_factor), .B(P_extended), .Pi(1'b1), .S(S_temp), .Po(Po)); assign S = Po ? S_temp : A_factor; endmodule module adder_modulo #(parameter n) ( input wire [n-1:0] A, input wire [n-1:0] B, input wire [n-1:0] P, output wire [n-1:0] S, output Po ); wire [n-1:0] S_temp, S_temp_mod; multidigitAdder #(.n(n)) multAdd1(.A(A), .B(B), .Pi(1'b0), .S(S_temp)); multidigitAdder #(.n(n)) multAdd2(.A(S_temp), .B(P), .Pi(1'b1), .S(S_temp_mod), .Po(Po)); assign S = Po ? S_temp_mod : S_temp; endmodule module adder_wallace #(parameter n) ( input wire [n-1:0] A, input wire [n-1:0] B, input wire [n-1:0] P, input Pi, output wire [n-1:0] S, output Po ); wire [n-1:0] S_arr, Po_arr; genvar i; generate for (i = 0; i < n; i = i + 1) begin : MEM bitAdder adder(A[i], B[i], P[i], S_arr[i], Po_arr[i]); end endgenerate wire [n:0] multi_B_arr = {Po_arr, Pi}; wire [n:0] multi_A_arr = {1'b0, S_arr}; multidigitAdder #(.n(n + 1)) mAdder(.A(multi_A_arr), .B(multi_B_arr), .Pi(1'b0), .S(S), .Po(Po)); endmodule module adder_modulo_wallace #(parameter n) ( input wire [n-1:0] A, input wire [n-1:0] B, input wire [n-1:0] P, output wire [n-1:0] S, output Po ); wire [n-1:0] simpleSum, wallaceSum; multidigitAdder #(.n(n)) multAdd1(.A(A), .B(B), .Pi(0), .S(simpleSum)); adder_wallace #(.n(n)) add(.A(A), .B(B), .P(P), .Pi(1), .S(wallaceSum), .Po(Po)); assign S = Po ? wallaceSum : simpleSum; endmodule module multidigitAdder #(parameter n) ( input wire [n-1:0] A, input wire [n-1:0] B, input Pi, output wire [n-1:0] S, output Po ); assign {Po, S} = A + B + Pi; endmodule
已获取的时序数据
remainder_modulo
- 最大频率:165.65 MHz
- 起始节点:
cnt[0] - 终止节点:
reduce_modulo:reduce|multidigitAdder:multAdd|Add1~8_OTERM9 - 时序裕量(Slack):16.642
- 数据时延(Data delay):3.31
adder_modulo_wallace
- 最大频率:136.59 MHz
- 起始节点:
cnt[0] - 终止节点:
adder_modulo_wallace:addWallaceMod|S[3]~3_OTERM9 - 时序裕量(Slack):17.084
- 数据时延(Data delay):2.75
adder_modulo
- 最大频率:165.65 MHz
- 起始节点:
cnt[0] - 终止节点:
adder_modulo:addMod|multidigitAdder:multAdd2|Add1~6_OTERM9 - 时序裕量(Slack):18.076
- 数据时延(Data delay):1.875
要验证模块真实时延关系,需重点关注Quartus Timing Analyzer中的以下指标:
组合路径时延(Combinational Path Delay)
直接提取每个模块从输入端口到输出端口的纯组合逻辑时延,排除寄存器的时钟到输出(Tco)、输入建立时间(Tsu)等同步相关延迟,这是反映模块本身运算速度的核心指标。需分析每个模块的所有组合路径,取最大值作为模块的基准时延。关键路径总时延(Total Path Delay)
获取每个模块关键路径的完整时延(逻辑时延+布线时延),这是硬件中信号从输入到输出的实际耗时。你当前提供的“数据时延”属于该指标的一部分,但需确认是否覆盖了从模块输入到输出的完整路径。时钟到输出时延(Tco)的标准化对比
若模块为同步电路(你的起始节点为寄存器cnt[0]),需统一基准后对比Tco:确保所有模块的输入寄存器特性、输出负载一致,避免外部电路差异干扰模块本身的时延评估。时序裕量的反向推导
利用最大频率计算对应时钟周期(如165.65MHz对应约6.037ns),结合时序裕量推导实际路径时延:路径时延 = 时钟周期 - 时序裕量(注意单位统一,若裕量单位为ps,需转换为ns计算)。
关键操作提示
- 为每个模块创建独立的时序约束,单独分析模块内部路径,避免被其他模块的寄存器或外部电路干扰。
- 保持所有模块的综合、布局布线参数一致(如优化策略、器件型号),确保对比公平性。
- 重点关注每个模块的最长组合路径,它决定了模块的最高运行速度。
内容的提问来源于stack exchange,提问作者SneakyFoxy

