划分与编码风格

合理的设计划分和好的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. 怎样使用 OneAPM 监控微软 Azure Cloud Service ?

    不知不觉微软 Azure 已经进入中国市场近两年的时间.那么 Azure 平台的性能到底怎样?资源载入的延迟.虚拟机的稳定性等问题是否切实满足客户期许.这些都是大家对微软 Azure 这个国外的云服务 ...

  2. start_kernel----lcokdep_init

    void lockdep_init(void) { int i; /* * Some architectures have their own start_kernel() * code which ...

  3. android-EditText 更改外边框无效

    修改的代码如下 <com.android.mms.ui.EnhanceEditText android:textColor="#000000" <!--问题处在这里,a ...

  4. ASP.NET MVC使用Ninject

    Ninject是一个快如闪电的,轻量级的.....依赖注入框架,呃呃呃,貌似很少用到,Ninject就是一个DI容器,作用是对ASP.NET MVC程序中的组件进行解耦 ,说到解耦其实也有其他的方式可 ...

  5. 父子margin塌陷

    1.使用padding 2.给父级使用border 3.给父级添加属性 overflow:hidden 4.浮动 5.定位{absolute,fixed} 6.伪元素代码 .parent:before ...

  6. 设计模式六大原则(三):依赖倒置原则(Dependence Inversion Principle)

    依赖倒置原则(DIP)定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来: 类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码 ...

  7. 初识ThreadLocal

    近期公司在进行Java开发者的招聘活动,当中有一道面试题是这种:"请简单描写叙述一下ThreadLocal类的作用." 结果发现有非常多的面试者没有听说过ThreadLocal或者 ...

  8. spring 通过编程来获取属性文件

    配置可以读取属性: <beans profile="dev"> <context:property-placeholder ignore-resource-not ...

  9. Windows下编译OpenSSL(使用VS2013)

    简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...

  10. HttpClient FormUrlEncodedContent System.UriFormatException: 无效的 URI: URI 字符串太长问题解决方案

    1.问题描述: HttpClint 使用FormUrlEncodedContent 调用接口时 报错 System.UriFormatException: 无效的 URI: URI 字符串太长: 2. ...