You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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中的以下指标:

  1. 组合路径时延(Combinational Path Delay)
    直接提取每个模块从输入端口到输出端口的纯组合逻辑时延,排除寄存器的时钟到输出(Tco)、输入建立时间(Tsu)等同步相关延迟,这是反映模块本身运算速度的核心指标。需分析每个模块的所有组合路径,取最大值作为模块的基准时延。

  2. 关键路径总时延(Total Path Delay)
    获取每个模块关键路径的完整时延(逻辑时延+布线时延),这是硬件中信号从输入到输出的实际耗时。你当前提供的“数据时延”属于该指标的一部分,但需确认是否覆盖了从模块输入到输出的完整路径。

  3. 时钟到输出时延(Tco)的标准化对比
    若模块为同步电路(你的起始节点为寄存器cnt[0]),需统一基准后对比Tco:确保所有模块的输入寄存器特性、输出负载一致,避免外部电路差异干扰模块本身的时延评估。

  4. 时序裕量的反向推导
    利用最大频率计算对应时钟周期(如165.65MHz对应约6.037ns),结合时序裕量推导实际路径时延:路径时延 = 时钟周期 - 时序裕量(注意单位统一,若裕量单位为ps,需转换为ns计算)。

关键操作提示

  • 为每个模块创建独立的时序约束,单独分析模块内部路径,避免被其他模块的寄存器或外部电路干扰。
  • 保持所有模块的综合、布局布线参数一致(如优化策略、器件型号),确保对比公平性。
  • 重点关注每个模块的最长组合路径,它决定了模块的最高运行速度。

内容的提问来源于stack exchange,提问作者SneakyFoxy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:55:22