Vivado时序报告之Check_timing详解

目录

一、前言

二、Check_Timing

2.1 含义解释

2.2 工程代码

2.3 时序约束

2.4 Check_timing报告

no clock

pulse_width_clock

unconstrained_internal_endpoints

no_input_delay

no_output_delay

multiple_clock

generated_clocks

loops

partial_input_delay

partial_output_delay

latch_loops

三、参考文档


一、前言

    ​Vivado使用中会涉及到各种报告,内容也较多,很多初学者可能对其中一些内容感到困惑,下面将结合实际工程示例对report_timing_summary中的Check_timing部分进行说明,帮助大家理解报告。

二、Check_Timing

    ​Check_timing报告主要显示一些时钟约束类的检查结果,以Vivado2022.1为例,检查项有以下12项

read-normal-img

 

2.1 含义解释

no_clock:检查出没有时钟信号的寄存器

constant_clock:检查出连接到常量信号(如VSS、接地、数据信号)的时钟信号

pulse_width_clock:检查出只有脉冲宽度检查的时钟引脚,该时钟引脚没有setup/hold/recovery/removal检查

unconstrained_internal_endpoints:检查出以寄存器数据引脚为时序路径终点,但引脚没有约束

no_input_delay:检查出没有设置输入延时的输入端口

no_output_delay:检查出没有设置输出延时的输出端口

multiple_clock:检查出有多个时钟的时钟引脚,在检查出存在这样的时钟引脚时,建议使用set_case_analysis约束来限制只有一个时钟在该引脚上传输

generated_clocks:检查生成时钟是否存在环路或循环定义,如果生成时钟的源时钟也是生成时钟将报错

loops:检查组合逻辑中是否存在环路

partial_input_delay:检查出输入端口中设置了输入时延input_delay,但只设置了max或min,或者延时值只有rise或fall边沿触发

partial_output_delay:检查出输出端口中设置了输出时延output_delay,但只设置了max或min,或者延时值只有rise或fall边沿触发

latch_loops:检查设计中组合逻辑是否存在latch环路

2.2 工程代码

注意:此设计中在综合后会报错,因为PLL的参数COMPENSATION("ZHOLD")为ZHOLD,如果需要跑通,需设置为EXTERNAL或INTERNAL,之所以这样设置是为了看到pulse_width_clock检查

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2024/02/24 14:18:11
// Design Name: 
// Module Name: Check_timing
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module Check_timing(clk1,clk2,clk3,rst,d1,d2,S,CLKIN1,CLKIN2,CLKINSEL,CLKFBIN,CLKFBOUT,o_clk,o_lut,O,Q1,Q2,Q3,out_syn,pll_out,ff2);
input clk1,clk2,clk3,rst,d1,S;
input [4:0] d2;
input CLKIN1,CLKIN2,CLKINSEL,CLKFBIN;
output O,Q1,Q2,Q3,out_syn,pll_out,CLKFBOUT,o_clk,o_lut;
reg ff1,pll_ff1,pll_ff2,ff_syn;
output reg [4:0] ff2;
wire o_fdce;



always@(posedge clk1,negedge rst)
     if(!rst)
     begin
         ff1<=1'b0;
         ff2<=1'b0;
     end
     else begin
         ff1<=d1;
         ff2<=d2;
     end
//constant_clock
   (*DONT_TOUCH="YES"*)LUT2 #(
      .INIT(4'b0101)  // Specify LUT Contents
   ) LUT2_inst4 (
      .O(o_lut),   // LUT general output
      .I0(clk3),// LUT input
      .I1(d1) // LUT input
   );
   (*DONT_TOUCH="YES"*) FDCE #(
      .INIT(1'b0) // Initial value of register (1'b0 or 1'b1)
   ) FDCE_inst (
      .Q(o_clk),      // 1-bit Data output
      .C(clk3),      // 1-bit Clock input
      .CE(S),    // 1-bit Clock enable input
      .CLR(rst),  // 1-bit Asynchronous clear input
      .D(d1)       // 1-bit Data input
   );

 assign sum12=ff1+o_fdce;
 always@(posedge clk2,negedge rst)
     if(!rst)
         ff_syn<=1'b0;
     else begin
         ff_syn<=sum12;
     end
 assign out_syn=ff_syn;


//latch_loop
LDCE #(
      .INIT(1'b1)
   )
   LDCE_inst2 (
      .Q(Q2),     // 1-bit output: Data
      .CLR(rst), // 1-bit input: Asynchronous clear
      .D(Q3),     // 1-bit input: Data
      .G(1'b1),     // 1-bit input: Gate
      .GE(S)    // 1-bit input: Gate enable
   );

   LUT1 #(
      .INIT(2'b01)  // Specify LUT Contents
   ) LUT1_inst3 (
      .O(Q3),   // LUT general output
      .I0(Q2)  // LUT input
   );

//loop
LUT1 #(
      .INIT(2'b01)  // Specify LUT Contents
   ) LUT1_inst1 (
      .O(O),   // LUT general output
      .I0(Q0)  // LUT input
   );
LUT1 #(
      .INIT(2'b01)  // Specify LUT Contents
   ) LUT1_inst2 (
      .O(Q0),   // LUT general output
      .I0(O)  // LUT input
   );

 PLLE2_ADV #(
      .BANDWIDTH("OPTIMIZED"),  // OPTIMIZED, HIGH, LOW
      .CLKFBOUT_MULT(8),        // Multiply value for all CLKOUT, (2-64)
      .CLKFBOUT_PHASE(0.0),     // Phase offset in degrees of CLKFB, (-360.000-360.000).
      // CLKIN_PERIOD: Input clock period in nS to ps resolution (i.e. 33.333 is 30 MHz).
      .CLKIN1_PERIOD(0.0),
      .CLKIN2_PERIOD(0.0),
      // CLKOUT0_DIVIDE - CLKOUT5_DIVIDE: Divide amount for CLKOUT (1-128)
      .CLKOUT0_DIVIDE(1),
      .CLKOUT1_DIVIDE(2),
      .CLKOUT2_DIVIDE(4),
      .CLKOUT3_DIVIDE(5),
      .CLKOUT4_DIVIDE(1),
      .CLKOUT5_DIVIDE(1),
      // CLKOUT0_DUTY_CYCLE - CLKOUT5_DUTY_CYCLE: Duty cycle for CLKOUT outputs (0.001-0.999).
      .CLKOUT0_DUTY_CYCLE(0.4),
      .CLKOUT1_DUTY_CYCLE(0.5),
      .CLKOUT2_DUTY_CYCLE(0.5),
      .CLKOUT3_DUTY_CYCLE(0.5),
      .CLKOUT4_DUTY_CYCLE(0.5),
      .CLKOUT5_DUTY_CYCLE(0.5),
      // CLKOUT0_PHASE - CLKOUT5_PHASE: Phase offset for CLKOUT outputs (-360.000-360.000).
      .CLKOUT0_PHASE(0.0),
      .CLKOUT1_PHASE(0.0),
      .CLKOUT2_PHASE(0.0),
      .CLKOUT3_PHASE(0.0),
      .CLKOUT4_PHASE(0.0),
      .CLKOUT5_PHASE(0.0),
      .COMPENSATION("ZHOLD"),   // ZHOLD, BUF_IN, EXTERNAL, INTERNAL
      .DIVCLK_DIVIDE(1),        // Master division value (1-56)
      // REF_JITTER: Reference input jitter in UI (0.000-0.999).
      .REF_JITTER1(0.0),
      .REF_JITTER2(0.0),
      .STARTUP_WAIT("FALSE")    // Delay DONE until PLL Locks, ("TRUE"/"FALSE")
   )
   PLLE2_ADV_inst (
      // Clock Outputs: 1-bit (each) output: User configurable clock outputs
      .CLKOUT0(CLKOUT0),   // 1-bit output: CLKOUT0
      .CLKOUT1(CLKOUT1),   // 1-bit output: CLKOUT1
      .CLKOUT2(CLKOUT2),   // 1-bit output: CLKOUT2
      // Feedback Clocks: 1-bit (each) output: Clock feedback ports
      .CLKFBOUT(), // 1-bit output: Feedback clock

      // Clock Inputs: 1-bit (each) input: Clock inputs
      .CLKIN1(CLKIN1),     // 1-bit input: Primary clock
      .CLKIN2(CLKIN2),     // 1-bit input: Secondary clock
      // Control Ports: 1-bit (each) input: PLL control ports
      .CLKINSEL(CLKINSEL), // 1-bit input: Clock select, High=CLKIN1 Low=CLKIN2
      .RST(rst),           // 1-bit input: Reset
      // Feedback Clocks: 1-bit (each) input: Clock feedback ports
      .CLKFBIN(CLKFBIN)    // 1-bit input: Feedback clock
   );
   // End of PLLE2_ADV_inst instantiation

always@(posedge CLKOUT0,negedge rst)
    if(!rst)
    begin
        pll_ff1<=1'b0;
        pll_ff2<=1'b0;
    end
    else begin
        pll_ff1<=d1;
        pll_ff2<=S;
    end
assign pll_out=pll_ff1*pll_ff2;

wire sum12;
assign sum12=pll_ff1+pll_ff2;
always@(posedge CLKOUT1,negedge rst)
    if(!rst)
        ff_syn<=1'b0;
    else begin
        ff_syn<=sum12;
    end
assign out_syn=ff_syn;

endmodule

2.3 时序约束

create_clock -period 4.000 -name clk1 -waveform {0.000 2.000} -add [get_ports clk1]
create_clock -period 6.000 -name clk1_a -waveform {0.000 3.000} -add [get_ports clk1]
create_clock -period 6.000 -name clkin1 -waveform {0.000 3.000} -add [get_ports CLKIN1]
create_generated_clock -name gen_clk -source [get_pins PLLE2_ADV_inst/CLKOUT1] -multiply_by 2 -add -master_clock clkin2 [get_pins PLLE2_ADV_inst/CLKOUT0]
set_input_delay -clock [get_clocks clk1] -rise 0.111 [get_ports {{d2[0]} {d2[1]}}]
set_output_delay -clock [get_clocks clk1] -min 0.222 [get_ports {ff2[0]}]
create_clock -period 9.000 -name clkin2 -waveform {0.000 4.500} -add [get_ports CLKIN2]
create_generated_clock -name gen_clk -source [get_ports CLKIN1] -multiply_by 2 -add -master_clock clkin2 [get_pins PLLE2_ADV_inst/CLKOUT1]
create_clock -period 10.000 -name clk3 -waveform {0.000 5.000} -add [get_ports clk3]
set_case_analysis 1 [get_ports clk3]

2.4 Check_timing报告

no clock

no_clock中触发器ff_syn无时钟信号,因为ff_syn的时钟clk2无create_clock约束,后面的serverity表示影响大小,High表示影响大

 

pulse_width_clock

对PLL的反馈输入端口进行脉冲宽度检查

 

unconstrained_internal_endpoints

unconstrained_internal_endpoints中high级别的端口未设置最大时延,级别为medium表示由于连接常量时钟而无最大延时

 

no_input_delay

未设置input_delay约束的端口

no_output_delay

未设置output_delay约束的端口,设置了约束的端口不会出现

 

multiple_clock

时钟引脚存在多个时钟的触发器,之所以存在多个时钟是因为这些触发器由时钟clk1驱动,而clk1端口上定义了2各时钟信号clk1和clk1_a

 

generated_clocks

生成时钟约束问题,因为generate_clock约束中master pin和master clock是无关联的。

 

loops

设计中组合路径存在环路LUT1_inst1和LUT1_inst2的输入输出首尾相连了

 

partial_input_delay

设计中d2[0],d2[1]中的set_input_delay约束中使用了-rise,注意,如果再添加一条set_input_delay,使用-fall,则端口不会出现在partial_input_delay中,此时延时约束完整

 

partial_output_delay

设计中ff2[0]中的set_output_delay约束中使用了-min,注意:如果再添加一条约束使用-max,则不会partial_output_delay中

 

latch_loops

设计中LDCE_inst2的输入和输出首尾相连,因此出现latch的环路

 

三、参考文档

用户手册《ug835-vivado-tcl-commands-en-us-2023.1.pdf》

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

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

相关文章

在 Python 中确定一个数字是否等于 0,考虑精度问题

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在 Python 中&#xff0c;特别是在处理浮点数时&#xff0c;确定一个数字是否等于 0 时&#xff0c;必须考虑精度问题。由于计算机使用二进制表示数字&#xff0c;浮点运算可能会引入微小的误差。这意味…

2024年抖店创业项目分享,新手不能错过的教程分享,快收藏!

大家好&#xff0c;我是电商花花。 在我看来&#xff0c;2024年最受欢迎的电商创业项目还得是抖音小店无货源&#xff0c;我依然看好今年抖音电商的市场&#xff0c;并且对于抖音小店我们会做&#xff0c;会一直做下去。 抖音一直都属于兴趣电商&#xff0c;会根据你的兴趣去…

.Encryptedd@mailfence.com.faust勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 在数字时代的今天&#xff0c;我们享受着科技带来的便利和创新&#xff0c;但也要时刻警惕着隐患。勒索软件就是其中之一&#xff0c;它们以一种毒害般的形式悄然而至&#xff0c;将我们的数字世界变得一片混乱。今天&#xff0c;我们要聚焦的是 .Encrypted…

ModStartCMS v8.1.0 图片前端压缩,抖音授权登录

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

价格战打响!阿里云服务器和腾讯云服务器价格对比

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器62元一年&#xff0c;2核2G3M、2核4G、4核8G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配置价格表…

2.29总结

P1802 5 倍经验日 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 现在乐斗有活动了&#xff01;每打一个人可以获得 5 倍经验&#xff01;absi2011 却无奈的看着那一些比他等级高的好友&#xff0c;想着能否把他们干掉。干掉能拿不少经验的。 题目描述 现在 absi…

windows 中, bash: conda: command not found(已解决)

git bash 中运行conda命令&#xff0c;出现这种错误&#xff0c;原因是你没有在git bash中 配置conda&#xff0c;导致git bash无法找到conda 那就配置一下&#xff0c;找到你的conda的安装位置下的bash.sh文件&#xff0c;一般在安装位置&#xff08;我的安装在C盘的自定义路径…

『Linux从入门到精通』第 ㉑ 期 - 文件系统详解

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;认识磁盘&#x1f427;逻辑抽象&#x1f427;文件系统&#x1f426;Block&#x1f426;Block Group&#x1f414;Block Group 的组成部分 &#x1f426;Superblock(超级区块)&#x1f426;Group Description(…

typescript 的数据类型有哪些

&#x1f469; 个人主页&#xff1a;不爱吃糖的程序媛 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域新星创作者、CSDN内容合伙人&#xff0c;专注于前端领域技术&#xff0c;成长的路上共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨系列专栏&#xff1a;前端面…

吸猫毛空气净化器哪个好?推荐除猫毛好的宠物空气净化器品牌

如今&#xff0c;越来越多的家庭选择养宠物&#xff01;虽然家里变得更加温馨&#xff0c;但养宠可能会带来异味和空气中的毛发增多可能会引发健康问题&#xff0c;这也是一个大问题。 但我不想家里到处都是异味&#xff0c;尤其是便便的味道&#xff0c;所以很需要一款能够处…

Unity(第八部)Vector3的三维向量和旋转(坐标和缩放也简单讲了一下)

对了&#xff0c;Unity的生命周期自行百度吧&#xff1b;我这边整理的都不是很满意 Vector 是结构体 Vector2是指里面有两个变量 Vector3是指里面有三个变量 Vector4是指里面有四个变量 Vector3常用的变量就是x y z,所以&#xff0c;它可以代表坐标、旋转、缩放、三维向量 创…

C语言数据结构基础—单链表相关数据结构题目6道

上一篇博客中&#xff0c;我们大致的讲解了单链表相关的各种接口。接下来我们通过例题来运用类似的思想&#xff0c;达到学以致用的目的。 1.移除链表元素 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 没有说明头结点是什么&#xff0c;默认就是第一个元素&am…

智能汽车软硬件产品CES展示汽车技术新亮点

智能汽车是汽车产业发展的新趋势&#xff0c;是未来汽车发展的必然方向。智能汽车是指搭载了先进的传感器、控制器、执行器等部件&#xff0c;并融合了人工智能、自动驾驶等技术&#xff0c;能够实现部分或完全自动驾驶、智能网联等功能的汽车。 近年来&#xff0c;智能汽车技…

ensp模拟单臂路由实现不同两个网段主机访问

拓扑结构图如下 1.pc机配置略过 2.交换机配置 三个接口&#xff0c;两个连接pc&#xff0c;连接方式access&#xff0c;一个连接路由器 连接方式trunk sy #进入系统 视图模式 undo info-center enable #关闭信息 vlan batch 10 20#批量创建vlan int g 0/0/2#进入2端口 p…

Java图书管理系统---命令行

项目列表 Book包 Book类内包含book的基本属性 BookList类初始化图书列表并且提供图书的属性方法 User包 Administrator类 common类 operator包 功能接口 新增图书功能 借阅图书功能 删除图书功能 显示图书功能 查找图书功能 归还图书功能 结束释放资源功能 运行…

MySQL进阶:大厂高频面试——各类SQL语句性能调优经验

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;MySQL进阶&#xff1a;强推&#xff0c;冲大厂必精通&#xff01;MySQL索引底层&#xff08;BTree&#xff09;、性能分析、使用…

批量获取图片(下)

1.问题分析 我们观察下之前获得的图片&#xff0c;可以发现图片的清晰度不够。 放大之后比较模糊&#xff0c;这样的图叫做缩略图&#xff0c;那该如何获得高清海报图片呢&#xff1f; 为了找到高清图片&#xff0c;我们需要对网页结构进行分析&#xff0c;找到高清图对应的链…

C#,动态规划(DP)金矿问题(Gold Mine Problem)的算法与源代码

1 金矿问题&#xff08;Gold Mine Problem&#xff09; 给定一个N*M尺寸的金矿&#xff0c;每个点都有一个非负数表示当前点所含的黄金数目&#xff0c;最开始矿工位于第一列&#xff0c;但是可以位于任意行。矿工只能向右&#xff0c;右上&#xff0c;右下三个方向移动。问该…

Eureka 入门教程

Eureka 介绍 1. 注册中心概述 什么是注册中心&#xff1f; 给客户端提供可供调用的服务列表&#xff0c;客户端在进行远程调用&#xff08;RPC&#xff09;时&#xff0c;根据服务列表选择服务提供方的服务地址进行服务调用 注册中心的核心功能 注册&#xff1a;服务提供者上…

CY8C42(1.PSoC4 Pioneer Kit开箱及基本使用)

1.开箱 最近了解到赛普拉斯有一种芯片&#xff0c;属于PSoC系列&#xff0c;与传统MCU不同&#xff0c;有点类似跨界芯片&#xff0c;于是就买来玩玩了&#xff0c;老实说用完还是很特别的&#xff0c;因为我没有用过FPGA&#xff0c;不确定是不是FPGA的开发流程&#xff08;有…