RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

RTL设计风格及Verilog编码规范(一)

一、同步设计

1.1 时钟的同步设计

关注问题:

(1)设计中尽可能使用单时钟和单时钟边沿触发

(2)不要使用例如“与”“或”门这些基本单元来生成RS锁存或者FF

(3)不要在组合逻辑中引入反馈电路

在HDL设计中使用同步设计思想以及逻辑综合工具。使用异步时钟会让更加精确的时序约束变得困难,因此,尽可能利用单个时钟和单边沿。(使用单个时钟在多数设计中很难实现,在设计中尽量减少时钟数量以减轻分析的复杂度)

 

尽管可以使用基本门来实现RS或FF,但时序分析工具会把它视作对组合电路的反馈,如果无法避免,则需要使用set_disable_timing设置来避免时序分析期间反馈环路的影响。

 

图片[1]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

避免在内部电路生成异步时钟(如下图),如果需要生成这样的时钟,那么推荐在生成时钟的FF输出端使用create_clock来指定时钟。

 

图片[2]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

避免反馈跨越异步复位,同样的,避免使用门控时钟和门控复位。

 

图片[3]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

二、 复位问题

 

2.1 使用异步复位作为初始的复位

关注问题:

(1)使用同步复位电路可能会导致综合器生成无法正确复位的电路,同时,同步复位会在数据路径引入复位信号(延迟让时序变得困难),在多时钟系统中可能需要计数器来保证复位信号宽度。但同步复位并不是完全没有优点,比如,保证系统是完全同步的,可以滤除掉复位信号的一些小毛刺,同步复位需要更少的触发器等等,这些问题整理详细文章讨论。

(2)使用异步复位对寄存器进行初始的复位会更加安全

(3)除了复位功能外,复位/置位的引脚不要用作它途

(4)在同一个复位线路上禁止同时使用同步复位和异步复位

(5)一个FF尽量不使用异步复位和异步置位

 

异步复位示例:

always结构仅会由时钟上升沿以及低有效的复位信号触发

always @(posedge CLK or negedge RST_X)
       if (!RST_X)
           Q <= 1'b0;
       else
           Q <= DATA;

 

请注意上面表述的是初始复位(Initial reset)推荐使用异步复位。异步复位的时序分析比较困难,因为时序路径会被切断,从而没有考虑到B的复位输入到寄存器B的输出Q的时序。同时,A的输出到B异步复位的的时序也不会被分析。

 

图片[4]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

2.2 复位问题

注意问题:

(1)不要在复位路径引入逻辑电路

例:

reg[4:0] count;
wire REN_X,EN_X,count32_x,ctl_x;

assign count32_x = ~(& count) | ctl_x;
assign REN_X = EN_X | count32_x;

always @( posedge CLK or negedge REN_X )

if(REN_X == 1'b0)
    Q <= 1'b0;
else
    Q <= D;

 

图片[5]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

当组合逻辑产生复位信号时,由于优化的原因,使能信号可能会和FF分离,并且不排除危险信号驱动复位信号的可能性(FF可能会以意外的时序复位)。如上图所示,即使在RTL描述中的FF复位信号前插入了使能逻辑,也可能会发生这种情况。并且一旦发生这种问题,很难排查。总而言之,设计电路不要总依赖综合工具的优化。

 

2.2.1 噪声,毛刺

 

复位信号不排除会被噪声干扰,产生一些毛刺,因此,推荐使用滤波,但引入滤波也不是必须的,视情况而定。下图是高有效复位的滤波电路

 

图片[6]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

如果是低有效复位?

 

图片[7]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

滤波波形原理:

 

图片[8]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

2.2.2 亚稳态问题

 

以低有效异步复位为例,如果复位信号在时钟沿释放(或附近),不满足Recovery Time以及Removal Time,会出现亚稳态,所谓复位恢复时间就是,复位释放的时间距离时钟沿(上升沿)的时间,复位移除时间就是,复位释放的时间距离时钟沿(上升沿)的时间。和数据建立时间保持时间一样,都要满足一定的时序要求。这是需要关注的问题。

 

图片[9]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

2.2.3 同步器/异步复位同步释放

 

module async_resetFFstyle2 (
   output reg rst_n,
   input clk, asyncrst_n);
   reg rff1;
always @(posedge clk or negedge asyncrst_n)
      if (!asyncrst_n) 
           {rst_n,rff1} <= 2'b0;
      else 
           {rst_n,rff1} <= {rff1,1'b1};
endmodule

 

外部的复位信号进入推荐使用异步复位同步释放,下面是代码综合出的电路图,这种设计有它的优势。

 

图片[10]-RTL设计风格及Verilog编码规范(一)-FPGA常见问题社区-FPGA CPLD-ChipDebug

 

这个系列的文章主要讲一些规范性的东西,不会详细的展开讲,后续会整理一篇关于同步复位/异步复位的详细讨论。如果文章有任何错误,欢迎大家与我讨论。

QQ交流群:327133229

 

往期推荐

学习FPGA的小Tips(一)

 

以太网IP核代码(verilog)

 

PCIe代码

 

IIC专题原理及应用篇(一)

 

IIC专题原理及应用篇(二)

 

 

请登录后发表评论

    没有回复内容