Verilog综合原理

来源:互联网 发布:java面向对象知识总结 编辑:程序博客网 时间:2024/05/18 19:42

        逻辑综合是在标准单元库和特定的设计约束的基础上,把设计的高层次描述转换成优化的门级网表的过程。标准单元库可以包含简单的单元,例如与门、或门和或非门等基本逻辑门,或者宏单元,例如加法器、多路选择器和特殊的触发器。标准单元库也就是大家熟知的工艺库。

     逻辑综合工具并不能处理随意编写的Verilog结构描述。通常,任何采用周期到周期的RTLVerilog结构描述都能为逻辑综合工具所接受。如下列出了逻辑综合工具通常所能接受的结构列表。  

        端口  input , inout , output 
 
        参数  parameter 
 
        模块定义 module
  
        信号和变量 wire, reg , tri 允许使用矢量表示
 
        实例的调用(引用) module instance, primitive gate instance

              例如:mymux m1(out,i0,i1,s);

              nand (out, a,b ) ;
 
        函数和任务  function, task 不考虑时序结构
 
        过程 always , if , then, else, case ,casex , casez 不支持initial过程的综合

        过程块 begin, end, named blocks ,disable 命名块的禁止是允许的

        数据流 assign 不考虑延迟信息
 
        循环 for , while , forever    while和forever循环必须包含@(posedge clk)或者@(negedge clk)

    

    要记住,我们提供的是电路的周期到周期的RTL描述。因此,这些语言结构用于逻辑综合工具的方式有一些限制。例如,while和forever循环必须由@(posedge clock)或者@(negedge clock)语句终止循环,以此强制具有周期到周期的行为,避免组合反馈。另一个限制是逻辑综合忽略所有由#<delay>结构指定的时序延迟。因此,综合前后Verilog的仿真结果可能不同。设计者必须尽量减少使用这些有可能导致Verilog的前后仿真结果不一致的描述风格。此外,逻辑综合工具也不支持initial结构的转换。因而设计者必须使用复位机制来取代initial结构,进行电路信号的初始化。

      推荐明确地指定信号和变量宽度。定义未指定宽度的变量可能产生庞大的门级网表,因为综合工具可能根据变量定义生成不必要的逻辑。

       Verilog描述的风格对最终设计有很大的影响。就逻辑综合而言,重要的是考虑实际的硬件实现问题。在不牺牲高抽象层次优势的情况下,RTL描述应该尽可能地接近预期的结构。在设计抽象层次和控制逻辑综合输出结构之间存在一个折衷。在很高的抽象层次进行设计,综合工具会产生不可预料的逻辑结构。在很低的抽象层次(例如,手工调用每个单元)使设计者丧失高层次设计不依赖于工艺的优势。同时,对不同的逻辑综合工具来说,“好”的风格也会有所不同。然而,许多规则对各种逻辑综合工具是一致的。下面列出的是RTL设计中设计者应该考虑的一些设计原则。

      使用有意义的信号和变量名称。信号和变量的命名应该具有意义,以便代码自身具有清晰的注释信息,增强可读性。

      避免混合使用上升沿和下降沿触发的触发器。混合使用上升沿和下降沿触发的触发器可能在时钟树中引入反向器和缓冲器。 一般不希望出现这种情况,因为这将在电路中引入时钟偏斜。

       使用基本构造模块与使用连续赋值语句的对比。RTL描述中使用基本的构造模块和使用连续赋值语句各有优缺点。连续赋值语句是一种非常简洁的表示功能的方式,通常能生成性能很好的随机逻辑电路。然而,最终的逻辑结构并不一定是对称的。调用基本构造模块可以产生对称的设计,并且逻辑综合工具能够更高效地优化小模块。然而,调用构造模块是一种不太简洁的设计描述方式;它制约了针对变化工艺的重定向,并且通常会降低仿真器性能。

       调用多路选择器与使用if-else或者case语句的对比if-else和case语句常常被综合成硬件中的多路选择器。如果需要结构化的实现,最好直接使用多路选择器来实现模块,因为if-else或者case语句可能使综合工具产生不可预期的随机逻辑。调用多路选择器的方式更容易控制,综合速度也更快,但它存在依赖于工艺的不利因素,并且表达多路选择器的代码比较长。另一方面,if-else和case语句可以简洁地表示多路选择器,常用于建立不依赖工艺的RTL描述。

       显式地定义if-else或者case语句。在if-else或者case语句中必须说明各种可能的条件分支。否则可能产生电平敏感的锁存器,而不是多路选择器。

 设计约束指定

         若想得到最理想的设计,设计约束与高效率的HDL描述一样重要。时序、面积、功耗和环境参数,例如输入驱动强度、输出负载、输入到达时间等的精确描述对产生最优的门级网表至关重要。违反正确的约束或者忽略约束都可能导致非最优化的设计。必须小心地指定设计约束

 



原创粉丝点击