管道触发器的编码考虑

文章:Mufaddal Saifee&Jaymin Patel

为了实现更好的性能,现在设计具有通过触发器链流水线的数据。万博投注网址

在ASIC/FPGA设计中选择复位使用及其策略需要考虑很多设计因素,如每个触发器是否需要复位,是使用同步复万博投注网址位还是异步复位,复位树如何构造和缓冲,如何验证复位树的定时,在多时钟域设计中,如何应用测试扫描向量来检测复位功能以及如何处理复位。万博投注网址在本文中,我们将看到FPGA组件(如移位寄存器、块RAM、分布式RAM和DSP切片)如何通过正确使用reset来有效地使用。

管道触发器的编码考虑

设计者不应将可重置和不可重置的触发器混合在同一Verilog程序块或VHDL过程块中。
使用两个Verilog程序块的代码管道触发器的正确​​方法如下所示。这些编码样式将生成图1所示的逻辑。

模块follower_FF (Clk Rst d, q1);
输入CLK;
输入Rst;
输入D;
q1输出;

Q;
瑞典季度Q1;

总是@ (posedge Clk)
开始
如果(Rst)
开始
q <= 1'b0;
结尾
别的
开始
q < = d;
结尾
结尾

总是@ (posedge Clk)
开始
Q1 <= Q;
结尾
终点

[edna fpga 04]
__配置1:__ *跟随器触发器无重置*

如下面的代码所示,如果两个触发器都在相同的过程块中建模,那么它将生成如图2所示的逻辑。下面的编码风格通过使用复位信号Rst作为第二个触发器的数据使能来产生额外的逻辑。

模块follower_FF (Clk Rst d, q1);
输入CLK;
输入Rst;
输入D;
q1输出;

Q;
瑞典季度Q1;

总是@ (posedge Clk)
开始
如果(Rst)
开始
q <= 1'b0;
结尾
别的
开始
q < = d;
Q1 <= Q;
结尾
结尾
终点

[edna fpga 05]
图2:__ *跟随触发器与糟糕的编码风格*

FPGA中数据路径和控制路径的复位使用

在FPGA中复位的实现与相应的供应商相关联。因此,在用某种复位实现FPGA硬件之前,建议仔细阅读FPGA厂商的数据表和HDL编码指南。一些FPGA硬宏,如SRL、DSP Blocks、BRAM Blocks和SERDES只支持有限的重置选项,或根本不支持。因此,错误地重置此类逻辑资源,可能会防止推断专用硬宏,并通过推断LUT逻辑和适当的Slices触发器影响利用率和性能。因此,复位问题,如同步或异步,主动高或低,应根据数据表和相应FPGA的可配置逻辑能力来决定。

正确使用这些硬宏的复位信号将改善性能,定时和导致有更好的设备利用率。下面一节总结了FPGA中各种硬宏的reset用法。

主动高复位

Xilinx FPGA FLIP-FLOP具有有效的高控制端口SR,用于预设/清除/设置/复位功能,如下图3所示。SR端口将被推断为异步预设/清除或根据类型的同步设置/重置触发器,RTL代码描述。

[edna fpga 06]
__FIGURE 3:__ *触发器控制信号*

RTL代码中的预设/清除/设置/复位功能的有效低使用将在触发器之前需要逆变器以驱动有效的高级SR端口。这种逆变器将在影响定时,功率和设备利用率的LUT中推断出来。

如果某种方式我们无法控制外部信号的极性,它仍然使用有效低极性,然后建议在顶级层次结构中反转有效的低复位信号,然后将该信号路由到所有其他寄存器。这将推断逆变器进入IO逻辑,并且没有额外的FPGA路由或逻辑将用于剩余寄存器。

同步重置

片内所有触发器的SR控制端口是通用的。因此,不同类型的人字拖不能装在同一块蛋糕里。如图4所示,使用了三个具有不同异步控制信号的触发器,因此它们消耗了3个不同的切片。但如果使用了同步控制信号,则合成工具将同步控制信号映射到LUT中,不使用触发器控制端口。这将允许在同一片中封装不同的控制信号触发器。这可能会增加LUT利用率,但会提高片利用率。因此,最好使用同步控制信号,以有更好的片利用率。

[edna fpga 07]
图4:__ *控制集优化的SR*

SRL组件

在Xilinx FPGA中,有一个专用的SRL组件可用来推断移位寄存器功能。SRL组件使用SLICEM LUT逻辑推断移位寄存器。如果代码描述的移位寄存器与同步或异步复位,那么工具将使用触发器移位寄存器。而如果移位寄存器没有重置,那么工具将推断出片内的专用srl。因此,为了更好地利用设备,建议不要使用复位来推断硬件中的移位寄存器。

下面是使用重置编写的Verilog代码,该代码将推断触发器进行换档寄存器。

always @ (posedge Clk or posedge Rst)
开始
如果(Rst)
开始
q < = 0;
结尾
别的
开始
q < ={问6:0,Din};
结尾
结尾

分配Q1 = Q [7];

但是如果在没有复位的情况下写入代码,则如下所示,将推断专用的SRL组件。

总是@ (posedge Clk)
开始
q < ={问6:0,Din};
结尾

分配Q1 = Q [7];

内存

Xilinx FPGA提供两种类型的RAM。一个是专用块RAM,第二个是在CLB LUT中推断的分布式RAM。显式重置不能用于重置RAM的内容。因此,在编写打算推断RAM的代码时,一个应该在没有重置的情况下代码。

从代码推断的RAM类型取决于为RAM编码的读类型。如果读取是同步的,则推断BRAMs,如果读取是异步的,则推断分布式LUT ram。

下面的异步读取编码风格将推断RTL中的分布式RAM宏。

//双端口RAM,具有异步读取Verilog编码示例

模块rams_00 (clk, we, a, dpra, di, spo, dpo);
输入CLK;
输入我们;
输入[5:0] a;
输入[5:0]dpra;
输入[15:0]迪;
输出[15:0] SPO;
输出[15:0] DPO;

Reg [15:0] ram [63:0];

总是@ (posedge clk)
开始
要是我们)
开始
RAM [A] <= DI;
结尾
结尾
分配spo = ram [a];
分配DPO = RAM [DPRA];
终点

下面的编码风格与同步读取将推断块RAM宏在RTL。

//双端口RAM,同步读取(读数)
模块RAMS_01(CLK,WE,A,DPRA,DI,SPO,DPO)
输入CLK;
输入我们;
输入[5:0] a;
输入[5:0]dpra;
输入[15:0]迪;
输出[15:0] SPO;
输出[15:0] DPO;

Reg [15:0] ram [63:0];
reg [5:0] READ_A;
reg [5:0] read_dpra;

总是@ (posedge clk)
开始
要是我们)
开始
RAM [A] <= DI;
结尾
read_a < =;
read_dpra <= dpra;
结尾
赋值spo = ram[read_a];
分配DPO = RAM [READ_DPRA];
终点

Xilinx BRAM在数据输出处包含输出寄存器原语。要在BRAM中使用该寄存器,必须在BRAM中使用同步复位。否则,它将不会使用专用的输出寄存器,而使用CLB的触发器。

DSP切片

Xilinx FPGA可提供DSP48切片,以加速DSP算法和解决复杂的DSP挑战。DSP48片在控制和数据路径上都有管道寄存器,以提高设计的性能。所有这些DSP48内部寄存器都有一个同步复位。因此,如果在编码中使用异步重置,那么合成工具将不能将这些打包到DSP48块,将需要额外的CLB寄存器来实现异步重置功能。这不仅会导致设备利用率低下,还会影响性能和功率。因此,建议使用同步复位来推断DSP48片的内部寄存器,以提高性能。

结论

控制路径中的触发器应重置为将数字系统带到已知状态,而可以在没有复位的情况下为数据路径中的触发器进行复位。通常,通过反馈接收状态的所有触发器都应重置。但是,作为流水线或追随者触发器的触发器,或使用一些有效逻辑更新,不需要重置。设计中重置的最佳使用导致逻辑,定时,电源和路由提高。万博投注网址

FPGA中的重置的实施取决于供应商。因此,应基于相应的FPGA供应商数据表及其可配置逻辑功能来决定复位类型或其对硬宏的使用。这里提供的建议和指南将帮助设计人员在其设计中选择适当的重置类型和使用情况。万博投注网址

前序:在asic, fpga中重置用例

发表评论