Design Compiler工具学习笔记(3)

news2024/11/23 9:16:27



目录

引言

知识储备

时钟创建

时钟偏差 

 时钟延迟

 转换时间

 输入路径约束

 输出路径延迟

 组合逻辑路径约束

时间预算

 寄存器输出

总结

实际操作

设计文件

check_design

reset_design

时序约束

check_timing

compile

report_constraint -all_violators

remove_design -hierarchy

TCL脚本文件

dcprocheck

source ../script/MY_TOP.tcl

查看时序报告



 



引言

本篇继续学习 DC的基本使用。本篇主要学习 DC 需要的时序约束。

前文链接:

Design Compiler工具学习笔记(1)

Design Compiler工具学习笔记(2)



知识储备

时钟创建

时钟偏差 

 时钟延迟

 转换时间

 输入路径约束

 输出路径延迟

 组合逻辑路径约束

 指定输入延迟、输出延迟,以及时钟周期,可以得到中间组合逻辑 F 的延迟不超过

时钟周期-输入延迟-输出延迟

 纯组合逻辑,需要创建虚拟时钟,

时间预算

 寄存器输出

总结



实际操作

写了一个很简单的设计文件:

设计文件

顶层:

// ================== TOP module =======================================
// Date:2022-11-20
// By:Xu Y. B.
// Description:
// use I_CNT_CTRL_A signal's posedge to control the counter in the time 
// domain B to count .
// =====================================================================

module TOP (
// time domain A 100MHz
input 			I_CNT_CTRL_A,    // input signal that needs to be synchronized
// time domain B 50MHz
input 			I_CLK_B,		 // clock B 50MHz
input 			I_RSTN_B,		 // synchronous reset active low
// output 
output reg [3:0]O_SYNC_DATA_B    // output counter 
	
);

// internal signals
wire W_SYNC_CTRL_B;				// I_CNT_CTRL_A synchronize to time domain B
reg  R_W_SYNC_CTRL_B_R1;		// W_SYNC_CTRL_B register one clock
wire W_SYNC_CTRL_B_PDG;			// posedge of W_SYNC_CTRL_B

// module logic
always @ (posedge I_CLK_B)
begin:register
	if(~I_RSTN_B)
	begin
		R_W_SYNC_CTRL_B_R1 <= 0;
	end
	else
	begin
		R_W_SYNC_CTRL_B_R1 <= W_SYNC_CTRL_B;
	end
end

assign W_SYNC_CTRL_B_PDG = W_SYNC_CTRL_B & (~R_W_SYNC_CTRL_B_R1);

// count
always @ (posedge I_CLK_B)
begin:count_B
	if(~I_RSTN_B)
	begin
		O_SYNC_DATA_B <= 4'd0;
	end
	else
	begin
		if(W_SYNC_CTRL_B_PDG)
		begin
			O_SYNC_DATA_B <= 3'd0;
		end
		else if(&O_SYNC_DATA_B)
		begin
			O_SYNC_DATA_B <= O_SYNC_DATA_B;
		end
		else
		begin
			O_SYNC_DATA_B <= O_SYNC_DATA_B + 1;
		end
	end
end


// module instantiate
sync_2 INST_sync_2 (.I_CLK(I_CLK_B), .I_RSTN(I_RSTN_B), .I_DATA(I_CNT_CTRL_A), .O_SYNC_DATA(W_SYNC_CTRL_B));

endmodule

sync_2:

// ================== single-bit signal two stages synchronizer =================
// Date:2022-11-20
// By:Xu Y. B.
// ==============================================================================

module sync_2 (
	input I_CLK,    	// clock
	input I_RSTN,   	// synchronous reset active low
	input I_DATA,   	// input signal that needs to be synchronized

	output O_SYNC_DATA  // output signal that has been synchronized
	
);

reg [1:0]	R_SYNC;

always @ (posedge I_CLK)
begin:sync
	if(~I_RSTN)
	begin
		R_SYNC <= 2'b00;
	end
	else
	begin
		R_SYNC[0] <= I_DATA;
		R_SYNC[1] <= R_SYNC[0];
	end
end
assign O_SYNC_DATA = R_SYNC[1];

endmodule

首先按照上篇文章的流程读取设计文件,并且做库的链接。

然后进行后续操作:

check_design

 返回 1 表示正确可用。

reset_design

 返回 1 ,表示正确操作。目的是将涉及置于初始状态,去除一切约束。

时序约束

此处的约束种类比较多,后面会在 tcl 脚本里面详细阐述。

check_timing

主要用来检查时序约束的完整性。

compile

此步骤完成设计的编译即网表映射。

report_constraint -all_violators

查看时序违规

remove_design -hierarchy

将设计全部移除。

TCL脚本文件

# |===========================================================
# | 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 TOP
analyze        -format verilog [list TOP.v sync_2.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
# |===========================================================
set       CLK_NAME          	I_CLK_B
set       CLK_PERIOD        	20
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]


# |===========================================================
# |STEP 5: define reset
# |===========================================================
set RST_NAME 					I_RSTN_B
set_ideal_network 				[get_ports $RST_NAME]
set_dont_touch_network          [get_ports $RST_NAME]
set_drive             0         [get_ports $RST_NAME]


# |===========================================================
# |STEP 6: set input delay using timing budget
# |Assume a weak cell to drive the input pins
# |===========================================================
set 		LIB_NAME 			typical
set 		WIRE_LOAD_MODULE 	smic18_wl10
set 		DRIVE_CELL 			INVX1
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_input_delay -min 0 -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/INVX8/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

dcprocheck

检查 tcl 脚本有无语法问题。

故意打错一个命令:

 出现了未定义程序的警告需要重视。

source ../script/MY_TOP.tcl

执行脚本,注意路径。

查看时序报告

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

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

相关文章

conda创建虚拟环境命令、jupyter notebook启动打开和使用

一、conda创建虚拟环境命令步骤 1.1创建虚拟环境命令 首先使用conda -V命令检查是否已安装Anaconda&#xff0c;这里安装步骤省略 打开终端运行以下前两个命令&#xff0c;即可创建 1.创建名为env-name的虚拟环境&#xff1a;conda create --name [env-name] 2.进入env-n…

5个月的精华:Spring/SpringBoot扩展点手册:手册在手,编码无忧:全网独一份 - 第451篇

历史文章&#xff08;文章累计450&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 利用Spring扩展点模拟Feign实现远程调用…

使用Cpolar+freekan源码 创建在线视频网站

文章目录1.前言2.本地网页搭建1.1 环境使用1.2 支持组件和环境设置1.3 支持组件选和环境设置1.4 网页安装1.5 测试和使用1.6 问题解决3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语1.前言 随着网络条件的改善和移动智能设备的普及&#xff0c;在线…

C++语法——右值引用、移动构造和赋值、万能引用和转发、move和forward底层实现

目录 一.右值引用 &#xff08;一&#xff09;.何为右值 &#xff08;二&#xff09;.右值引用 &#xff08;三&#xff09;.右值和左值的互相传递 ①左值->右值引用 ②右值->左值引用 &#xff08;四&#xff09;.右值引用的自身属性 二.移动构造和移动赋值 &…

艾美捷Bio-Helix CCH321 超敏ECL化学发光试剂盒(皮克级)特点

UltraScene Pico Plus Western底物是一种基于鲁米诺的增强化学发光底物&#xff0c;它敏感且与辣根过氧化物酶&#xff08;HRP&#xff09;偶联的二级抗体进行免疫印迹兼容。UltraScene Pico Plus Western Substrate具有卓越的灵敏度和长信号持续时间&#xff0c;可实现抗原的低…

Day09--导入小程序项目,初步安装和使用vant组件库

1.拿到老师的资料mp_5 ************************************************************************************************************** 2.Day09--的大概流程 *****************************************************************************************************…

MySQL数据库期末考试试题及参考答案(04)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 一、填空题 MySQL中提供了____关键字&#xff0c;可以在查询时去除重复的值。使用ORDER BY对查询结果进行排序时&#xff0c;默认是按____排列。SELECT语句中&#xff0c;用…

Android启动优化之多线程依赖线程池

背景 开发中会存在多个任务之间互相依赖&#xff0c;运行非常慢的情况&#xff0c;譬如Android在主线程中初始化多个SDK导致App启动慢的情况&#xff0c;搜索一下发现业界的通用做法是构造任务的有向无环图&#xff0c;拓扑排序生成有序的任务列表&#xff0c;然后用线程池执行…

[JavaScript] 用电脑计算圆周率评估计算性能

据说全球第一台计算机是在1946年面世的&#xff0c;那它的计算性能是怎样的&#xff0c;至今2022年&#xff0c;发展这么多年&#xff0c;现在的普通计算机性能又是怎样的呢&#xff0c;接下来做一个实验&#xff0c;评估计算性能 文章目录1. 设计2. 编程3. 测试1. 设计 先写一…

[第十三篇]——Docker Compose

Docker Compose Compose 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可以使用 YML 文件来配置应用程序需要的所有服务。然后&#xff0c;使用一个命令&#xff0c;就可以从 YML 文件配置中创建并启动所有服务。 如果你还不了解…

G1D18-WarshallFloyd课程报告matlab下载

今天先从算法开始吧嘿嘿~ 一、DP &#xff08;一&#xff09;Warshall求闭包 1、DP大概看明白啦~ 2、一会再看一下基于邻接表的暴搜 &#xff08;二&#xff09;Floyd完全最短路径的Floyd算法 欸嘿~~基本上好啦还差一点图的遍历晚上问问同学吧&#xff01; 啊哈大概看了一…

BUUCTF·[WUSTCTF2020]大数计算·WP

BUUCTF在线评测 (buuoj.cn) 附件 flag等于 wctf2020{Part1-Part2-Part3-Part4} 每一Part都为数的十六进制形式&#xff08;不需要0x)&#xff0c;并用 - 连接 Part1 2020*2019*2018* ... *3*2*1 的前8位 Part2 520^1314 2333^666 的前8位 Part3 宇宙终极问题的答案 x,y,z绝…

CF461B Appleman and Tree题解

洛谷题面 感觉是非常经典的一道题&#xff0c;最近好像总是见到&#xff0c;今天也算给它做了&#xff0c;发一篇题解来记录一下。 这道题是一道树形 DP 题&#xff0c;设 f[u][0/1]f[u][0/1]f[u][0/1] 表示 uuu 点属于一个无黑点 /// 有且仅有一个黑点的联通块时的方案数。我…

【HDR】Deep high dynamic range imaging of dynamic scenes

文章目录一、贡献二、数据集构建三、算法框架3.1 对齐模块3.2 合成模块3.3 损失函数四、实验一、贡献 Paper&#xff1a; Deep high dynamic range imaging of dynamic scenes Code&#xff1a;https://github.com/TH3CHARLie/deep-high-dynamic-range 首次提出使用机器学习方…

Pdfjs使用

pdfjs使用一、下载二、Springboot引入pdfjs三、利用PDFJS预览pdf文件并加水印四、后端将pdf添加水印参看链接一、下载 pdfjs官方地址 二、Springboot引入pdfjs 针对于pdfjs方面有用的只是pdf这个包下面和viewer.html这个html页面viewer.html是我们用来展示pdf的页面不需要改但…

高压功率放大器在超声悬浮中的应用研究

高压功率放大器的叫法对于不同的人来说是完全不同的&#xff0c;有人叫功率放大器&#xff0c;也有人叫电压放大器&#xff0c;但它们都是指同一个电子测量仪器设备&#xff0c;主要是指内部能够拥有电压和功率放大电路&#xff0c;可以把微弱的外部信号进行放大输出的放大器。…

在华为云 OSC 上快速部署 EMQX MQTT 集群

EMQX Kubernetes Operator 是 EMQ 发布的一个封装、部署和管理工具&#xff0c;也是一个特定的应用控制器&#xff0c;方便 DevOps 人员在 Kubernetes 上编排 EMQX MQTT 消息服务集群&#xff0c;管理其生命周期。 华为云原生基础设施&#xff08;云容器引擎 CCE、容器镜像服务…

索引数据结构千千万 , 为什么B+Tree独领风骚

索引的由来 大数据时代谁掌握了数据就是掌握了流量&#xff0c;就是掌握的号召力。面对浩瀚的数据如何存储并非难事&#xff0c; 难点在于如何在大数据面前查询依旧快如闪电&#xff01; 这时候索引就产生了&#xff0c;索引的产生主要还是借鉴于图书管理员书签的功能。在大数…

谷歌、微软、Meta?谁才是 Python 最大的金主?

你知道维护 Python 这个大规模的开源项目&#xff0c;每年需要多少资金吗&#xff1f; 答案是&#xff1a;约 200 万美元&#xff01; PSF&#xff08;Python 软件基金会&#xff09;在 2022 年 6 月发布了 2021 的年度报告&#xff0c;其中披露了以下这份支出明细&#xff08;…

大家介绍一篇学生选课系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…