划分与编码风格

合理的设计划分和好的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. Install Docker Mac OS X

    检查 Mac OS version 要求必须是 OS X 10.6 Snow Leopard or newer to run Boot2Docker 安装 Boot2Docker 列表内容 下载地址: ...

  2. POJ 1101 The Game(BFS+判方向)

        The Game Description One morning, you wake up and think: "I am such a good programmer. Why ...

  3. jquery constructor

    function F(){ this.a = "aaa"; alert(111); } F.prototype = { constructor:F, } var f = new F ...

  4. 深入理解Java内存模型--转载

    原文地址:http://www.infoq.com/cn/articles/java-memory-model-1 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之 ...

  5. golang round

    func Round(f float64, n int) float64 {pow10_n := math.Pow10(n)return math.Trunc((f+0.5/pow10_n)*pow1 ...

  6. VUE错误记录 - 小球模拟购物车

    <body> <div id="app"> <input type="button" value="Add to Car ...

  7. Spider_reg

    # 解析 数据的分类 结构化数据 有固定的格式,如 :HTML.XML.JSON 非结构化数据 图片.音频.视频,这类数据一般都存储为二进制 # 正则表达式 re 使用流程 创建编译对象:p = re ...

  8. eclipse-12.04无图标,无法固定到侧边栏

    今天下载了adt-bundle,但是eclipse打开以后,侧边栏显示的是一个问好,而且没办法固定到侧边栏,导致每次打开eclipse都要进入到相应目录,很麻烦.我们可以通过如下方法设置eclipse ...

  9. bootstrap课程12 滚动监听如何实现(bootstrap方式和自定义方式)

    bootstrap课程12 滚动监听如何实现(bootstrap方式和自定义方式) 一.总结 一句话总结:通过监听滚动的高,判断滚动的高是否大于元素距离顶端的距离 1.如何知道屏幕滚动的高? st=$ ...

  10. Android Multiple dex files define BuildConfig

    dexOptions { preDexLibraries = false }