zoukankan      html  css  js  c++  java
  • DC综合:划分与编码风格

    划分与编码风格

    合理的设计划分和好的HDL编码风格对成功的综合影响很大。

    逻辑划分是成功综合(和布局布线,如果布图是层次化的)的关键。

    综合划分


    “分而治之”
    把复杂的设计化简为更简单的和易处理的模块。

    1.相关组合逻辑保持在同一个模块中。

    2.为设计复用进行划分。

    3.根据功能分割模块。

    4.结构模块与随机模块分离。

    5.合理限制模块的大小。

    6.划分顶层(I/O压焊块、边界扫描和核心逻辑相分离)。

    7.不要在顶层添加粘合逻辑。

    8.将状态机从其他逻辑中分离出来。

    9.避免一个模块有多个时钟。

    10.分离用于同步多个时钟的模块。

    11.划分时,考虑布图风格。

    在设计层次已经由先前编写的HDL代码确定后,group和ungroup命令给设计者提供了在DC中划分的能力。

    RTL


    设计的RTL描述通过从一个寄存器到另一个寄存器的逻辑变换和传输来描述设计。逻辑值被存储在寄存器中,通过一些组合逻辑对其求值,随后将结果存储与下一个寄存器中。

    编码原则


    一、工艺无关

    HDL代码应采用与工艺无关的方式编码。库中门的硬编码实例应当最小化。优先选择的是推断而不是例化。代码可重用。

    二、时钟相关逻辑

    1.包括门控时钟逻辑的时钟逻辑和复位生成应当保持在一个模块内--综合一次并且不再涉及了。

    2.避免每个模块有多个时钟--尽量保持每个模块有一个时钟。

    3.应该给时钟赋以有意义的名称。建议保持时钟名以反映其功能和频率。

    4.对于DFT扫描插入,要求从原始输入控制时钟。

    三、顶层没有粘合逻辑

    四、模块名与文件名一致

    不要在文件中描述多个模块或实体,一个文件应只包含一个面向综合的模块/实体定义。

    五、压焊块同核心逻辑分离

    将顶层划分为“压焊块”和“核心”两个单独的模块。

    六、最小化不必要的层次

    七、寄存所有输出

    八、FSM综合

    1.状态名应使用VHDL中的“枚举类型”或Verilog中的“参数”来描述。

    2.计算一下状态的组合逻辑应在状态寄存器独立的process或always块中。

    3.用case语句实现下一个状态组合逻辑电路。

    逻辑推断


    一、不完全敏感信号列表

    不完全敏感信号列表会导致RTL和综合逻辑间的仿真不匹配。

    二、存储元件推断

    有两种类型的存储元件--锁存器和触发器。
    锁存器为电平敏感存储元件,而触发器通常为边沿敏感。

    锁存器推断

    当条件语句没有完全指定时就会推断出锁存器。

    缺少else部分的if语句

    always@(weekend)
    begin 
      if(weekend)
         action = go_to_beach; 
    end
    

    不完整的case语句

    `define sunny 2'b00
    `define snowy 2'b01
    `define windy 2'b10
    
    wire  [1:0]  weather;
    
    case(weather)
        sunny : action = go_motorcycling;
        snowy : action = go_skiing;
        windy : action = go_paragliding;
    

    上述语句只覆盖了weather中的3个值,应如下(包括default):

    `define sunny 2'b00
    `define snowy 2'b01
    `define windy 2'b10
    
    wire  [1:0]  weather;
    
    case(weather)
        sunny   : action = go_motorcycling;
        snowy   : action = go_skiing;
        windy   : action = go_paragliding;
        default : action = go_paragliding;
    

    寄存器推断

    当在always块的敏感信号表中指定一个边沿,就会推断一个寄存器。
    为在always块中赋值的每个变量都推断一个寄存器,所有不直接依赖时钟沿的变量赋值应该在单独的、其敏感信号表不含边沿指定的always块中进行。

    异步复位

    always@(posedge clk,negedge reset)
    begin
      if(reset)
        reg_out <= 1'b0;
      else
        reg_out <= data;
    end
    
    always@(posedge clk)
    begin
      if(reset)
        reg_out <= 1'b0;
      else
        reg_out <= data;
    end
    

    三、多路选择器推断

    通常,if语句用于推断锁存器和优先编码器,而case语句用于实现多路选择器。推荐只使用case语句来推断多路选择器,if语句可用于推断锁存器和优先编码器。

    四、三态推断

    当高阻(Z)赋给输出时,推断出三态逻辑。
    通常不提倡随意使用三态,原因如下:

    1.三态逻辑降低可测性。

    2.三态逻辑难以被优化,因为它不能被缓冲。

    然而,三态逻辑也有其优势,就是能显著节省面积。

    assign  tri_out = enable ? tri_in : 1'bz;
    

    顺序相关


    阻塞与非阻塞

    当进行顺序赋值如几个互斥的数据传输的流水线操作和建模时,使用非阻塞赋值语句是重要的。因为最终结果依赖于赋值计算顺序,所以在顺序进程中使用阻塞赋值语句可引起竞争条件。非阻塞赋值是顺序无关的,因此它们同硬件的行为紧密相符。

    参考资料


    [1]. 高级ASIC芯片综合

  • 相关阅读:
    spring自动装配的歧义性
    spring装配bean
    spring面向切面编程理解
    spring入门实现打印Hello Spring!
    spring依赖注入的理解
    java中数组和集合的区别
    java中final关键字的作用
    什么是视图?
    什么是事务?
    sql多表查询的总结
  • 原文地址:https://www.cnblogs.com/OneFri/p/6692094.html
Copyright © 2011-2022 走看看