Design Compiler工具学习笔记(7)

news2025/7/20 6:01:57



目录

引言

背景知识

多时钟设计

DC 输出文件分析

实际操作

设计源码

综合脚本

综合网表

SDF文件

SDC文件

REPORT文件







引言

本篇继续学习 DC的基本使用。本篇主要学习 DC 综合之后的效果分析,多同步时钟设计以及 DC 综合完成之后的各种输出文件。

前文链接:

Design Compiler工具学习笔记(1)

Design Compiler工具学习笔记(2)

Design Compiler工具学习笔记(3)

Design Compiler工具学习笔记(4)

Design Compiler工具学习笔记(5)

Design Compiler工具学习笔记(6)



背景知识

多时钟设计

多周期约束时,对应的设计代码也需要修改。比如使能信号、数据有效信号需要延迟相应的时间。 

DC 输出文件分析

 



 



实际操作

设计源码

简单的设计文件:做一个9级延迟的寄存器链。源代码:


module MY_DESIGN 
(
  input I_CLK_100M,
  input I_RSTN_100M,

  input I_DATA,
  input I_VAL,

  output O_DATA
  );

reg [9:0] R_I_DATA;
genvar GV_I;
generate
  for(GV_I = 0;GV_I < 10;GV_I = GV_I + 1)
  begin
    always @ (posedge I_CLK_100M)
    begin
        if(~I_RSTN_100M)
        begin
          R_I_DATA[GV_I] <= 0;
        end
        else if(GV_I == 0)
        begin
          R_I_DATA[GV_I] <= I_DATA & I_VAL;
        end
        else
        begin
          R_I_DATA[GV_I] <= R_I_DATA[GV_I-1];
        end
    end
  end
endgenerate

assign O_DATA = R_I_DATA[9];

endmodule





综合脚本

# |===========================================================
# | Author 		: Xu Y. B.
# | Date   		: 2022-11-21
# | Description : tcl script for top design 
# |===========================================================


# |===========================================================
# |STEP 1: Read & elaborate the RTL design file list & check
# |===========================================================
set TOP_MODULE MY_DESIGN
analyze        -format verilog [list MY_DESIGN.v]
elaborate      $TOP_MODULE     -architecture verilog
current_design $TOP_MODULE

if {[link] == 0} {
	echo "Your Link has errors !";
	exit;
}

if {[check_design] == 0} {
	echo "Your check design has errors !";
	exit;
}

# |===========================================================
# |STEP 2: reset design
# |===========================================================
reset_design


# |===========================================================
# |STEP 3: Write unmapped ddc file
# |===========================================================
uniquify
set uniquify_naming_style "%s_%d"
write -f ddc -hierarchy -output ${UNMAPPED_PATH}/${TOP_MODULE}.ddc


# |===========================================================
# |STEP 4: define clocks
# |===========================================================
# -------------------------- CLK 100MHz ----------------------
set       CLK_NAME          	I_CLK_100M
set       CLK_PERIOD        	10
set       CLK_SKEW	        	[expr {$CLK_PERIOD*0.05}]						
set       CLK_TRANS         	[expr {$CLK_PERIOD*0.01}]						
set       CLK_SRC_LATENCY   	[expr {$CLK_PERIOD*0.1 }]						
set       CLK_LATENCY       	[expr {$CLK_PERIOD*0.1 }]						

create_clock 			-period 	$CLK_PERIOD  	  [get_ports $CLK_NAME]
set_ideal_network 						 			  [get_ports $CLK_NAME]
set_dont_touch_network 					 			  [get_ports $CLK_NAME]
set_drive 				0 							  [get_ports $CLK_NAME]

set_clock_uncertainty   -setup       $CLK_SKEW        [get_clocks $CLK_NAME]
set_clock_transition    -max         $CLK_TRANS       [get_clocks $CLK_NAME]
set_clock_latency       -source -max $CLK_SRC_LATENCY [get_clocks $CLK_NAME]
set_clock_latency       -max         $CLK_LATENCY     [get_clocks $CLK_NAME]

# --------------------------- CLK 50MHz ----------------------
# set       CLK_NAME_2          	I_CLK_50M
# set       CLK_PERIOD_2        	20
# set       CLK_SKEW_2	        [expr {$CLK_PERIOD_2*0.05}]						
# set       CLK_TRANS_2         	[expr {$CLK_PERIOD_2*0.01}]						
# set       CLK_SRC_LATENCY_2   	[expr {$CLK_PERIOD_2*0.1 }]						
# set       CLK_LATENCY_2       	[expr {$CLK_PERIOD_2*0.1 }]						

# create_clock 			-period 	$CLK_PERIOD_2  	  [get_ports $CLK_NAME_2]
# set_ideal_network 						 			  [get_ports $CLK_NAME_2]
# set_dont_touch_network 					 			  [get_ports $CLK_NAME_2]
# set_drive 				0 							  [get_ports $CLK_NAME_2]

# set_clock_uncertainty   -setup       $CLK_SKEW_2        [get_clocks $CLK_NAME_2]
# set_clock_transition    -max         $CLK_TRANS_2       [get_clocks $CLK_NAME_2]
# set_clock_latency       -source -max $CLK_SRC_LATENCY_2 [get_clocks $CLK_NAME_2]
# set_clock_latency       -max         $CLK_LATENCY_2     [get_clocks $CLK_NAME_2]


# |===========================================================
# |STEP 5: define reset
# |===========================================================
# ------------------------- RST 1 ----------------------------
set RST_NAME 					I_RSTN_100M
set_ideal_network 				[get_ports $RST_NAME]
set_dont_touch_network          [get_ports $RST_NAME]
set_drive             0         [get_ports $RST_NAME]

# # ------------------------- RST 2 ----------------------------
# set RST_NAME_2 					I_RSTN_50M
# set_ideal_network 				[get_ports $RST_NAME_2]
# set_dont_touch_network          [get_ports $RST_NAME_2]
# set_drive             0         [get_ports $RST_NAME_2]


# |===========================================================
# |STEP 6: set input delay using timing budget
# |Assume a weak cell to drive the input pins
# |===========================================================
set 		LIB_NAME 			typical
set 		WIRE_LOAD_MODEL 	smic18_wl10


set 		DRIVE_PIN 			Y
set 		OPERATE_CONDITION   typical

set 		ALL_INPUT_EXCEPT_CLK [remove_from_collection [all_inputs] [get_ports "$CLK_NAME"]]
set         INPUT_DELAY 		 [expr {$CLK_PERIOD*0.6}]

set_input_delay  $INPUT_DELAY -clock         $CLK_NAME         $ALL_INPUT_EXCEPT_CLK
set_driving_cell -lib_cell    ${DRIVE_CELL}  -pin ${DRIVE_PIN} $ALL_INPUT_EXCEPT_CLK



# |===========================================================
# |STEP 7: set output delay 
# |===========================================================
set OUTPUT_DELAY  [expr {$CLK_PERIOD*0.6}]
set MAX_LOAD      [expr {[load_of $LIB_NAME/INVX4/A] * 10}]

set_output_delay  $OUTPUT_DELAY -clock $CLK_NAME 	 [all_outputs]
set_load 		  [expr {$MAX_LOAD * 3}] 			 [all_outputs]
set_isolate_ports -type buffer 					 	 [all_outputs]


# |===========================================================
# |STEP 8: set max delay for comb logic 
# |===========================================================
# set_input_delay  [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports I_1]
# set_output_delay [expr $CLK_PERIOD * 0.1] -clock $CLK_NAME -add_delay [get_ports O_1]


# |===========================================================
# |STEP 9: set operating condition & wire load model 
# |===========================================================
set_operating_conditions -max 			$OPERATE_CONDITION \
						 -max_library 	$LIB_NAME

set 					 auto_wire_load_selection false
set_wire_load_mode  	 top
set_wire_load_model		 -name    $WIRE_LOAD_MODEL \
						 -library $LIB_NAME


# |===========================================================
# |STEP 10: set area constraint (Let DC try its best) 
# |===========================================================
set_max_area			 1000


# |===========================================================
# |STEP 11: set DRC constraint 
# |===========================================================
# set MAX_CAPACITANCE [expr {[load_of $LIB_NAME/NAND4X2/Y] * 5}]
# set_max_capacitance $MAX_CAPACITANCE $ALL_INPUT_EXCEPT_CLK


# |===========================================================
# |STEP 12: set group path
# |Avoid getting stack on one path
# |===========================================================
group_path -name $CLK_NAME -weight 5 				\
						   -critical_range  [expr {$CLK_PERIOD * 0.1}] 

group_path -name INPUTS    -from [all_inputs] 		\
					 	   -critical_range  [expr {$CLK_PERIOD * 0.1}] 

group_path -name OUTPUTS   -to [all_outputs] 		\
						   -critical_range  [expr {$CLK_PERIOD * 0.1}] 

group_path -name COMBS     -from [all_inputs] 		\
						   -to [all_outputs] 		\
						   -critical_range  [expr {$CLK_PERIOD * 0.1}] 	
report_path_group


# |===========================================================
# |STEP 13: Elimate the multiple-port inter-connect &
# |			define name style
# |===========================================================
# set_app_var 						verilogout_no_tri 					true
# set_app_var						verilogout_show_unconnected_pins 	true
# set_app_var						bus_naming_style					{%s[%d]}
# simplify_constants 				-boundary_optimization
# set_boundary_optimization 		[current_design] 					true
# set_fix_multiple_port_nets 		-all 								-buffer_constants


# |===========================================================
# |STEP 14: timing exception define
# |===========================================================
# set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]
# set ALL_CLKS [all_clocks]
# foreach_in_collection CUR_CLK $ALL_CLKS 
# {
# 	set OTHER_CLKS [remove_from_collection [all_clocks] $CUR_CLK]
# 	set_false_path -from $CUR_CLK $OTHER_CLKS
# }

# set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]
# set_false_path -from [get_clocks I_CLK_100M] -to [get_clocks I_CLK_100M]

# set_disable_timing TOP/U1 -from a -to y
# set_case_analysis 0 [get_ports sel_i]

# set_multicycle_path -setup 6 -from FFA/CP -through ADD/out -to FFB/D
# set_multicycle_path -hold 5 -from FFA/CP -through ADD/out -to FFB/D
# set_multicycle_path -setup 2 -to FFB/D
# set_multicycle_path -hold 1 -to FFB/D



# |===========================================================
# |STEP 15: compile flow
# |===========================================================
# ungroup -flatten -all

# 1st-pass compile
# compile -map_effort high -area_effort high
# compile -map_effort high -area_effort high -boundary_optimization
compile -map_effort high  -area_effort high

# simplify_constants -boundary_optimization
# set_fix_multiple_port_nets -all -buffer_constants

# compile -map_effort high -area_effort high -incremental_mapping -scan

# 2nd-pass compile
# compile -map_effort high -area_effort high -incremental_mapping -boundary_optimization
# compile_ultra -incr


# |===========================================================
# |STEP 16: write post-process files
# |===========================================================
change_names -rules verilog -hierarchy
remove-unconnected_ports [get_cells -hier *] -blast_buses
# Write the mapped files
write -f ddc -output $MAPPED_PATH/${TOP_MODULE}.ddc
write 	-f verilog 	-hierarchy -output 	$MAPPED_PATH/${TOP_MODULE}.v
write_sdc -version 	1.7 				$MAPPED_PATH/${TOP_MODULE}.sdc
write_sdf -version 	2.1 				$MAPPED_PATH/${TOP_MODULE}.sdf

# |===========================================================
# |STEP 17: generate report files
# |===========================================================
# Get report file
redirect   -tee     -file     ${REPORT_PATH}/check_design.txt 			{check_design}
redirect   -tee     -file     ${REPORT_PATH}/check_timing.txt 			{check_timing}
redirect   -tee     -file     ${REPORT_PATH}/report_constraint.txt 		{report_constraint -all_violators}
redirect   -tee     -file     ${REPORT_PATH}/check_setup.txt 			{report_timing -delay_type max}
redirect   -tee     -file     ${REPORT_PATH}/check_hold.txt 			{report_timing -delay_type min}
redirect   -tee     -file     ${REPORT_PATH}/report_area.txt 			{report_area}

综合网表

打开映射后的 .v 文件:

编译时可以加上 -scan 选项,观察寄存器映射的差别:

SDF文件

里面包含了单元的延迟信息。

SDC文件

里面包含了该设计的所有约束

REPORT文件

可以分别打开进行分析,包括时间、面积等。此处就不一一展开。

 



至此 DC 的视频学习告一段落,了解了基本的使用技巧。但是功夫还需要磨练,多结合工程进行实践是必不可缺的环节。继续加油~~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序开发基础(03视图与逻辑)

学习目标 能够知道如何实现页面之间的导航跳转 能够知道如何实现下拉刷新效果 能够知道如何实现上拉加载更多效果 能够知道小程序中常用的生命周期函数 页面导航 1. 什么是页面导航 页面导航指的是页面之间的相互跳转。例如&#xff0c;浏览器中实现页面导航的方式有如下两…

关于环境保护html网页设计完整版,5个以环境为主题的网页设计与实现

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

《剑指 Offer 》—50. 第一个只出现一次的字符

《剑指 Offer 》—50. 第一个只出现一次的字符 一、题目内容 原题连接&#xff1a;https://leetcode.cn/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/description/ 题目&#xff1a;在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。…

【专栏】核心篇06| Redis 存储高可用背后的模式

关注公众号 【离心计划】呀&#xff0c;一起逃离地球表面 Redis专栏合集 【专栏】01| Redis夜的第一章 【专栏】基础篇02| Redis 旁路缓存的价值 【专栏】基础篇03| Redis 花样的数据结构 【专栏】基础篇04| Redis 该怎么保证数据不丢失&#xff08;上&#xff09; 【专栏…

RabbitMQ------发布确认高级(消息回调、回退、备份交换机)(八)

RabbitMQ------发布确认高级&#xff08;八&#xff09; 可能由于某些意外情况&#xff0c;导致RabbitMQ重启&#xff0c;在RabbitMQ重启过程中&#xff0c;生产者投递消息失败&#xff0c;导致消息丢失。 如果才能够保证RabbitMQ的消息可靠性呢&#xff1f; 可能出现两种问题…

大数据毕设选题 - 深度学习火焰识别检测系统(python YOLO)

文章目录0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层5 数据集准备5.1 数据标…

CSRF漏洞简介

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是CSRF漏洞原理、产生与危害。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未…

Maven——分模块开发与设计(重点)

目录 一、模块拆分 1.1 模块拆分思想 1.2 pojo模块拆分 1.3 dao模块拆分 1.4 service模块拆分 1.5 controller模块拆分 二、 聚合——模块聚合 三、继承——模块继承 一、模块拆分 1.1 模块拆分思想 左侧&#xff1a;我们从前的架构&#xff0c;一个人独立做的所有工作文件…

shell脚本的条件判断1:字符串和数字和比较

前言 写脚本时&#xff0c;为了让脚本更接近人类思考问题的方式&#xff0c;可以对各种情况进行判断。例如&#xff0c;经常需要判断某些条件是否成立&#xff0c;如果条件成立该如何处理&#xff0c;如果条件不成立又该如何处理&#xff0c;这些都可以通过Shell脚本的if语句结…

大数据_什么是数据中台?

目录 一、数据中台的定义 二、数据中台必备的是个核心能力 三、数据中台VS业务中台 四、数据中台VS数据仓库 五、数据中台VS现有信息架构 六、数据中台的业务价值与技术价值 一、数据中台的定义 数据中台是一套可持续“让企业的数据用起来”的机制&#xff0c;是一种战略…

vm的生命周期钩子

vm的生命周期钩子&#xff08;共11个&#xff09;&#xff1a; 前8个&#xff1a; 将要创建>调用beforeCreate函数 创建完毕>调用created函数 将要挂载>调用beforeMount函数 &#xff08;重要&#xff09;挂载完毕>调用mounted函数>【重要钩子】 将要更新…

用户画像洞察分类模型 - 前端页面展示

文章目录一、前端与数据智能二、 体验优化需求场景跳失预测交互偏好智能 UI三、 关键技术鲸幂 UICook&#xff08;智能UI&#xff09;DataCookPipCookPipeline四、 体验优化实践数据智能实践的一般流程数据采集数据分析 -如何对数据进行分析处理并得出结论数据应用 - 分析结论如…

【C++】string类接口的了解和使用

为什么我们要学string类呢&#xff1f;那是必须是为了方便啊&#xff01;在C语言中&#xff0c;我们创建一个字符串&#xff0c;有很多操作或者必须要注意的细节会把控不住&#xff0c;所以C中出现了string类&#xff0c;让我们应对字符串等oj题也方便快捷了许多&#xff01; 目…

linux搭建redis数据库实现远程c语言访问

文章目录 linux安装reidis数据库c语言使用hiredis库实现redis数据库的操作测试代码使用hiredis库制作一个redis数据库管理系统linux安装reidis数据库 linux安装reidis数据库 sudo apt-get install redis-server使用systemctl命令查看redis服务运行状态 sudo systemctl statu…

Visual C++ 2010开发的程序在其它电脑上运行提示“找不到MSVCR100D.dll”原因及解决

Visual C 2010开发的程序在其它电脑上运行提示“找不到MSVCR100D.dll”原因及解决 Microsoft Visual C&#xff08;简称Visual C、MSVC、VS或VC&#xff09;2010是微软公司的免费C开发工具&#xff0c;具有集成开发环境&#xff0c;可提供编辑C语言&#xff0c;C以及C/CLI等编程…

惊喜:2023前瞻版Java面试指南,不止八股文

前言&#xff1a; 2022年马上就要过去了&#xff0c;即将要到来的就是2023年的金三银四面试季&#xff0c;随着政策的放宽&#xff0c;经济的逐步复苏&#xff0c;岗位的需求也会越来越大&#xff0c;所以趁这段时间进行知识储备将会是最好的时间段&#xff0c;永远要做快人一…

卷积神经网络——李宏毅机器学习笔记

以Image Classification为例 第一个解释角度&#xff1a; 先将不同尺寸的image&#xff0c;rescale成大小一样的尺寸&#xff0c;再丢到model中。 下图中&#xff0c;我们希望Cross entropy 越小越好 在计算机视角下的图片&#xff1a; 3 channels 对应R G B三个通道 随着模…

VirtualBox安装openEuler方案一

下载&#xff1a; https://www.openeuler.org/zh/mirror/list/ 根据设备架构选择对应的版本&#xff1a;windows是x86架构 选择下面这个4.2G大小的&#xff1a; 安装&#xff1a; 安装部分建议参考另一篇文章&#xff1a;virtualbox安装openEuler-方案二 下面部分的安装…

Flink CDC 2.3 发布,持续优化性能,更多连接器支持增量快照,新增 Db2 支持

01Flink CDC 简介Flink CDC [1] 是基于数据库的日志 CDC 技术&#xff0c;实现了全增量一体化读取的数据集成框架。配合 Flink 优秀的管道能力和丰富的上下游生态&#xff0c;Flink CDC 可以高效实现海量数据的实时集成。作为新一代的实时数据集成框架&#xff0c;Flink CDC 具…

电子班牌解决方案-最新全套文件

电子班牌解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 电子班牌全套最新解决方案合集一、建设背景 信息技术已渗透到经济发展和社会生活的各个方面&#xff0c;人们普遍关注教育信息化在提高国民素质和增强国家创新能力方面的重要作用。 《国家中长…