【DC】逻辑综合实战

DC实战

  • 0. 学习目标
  • 1. Design
    • 1.1 Design Schematic
    • 1.2 Design Specification
  • 2. 配置文件和约束文件
    • 2.1 配置文件
      • (1) common_setup.tcl 文件
      • (2) dc_setup.tcl 文件
      • (3) .synopsys_dc.setup 文件
    • 2.3 启动工具查看单元库信息
      • (1) 查看目标库的时间单位
    • 2.3 设计约束文件
      • (1) 时钟约束
      • (2) 输入输出路径时序约束
      • (3) 组合逻辑约束
      • (4) 工作条件约束
      • (5) 语法检查
  • 3. 逻辑综合
    • 3.1 启动工具并检查信息
    • 3.2 综合
    • 3.3 脚本文件

官方 Lab_workshop 里面的实例(Lab 3 & Lab4)。

重点是时序约束文件的编写。

0. 学习目标

在这里插入图片描述

1. Design

1.1 Design Schematic

在这里插入图片描述

1.2 Design Specification

在这里插入图片描述

在这里插入图片描述

2. 配置文件和约束文件

官方给出 lab 的文件内容如下:
在这里插入图片描述
这里,可以自己先创建两个文件夹,如下所示:
在这里插入图片描述
① 和 ④ 主要存放的是综合前后的文件,比如读入设计文件之后,可以以 .ddc 格式保存在unmapped文件夹中。对于综合完成之后设计,可以以 .ddc 格式保存在 mapped 文件夹中。 .ddc 是DC工具内置的一种数据格式。

2.1 配置文件

lab中写好的两个文件:

(1) common_setup.tcl 文件

在这里插入图片描述

① .sdb 结尾的库文件是符号库。

(2) dc_setup.tcl 文件

在这里插入图片描述

(3) .synopsys_dc.setup 文件

该文件需要放在DC的启动目录下。

基于lab提供的文件,自己简单配置一下该文件的内容,具体如下:

在这里插入图片描述

2.3 启动工具查看单元库信息

使用如下命令启动工具:

$ dc_shell -topo | tee -i lab3.log

| tee -i lab3.log 会把工具运行过程输出在中,终端显示的全部内容保存到文件中

在这里插入图片描述

(1) 查看目标库的时间单位

一般情况下,在读入设计文件的时候,链接库和目标库才会被读入到DC的内存中。

① 这里,为了查看时间单位,就手动读入库文件,使用到的命令如下:

dc_shell -topo> read_db <target_library_FILE_NAEM> 

这里使用的是 LIBRARY FILE NAME

结果如下:
在这里插入图片描述

② 然后,使用lsit_libs可以查看读取到的库文件信息:

在这里插入图片描述
这里,一个是库名称,一个是库文件的名称。

③ 使用如下命令,报告库的信息:

redirect -file lib.rpt {report_lib <LIBRARY_NAME>}
  1. 这里使用的是 LIBRARY NAME
  2. redirect 是重定向的命令,-file 是将命令产生信息保存到文件中,lib.rpt 是要保存信息到文件,后面的{}中存放的是要执行的命令。

lib.rpt中的部分信息如下:

在这里插入图片描述
可以看出,时间单位是 1ns

线负载模型信息:
在这里插入图片描述
在这里插入图片描述
延时计算时候的一些信息:
在这里插入图片描述
除此之外,还有其他各种信息,这里就不再具体给出了。

2.3 设计约束文件

根据设计的Specification,编写综合时要用的约束文件。

(1) 时钟约束

在这里插入图片描述
① 时钟频率为 333.33 Mhz,对应的时钟周期就是 3ns

create_clcok -period 3.0 [get_ports clk]

② source_latency(时钟源到时钟定义位置的延迟) 的最大值为 700ps

set_clock_latency -source -max 0.7 [get_porst clk]

③ network_latency (时钟定义位置到触发器时钟输入端的延迟) 最大值为300ps

set_clock_latency -max 0.7 [get_porst clk]

④ clock skew = +/- 30ps,clock jitter = +/- 40ns,setup time slack = 50ns

在这里插入图片描述

时钟源沿着不同的路径到达寄存器的时钟端口,skew 和 jitter 就是说是时钟的真正的到达时间可能比预期早或者晚。

首先,skew为 ±30 ps,那么就可能是发射时钟滞后30ps,捕获时钟提前30ps,那么对于建立时间而言,时钟的不确定性就是60ns。(就是说,时钟周期减去60ns之后的,然后才进行时序约束,才能满足上述情况。)
然后, jitter 为 ±40ps。发射沿和捕获沿的时钟抖动是互相不影响的,这里没有加倍。对于建立时间而言,考虑的是最查的情况,及提前 40 ps。
最后,再加上 50 ps 的建立时间裕量。

最终得到的时钟不确定性约束为:

set_clock_uncertainty -setup 0.15 [get_clocks clk]

⑤ 时钟的转换时间为120ns

set_clock_transition 0.3 [get_clocks clk]

(2) 输入输出路径时序约束

在这里插入图片描述
在这里插入图片描述

① data1和data2外部延时的计算

这里直接给出了输入到寄存的组合路径的延时,但是DC是通过输入延时来对这一部分路径进行约束的,所以要自己计算外部输出延时。
在这里插入图片描述

set_input_delay -max 0.45 -clock clk [get_ports data*]

② sel端口的外部延时

数据到达的最晚绝对时间是 1.4ns,就是说这个延时包含了时钟的 latency (source 和 network两部分,所以是700ps+300ps = 1ns)。

而 输入端口约束命令用的是相对延时,所以最终的约束如下:

set_input_delay -max 0.4 -clock clk [get_ports sel]

③ out1约束
这里是直接给除了外部延时为:420ps + 80ps = 0.5ns

set_output_delay -max 0.5 -clock clk [get_ports out1]

④ out2约束
给出的是out2内部组合逻辑的最大延时为810ns,那么外部延时的计算方式如下:
外部延时 = 时钟周期 - 内部路径延时 - 时钟不确定性 = 3 - 0.81 -0.15 = 2.04ns

set_output_delay -max 2.04 -clock clk [get_ports out2]

⑤ out3约束
out3只需要满足外部的一个400ns的建立时间即可,所以其约束如下:

set_output_delay -max 0.4 -clock clk [get_ports out3]

(3) 组合逻辑约束

在这里插入图片描述

组合路径的约束也可以通过set_input_delay set_output_delay 来实现。

输入延时和输出延时的总和 = 3 - 2.45 - 0.15 = 0.4 ns
0.4 ns 分配个输入和输出就会有各种不同的组合,选取其中一种即可,后续可以分局综合的结果进行调整。

set_output_delay -max 0.3 -clock clk [get_ports Cin*]
set_output_delay -max 0.1 -clock clk [get_ports Cout]

(4) 工作条件约束

在这里插入图片描述

① 输入驱动强度

使用库里面的 bufbd1 来驱动除了 clk 和 Cin* 之外的所有输入端口:

set_driving_cell -lib_cell bufbd1 -library cb13fs120_tsmc_max \ 
				 [remove_from_collection [all_inputs] [get_ports "clk Cin*"]]

对于 Cin* 端口,指定了一个最大转换时间作为约束条件:

set_input_transition 0.12 [get_ports Cin*]

② 输出负载

set_load [expr 2 * {[load_of cb13fs120_tsmc_max/bufbd7/I]}] [get_ports out*]
set_load 0.025 [get_ports Cout*]

(5) 语法检查

最终得到的时序约束文件如下:

在这里插入图片描述
在这里插入图片描述

完成设计约束文件之后,可以进行语法检查,没有错误的情况下,显示如下:
在这里插入图片描述
如果出错,就会给出提示:
在这里插入图片描述

3. 逻辑综合

3.1 启动工具并检查信息

使用如下命令启动工具:

 dc_shell -topo | tee -i lab3.log

(输出在终端的内容都会被记录到文件中,退出后再次启动会清除文件中原来的内容,然后写入新的内容。使用 -a 选项是在原来文件内容后面追加新的内容。这个主要是 tee 命令的功能,和逻辑综合工具关系不大。)

检查设置的库文件和路径
在这里插入图片描述

3.2 综合

读入设计:
在这里插入图片描述

连接和查看设计:

在这里插入图片描述

后面就是读取约束文件,编译和保存一些输出文件等内容。

3.3 脚本文件

综合的过程可以写到一个脚本文件中如下:

在这里插入图片描述
这里需要说明的是,因为是在拓扑模式下启动的,涉及到物理信息的读取,编译命令只能使用 compile_ultra

lab中给出的另一个脚本示例,这里主要涉及的是及进行综合前的一些操纵。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/88174.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(三)行为模式:4、迭代器模式(Iterator Pattern)(C++示例)

目录 1、迭代器模式&#xff08;Iterator Pattern&#xff09;含义 2、迭代器模式的UML图学习 3、迭代器模式的应用场景 4、迭代器模式的优缺点 &#xff08;1&#xff09;优点 &#xff08;2&#xff09;缺点 5、C实现迭代器模式的实例 1、迭代器模式&#xff08;Itera…

S7-300 PLC 模拟量采集(从硬件组态到软件FC编写)

S7-300PLC属于退市产品,很多老的生产线仍然沿用,所以这篇博客我们一步步介绍如何从硬件组态到软件FC的编写,首先我们组态模拟量模块。 1、硬件组态 组态好硬件后,我们开始设计软件FC,模拟量采集往往都会有很多回路,下面我们介绍如何在STEP7中创建模拟量采集FC,S_ITR,有关…

C++ IO流

文章目录 一.C语言的输入与输出二.流是什么三.CIO流1.C标准IO流2.C文件IO流&#xff08;1&#xff09;文件操作步骤&#xff08;2&#xff09;以二进制的形式操作文件&#xff08;3&#xff09;以文本的形式操作文件&#xff08;4&#xff09;使用>>和<<对文件进行…

【LeetCode-中等题】560. 和为 K 的子数组

题目 题解一&#xff1a;逆序枚举数组 //方法一:枚举数组&#xff08;顺序&#xff09;int count 0;// 记录最终符合条件的数组个数int n nums.length;for(int end 0; end<n ; end){int sum 0;//记录每一次经过的元素总和for(int start end; start>0;start--){sum n…

RabbitMQ介绍

RabbitMQ的概念 RabbitMQ 是一个消息中间件&#xff1a;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递员最终会把你的快递送到收件人那里&#xff0c;按照这种逻辑 RabbitMQ 是 一个快递…

测试框架pytest教程(8)失败重试-pytest-rerunfailures

pytest-rerunfailures是一个pytest插件&#xff0c;用于重新运行失败的测试用例。当测试用例在第一次运行时失败&#xff0c;该插件会自动重新运行指定次数的失败用例&#xff0c;以提高稳定性和减少偶发性错误的影响。 要使用pytest-rerunfailures插件&#xff0c;需要按照以…

[Makefile] 预宏定义的使用

main.c 文件如下&#xff1a; #include <stdio.h> int main() {printf("soft infomation\n");//以下信息均在gcc时已预定义printf("soft_ver:\t%s\n",__VER__);printf("author:\t\t%s\n",__AUTHOR__);printf("sn_num:\t\t%d\n"…

基于Googlenet深度学习网络的交通工具种类识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ....................................................................................% 获…

OpenCV基础知识(5)— 几何变换

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。OpenCV中的几何变换是指改变图像的几何结构&#xff0c;例如大小、角度和形状等&#xff0c;让图像呈现出缩放、翻转、旋转和透视效果。这些几何变换操作都涉及复杂、精密的计算。OpenCV将这些计算过程都封装成了非常灵活的…

嵌入式Linux开发实操(十一):ETH网络接口开发

# 前言 嵌入式linux也有些是支持网口的,比如RGMII,嵌入式系统资源支持以太网和其他基本接口的硬件平台(板上或片上系统),有充足的NOR或NAND Flash闪存,用于容纳OS、lib库、fileSystem文件系统、APP应用程序、Bootloader引导程序等。嵌入式Linux是开源的、可修改的,并且…

go语言中channel类型

目录 一、什么是channel 二、为什么要有channel 三、channel操作使用 初始化 操作 单向channel 双向channel&#xff0c;可读可写 四、close下什么场景会出现panic 五、总结 一、什么是channel Channels are a typed conduit through which you can send and receive …

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测

回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测 目录 回归预测 | MATLAB实现DBN-ELM深度置信网络结合极限学习机多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现DBN-ELM深度置信网络结合极限学习…

Redis 分布式锁存在什么问题 ?如何解决 ?

目录 1. 如何实现分布式锁 2. Redis 分布式锁存在什么问题 2.1 解决死锁问题 2.2 解决锁误删问题 1. 如何实现分布式锁 Redis 天生就可以作为一个分布式系统来使用&#xff0c;所以它实现的锁都是分布式锁。 Redis 可以通过 setnx&#xff08;set if not exists&#xff09…

c语言实现队列

文章目录 前言一、队列的特征二、队列的实现1、队列的设计2、队列的初始化3、元素的入队和出队4、返回队头的数据和队尾的数据5、返回队列的长度6、队列的销毁 三、循环队列四、队列和栈综合练习 前言 栈的特点是元素后进先出(Last In First Out)&#xff0c;而对应的还有一种…

Android GreenDao数据库升级(附Demo)

前言 大家好久不见&#xff0c;一转眼马上八月份下旬了&#xff0c;最近由于工作比较忙&#xff0c;没时间给大家更新博文。百忙之中抽出时间&#xff0c;给大家来更新一篇关于GreenDao3数据库的升级。 关于GreenDao的详细介绍以及一些逻辑性的增、删、改、查等&#xff0c;可以…

3:Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano(ARM)

1.Ubuntu Qt 配置交叉编译环境 1.1 ubuntu 20.04安装Qt sudo apt-get install qtcreator 1.2 配置QT GCC配置同上 最后配置Kits 上面设置完成之后 &#xff0c;设置Kits 中的Device(这是为了能够直接把项目部署到arm设备上) 点击NEXT之后会出现连接被拒绝&#xff0c;不用担…

ARM-汇编指令

一&#xff0c;map.lds文件 链接脚本文件 作用&#xff1a;给编译器进行使用&#xff0c;告诉编译器各个段&#xff0c;如何进行分布 /*输出格式&#xff1a;32位可执行程序&#xff0c;小端对齐*/ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm",…

React原理 - React Virtual DOM 原理

目录 扩展学习资料 Virtual DOM 是什么【虚拟dom】 React渲染 Virtual DOM VS 原生DOM【vDom是否比原生Dom更高效】 Virtual DOM数据结构 Virtaual DOM Diff【虚拟dom前后比对&#xff0c;更新不同dom的算法】 源码解读 react源码组织方式&#xff1a; React Stack Rec…

YOLOv5基础知识入门(7)— NMS(非极大值抑制)原理解析

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。NMS是指非极大值抑制&#xff08;non maximum suppression&#xff09;&#xff0c;它是一种常用于物体检测任务的算法。在物体检测中&#xff0c;通常会有多个预测框&#xff08;bounding box&#xff09;被提议出来&…

开始MySQL探索——数据库概述

计算机语言 计算机语言概述 计算机语言&#xff08;Computer Language&#xff09;可以简单的理解为一种计算机和人都能识别的语言。 机器语言 汇编语言 高级语言 机器语言 汇编语言 高级语言 SQL语言基础 SQL的概述 SQL全称&#xff1a;Structured Query Language&…