回顾2

173 阅读6分钟

STA静态时序分析

1 关键路径:

关键路径是指同步逻辑电路中,组合逻辑时间延迟最大路径。

1 流水线:在组合逻辑中插入寄存器,流水线思想,额外插入寄存器在保持吞吐量不变的情况下,改善了设计的时序性能。

2 寄存器平衡:在不增加寄存器个数的前提下,通过改变寄存器的位置优化关键路径。将关键路径的组合逻辑移动到相邻路径。

3 并行化

2 时间余量slack分析:

时间余量slack = 数据需求时间 - 数据到达时间

数据需求时间为 Tclk + Tclk2 - Tsu

其中Tclk2 为时钟信号从时钟源端口出发,到达目的寄存器时钟端口的时间。

Tsu 为建立时间

数据到达时间为TClk1+ Tco+ Tdata

其中Tclk1为时钟信号从时钟源端口出发,到达源寄存器时钟端口的时间。

Tco为时钟上升沿到达寄存器时钟端到寄存器输出端Q的时间。

Tdata为两个寄存器之间的逻辑延时

image.png

Tskew: 时钟偏斜 时钟从源端口出发,到达目的寄存器和源寄存器 时钟端口的时间差值。Tclk2 - Tclk1。

3 verilog中常量parameter 和宏定义define区别

parameter 一般用于被调用的子模块,将子模块的特定常量参数化。 参数的定义可以在模块内部,需要用defparam来对参数重定义。参数定义也可以在端口,参数的重定义类似信号的例化。

localparam模块内有效的定义,是局部变量,不可以用于参数传递,也不可以重定义。适用于当模块内的常量需要被参数化,但不需要被其他模块重定义。比如状态机的状态变量。适用于固定的本地常量。

define 作用于整个工程,适用于跨文件调用。 实质为一条编译指令,功能使用文本宏来代替常量,类似c语言中的define。 一般使用一个参数文件 统一预定义所有module被调用的参数,方便管理。

4 什么是亚稳态,为什么两级触发器可以防止亚稳态传播

亚稳态:

为了保证信号的可靠传输,输入寄存器的信号必须在建立时间之前保持稳定,并持续到时钟沿之后的某段时间-保持时间。 而该寄存器的输入到输出需要经过一定的延时,这个时间为时钟到输出的时间。 如果数据的变化违反了建立时间或者保持时间,那么寄存器就会处于亚稳态,此时寄存器的输出就会在高电平和低电平之间盘旋一段时间。这意味着寄存器的输出 达到一个稳定的高电平或者低电平的时间 大于时钟到输出的时间,此时输出的数据不稳定。

通过两级触发器的思想是给亚稳态留出足够的时间,让亚稳态变为稳定态。

一般亚稳态的持续时间很短,两级触发启动目的是给亚稳态留出一个触发器的工作时钟周期,如果第一个触发器的输出出现亚稳态,那么在一个时钟周期内,让亚稳态变为稳定态,这样在第二级触发器在采样第一级触发器的输出时,第一级触发的输出早就稳定了,因此不会出现亚稳态的传播。 如果第二级采样时保持时间不够,第一级的输出仍未很强的亚稳态,将会导致第二级同步器也进入亚稳态,但这样的概率很小。

亚稳态其他解决方法: 专用握手协议,或者异步fifo。

5 异步信号的同步处理,从控制信号和数据总线两方面回答

从单一信号(如控制信号):如果和这个输入信号来自异步时钟域,一般采用同步器进行同步,最基本的结构是两级触发器,第一拍将数据同步化,同步后的输出可能带来建立时间/保持时间的冲突,再需要寄存器延迟一拍,减少亚稳态的影响。

对于数据总线信号的处理:如果对于一组信号整体而言采用同步器,亚稳态的概率会大大提升。对于总线信号,如果这组信号是顺序变化(如存储器的地址),可以将其转化为格雷码后再发送,格雷码相邻每位只有1bit发生变化,使得同步器可以很好地发挥作用。 如果信号的变化是随机的(存储器的数据),这时就需要用专用的握手协议或者采用fifo等存储器进行数据缓存。

6 阻塞赋值和非阻塞赋值,适用场合

阻塞赋值=在阻塞赋值完成后,才进行下一条语句的执行,赋值一旦完成,等号左边的变量值就会发生更新。非阻塞复制<=,在赋值开始时计算表达式右边的值,赋值不会立即生效,在赋值结束后更新表达式左边的值,非阻塞赋值在块中是并行同时执行的。

适用场合:时序电路建模时,使用非阻塞赋值,用always块建立组合逻辑使用阻塞赋值。在同一个always块既使用组合逻辑又使用时序逻辑,使用非阻塞赋值。

7 多路选择器 3-8译码器设计

三位输入八位输出

module my3_8(a,b,c,out);
    input a,b,c;
    output reg [7:0]out;  
    
    always@(a,b,c) begin
        case({a,b,c}):
            3'b000: out = 8'b0000_0001;
            3'b001: out = 8'b0000_0010;
            3'b010: out = 8'b0000_0100;
            3'b011: out = 8'b0000_1000;
            3'b100: out = 8'b0001_0000;    
            3'b101: out = 8'b0010_0000;
            3'b110: out = 8'b0100_0000;
            3'b111: out = 8'b1000_0000;    
            
    endcase
    end
            
endmodule

8 二选一多路选择器

module muxtwo(a,b,sel,out)
    input a,b,sel;
    output reg out;
    always@(sel or a or b)
         if(!sel)
             out  = a;
         else 
             out  = b;
    
      
    endmodule

9 FPGA设计流程

电路设计 - 功能仿真 - 逻辑综合 - 布局布线 - 时序仿真 - 板级仿真和验证 - 调试和加载配置 等主要步骤。