本文由本人原创翻译于ALTERA的官网上Educational_Materials->Digital_Logic->Tutorials->Timing_Analysis_Tutorials下一篇名为Timing Considerations with Verilog-Based Designs的文章,个人觉得ALTERA官网上很多教程都很不错,有机会可以锻炼下专业英语水平,随便也可以把这些不错的教程和大家分享。原文档包含在下面的附件中,有兴趣的可以查看。
一、实例:加减法器电路
时序问题在包含关键路径中是非常重要的问题,在这些关键路径中,寄存器到寄存器之间的组合逻辑大小通常决定了系统的时序性能。接下来我们用图1所示的加减法器来演示如何使用时序分析工具。图1所示的加减法器能进行n位二进制补码数的加法和减法运算,其中输入端和代表两个n位操作数,输出端代表运算结果。当输入控制信号AddSub=0时,进行Z=A+B运算,否则Z=A-B。输入信号Sel用来选择进行累加操作。当Sel=0时,执行Z=A±B,当Sel=1,则把Z当前的值加上或者减去B的值。如果加法或者减法运算结果产生溢出,则输出信号Overflow会被置1。
为了更容易地处理异步信号,输入信号都用时钟寄存一拍。输入信号A、B、Sel和AddSub分别在时钟上升沿加载到寄存器Areg、Breg、SelR和AddSubR中。同样,输出结果也用一级寄存器Zreg进行锁存。
图1 加减法器电路
上述加减法器的verilog描述如下所示,在这个例子中,我们指定n=16,表示加减法器的位宽是16位。
// Top-level module
module addersubtractor (A, B, Clock, Reset, Sel, AddSub, Z, Overflow);
parameter n = 16;
input [n-1:0] A, B;
input Clock, Reset, Sel, AddSub;
output [n-1:0] Z;
output Overflow;
reg SelR, AddSubR, Overflow;
reg [n-1:0] Areg, Breg, Zreg;
wire [n-1:0] G, H, M, Z;
wire carryout, over_flow;
// Define combinational logic circuit
assign H = Breg ^ {n{AddSubR}};
mux2to1 multiplexer (Areg, Z, SelR, G);
defparam multiplexer.k = n;
adderk nbit_adder (AddSubR, G, H, M, carryout);
defparam nbit_adder.k = n;
assign over_flow = carryout ^ G[n-1] ^ H[n-1] ^ M[n-1];
assign Z = Zreg;
// Define flip-flops and registers
always @(posedge Reset or posedge Clock)
if (Reset == 1)
begin
Areg <= 0; Breg <= 0; Zreg <= 0;
SelR <= 0; AddSubR <= 0; Overflow <= 0;
end
else
begin
Areg <= A; Breg <= B; Zreg <= M;
SelR <= Sel; AddSubR <= AddSub; Over?ow <= over_flow;
end
endmodule
// k-bit 2-to-1 multiplexer
module mux2to1 (V, W, Selm, F);
parameter k = 8;
input [k-1:0] V, W;
input Selm;
output [k-1:0] F;
reg [k-1:0] F;
always @(V or W or Selm)
if (Selm == 0) F = V;
else F = W;
endmodule
// k-bit adder
module adderk (carryin, X, Y, S, carryout);
parameter k = 8;
input [k-1:0] X, Y;
input carryin;
output [k-1:0] S;
output carryout;
reg [k-1:0] S;
reg carryout;
always @(X or Y or carryin)
{carryout, S} = X + Y + carryin;
endmodule
二、时序分析报告
完全编译工程成功后的总报告如图2所示。这里器件选择Cylcone II 系列的 EP2C35F672C6。
图2 编译报告
这个报告给出了许多有用的信息。从这我们可以看到实现这个加减法器需要使用的逻辑单元、寄存器和引脚数量。同时还给出了综合和适配的详细信息。不仅如此,报告还给出了实现我们电路的最大运行时钟频率。衡量一个电路可运行的最大时钟频率我们称为fmax,这个最大时钟频率由电路的同一时钟源所驱动的寄存器到寄存器之间的最长延时所决定,这些路径被称为关键路径。Quartus II软件执行时序分析来告知我们所实现的电路的时序性能。在编译报告的Timing Analyzer报告中列出了用来决定电路时序性能的几个参数。单击Timing Analyzer前的小+号来展开时序分析报告。首先打开Timing Analyzer分类下的Summary报告,如图3所示。在Summary最后一个条目中显示了在我们所用的FPGA芯片中实现该加减法器所能运行的最大时钟频率是254.78MHz。该频率值可能会因为Quartus II软件的版本不同而有所差异。单击图3 Timing Analyzer分类下的Clock Setup:’Clock’,我们可以更详细的看到限制最大时钟频率fmax的关键路径,如图4所示。在本例子中,关键路径1从寄存器AddSubR到寄存器Overflow。
图3 时序分析器报告
图4 关键路径
在图3中还显示了其他的时序分析结果。相比fmax由电路中两个寄存器之间最长的数据传播延时所决定,我们把源寄存器时钟有效沿来时数据从该寄存器输出并且到达芯片引脚上的时间参数称为tco。图3所示,最坏的情况下,该加减法器的tco是8.660ns。单击Timing Analyer分类下的tco栏目,如图5所示,表中第一栏显示时钟有效沿来到,信号从寄存器Zreg的第15 bit传播到输出引脚z15上所需时间是8.660ns。图3中另外两种时间参数是建立时间tsu和保持时间th。
图5 tco延时
三、指定时序约束
目前为止我们编译了我们的Verilog代码,但并没有告诉Quartus II软件电路所需要运行的时钟频率,Quartus II软件允许我们指定电路所要达到的时序约束。例如,我们希望该加减法器电路能运行的最小时钟频率至少为235MHz,我们可以设置fmax约束来尝试实现这一要求,步骤如下:
1、 选择菜单Assignments->Timing Analysis Settings->Classic Timing Analyer Settings,打开如图6所示的窗口。在这个窗口中,我们可以设置若干不同的时序参数。
2、 在Clock Settings输入框中输入fmax为235MHz,单击OK。
3、 重新编译工程。
4、 打开时序分析器报告,如图7所示,我们看到新的fmax为235.02MHz,该数值可能会根据你所使用的Quartus II版本不同而有稍许不同。
图6 在设置窗口中指定时序约束
图7 新的时序分析结果
如果指定的约束太高,Quartus II编译器可能会无法达到要求。例如,设置fmax约束到300MHz,重新编译电路,打开Timing Analyzer Summary,如图8所示,这时显示该约束没有实现。
图8 时序约束没有实现
指定的300MHz fmax约束没有实现是因为电路中有一条或者更多路径拥有长的传播延时。我们可以进行如下操作来查看影响Clock Setup建立时间的最关键路径。右键Clock Setup:’Clock’栏,弹出右键菜单,如图9所示,选择Locate->Locate in RTL Viewer,这样会打开寄存器传输级查看器RTL Viewer来显示关键路径,如图10所示。注意到该路径起始于寄存器AddSubR,结束于寄存器Overflow。
图9 定位关键路径
图10 没有达到时序约束的路径
可能还会有别的不满足指定的时序约束的路径。可以通过选择图8编译报告左侧的Clock Setup:’Clock’来查看这些路径。如图11所示,这里有20条路径的传播延时过长。观察名称为Slack的一列,术语Slack用来指示时序要求达到或者没有达到的差额。在图11最上一行我们看到沿着寄存器AddSubR到寄存器Overflow的slack是-0.884ns,也就是说该路径的延时大于指定的fmax约束300MHz时钟频率周期(3.33ns)0.884ns。
图11 更多的关键路径
四、时序仿真
时序仿真为所实现的电路提供一种图形化的时间延时的显示,它能从显示的波形图中观察到。时序的仿真我们会在Quartus II 仿真中接着使用本例中的加减法器来详细讨论。
用户1654058 2012-4-11 10:43
谢谢
用户1635818 2011-5-4 09:33