划分与编码风格

合理的设计划分和好的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芯片综合

DC综合:划分与编码风格的更多相关文章

  1. DC综合环境的一些概念

    DC综合环境的一些概念 启动文件 .synopsys_dc_setup 采用Tcl格式,包含工艺库的路径信息和其他环境变量 不同位置启动顺序 1.Synopsys安装目录 2.用户家目录 3.项目工作 ...

  2. 【翻译】Ext JS——高效的编码风格指南

    原文:ExtJS - Efficient coding style guide 作者:Raja 切勿使用"new"关键字:在Ext JS中,使用"new"关键字 ...

  3. DC综合及仿真验证和DFT测试

           综合技术是提高设计产能的一个很重要的技术,没有综合技术的发展就不可能用HDL实现电路的设计,因为HDL开始是用来供电路仿真建模使用的,到了后来才把其中一部分子集作为可综合的语言,也就是R ...

  4. Android 编码风格规范,很赞哦

    1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 1.1 术语说明 在本文 ...

  5. 学习Linux的编码风格

    对于编码,每个码农或许都会有自己的一套风格,很多人可能对编码风格压根就不关心,因为最终编译器编译出来的目标代码并不会受影响.但是在开发一个大型项目时,花费时间成本最多的永远是开发者们之间的沟通与交流. ...

  6. R 语言编码风格指南

    R 语言是一门主要用于统计计算和绘图的高级编程语言.这份 R 语言编码风格指南旨在让我们的 R代码更容易阅读.分享和检查.以下规则系与 Google 的 R 用户群体协同设计而成. 概要: R编码风格 ...

  7. Nim编码风格

    介绍 Nim语言不限制开发人员使用哪种具体的编码风格, 但为了社区的发展,在编写一些标准库的时候还是应该遵从统一的编码风格 这篇文章会列出一系列的编码风格准则,供大家参考. 但值得注意的是,有很多例外 ...

  8. 一步一步学Python(1) 基本逻辑控制举例和编码风格规范

    (1) 基本逻辑控制举例和编码风格规范 1.while死循环 2.for循环 3.if,elif,else分支判断 4.编码风格(官方建议) 版本:Python3.4 1.while死循环 #func ...

  9. 来自 Google 的 R 语言编码风格指南

    来自 Google 的 R 语言编码风格指南R 语言是一门主要用于统计计算和绘图的高级编程语言. 这份 R 语言编码风格指南旨在让我们的 R 代码更容易阅读.分享和检查. 以下规则系与 Google ...

随机推荐

  1. eclipse- MAT安装及使用

    1.安装eclipse mat插件 1)查看当前eclipse版本 进入eclipse目录:右击eclipse图标,看到安装目录/home/zhangshuli/adt-bundle-linux-x8 ...

  2. zendiscovery 的Ping机制

    ping是集群发现的基本手段,通过在网络上广播或者指定ping某些节点获取集群信息,从而可以找到集群的master加入集群.zenDiscovery实现了两种凭机制:广播与单播.本篇将详细分析一些这M ...

  3. 类名引用static变量好处

    不仅强调了变量static的结构,而且在有些情况下他还为编译器进行优化提供了更好的机会.

  4. IAR for STM8介绍、下载、安装与注册--转

    Ⅰ.写在前面 本文讲述的内容是IAR for STM8的介绍.下载.安装与注册,其安装.注册过程和IAR for ARM类似,如果需要了解IAR for ARM相关的文章,可以到我博客,或微信公众号查 ...

  5. Error: org.apache.mahout.math.CardinalityException: Required cardinality 10 but got 30问题解决办法

    问题详情 在运行mahout中kmeans算法时,采取的是其默认输入路径/user/hadoop/testdata 和 默认输出路径/user/hadoop/output. [hadoop@djt00 ...

  6. Eclipse中自动添加注释

    方法一:Eclipse中设置在创建新类时自动生成注释  windows-->preference  Java-->Code Style-->Code Templates  code- ...

  7. php基础篇之一

    1.PHP是什么 官方文档:超文本预处理器 2.PHP能够做一些什么? PHP主要应用在一下领域: (1)服务器端脚本,需要:PHP解析器,PHP服务器,PHP浏览器. (2)命令行脚本,只需要PHP ...

  8. CISP/CISA 每日一题 14

    CISA 每日一题(答) 自动无人值守运行(LIGHTS-OUT)优势:1.信息系统运行成本的遏制/减少:2.持续运行(24/7):3.减少系统错误和中断次数. I/O 控制人员负责保证:1.批处理信 ...

  9. 20160218.CCPP体系具体解释(0028天)

    程序片段(01):加法.c 内容概要:字符串计算表达式 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <st ...

  10. Apple Watch 集成环信SDK

    本文简单的讲述下怎样用Apple Watch Kit集成环信SDK. 升级xcode到version 6.2,和 IOS SDK8.2 下载环信SDK从官网 打开XCode->new proje ...