Report Design Analysis报告之logic level详解

目录

一、前言

二、Logic Level distribution

2.1 logic level配置

2.2 Logic Level Distribution报告

2.3 Logic Level 报告详情查看

2.4 Route Distributions 报告详情查看

2.5 示例代码


一、前言

    ​在工程设计中,如果需要了解路径的逻辑级数,可以在report timing summary中找到对应的时序路径,查看时序路径的详情报告中有逻辑级数的信息,如下图

    ​这种方法查看有一个缺点,就是无法知道工程设计中逻辑级数的总体情况,这个时候就可以使用Report design analysis中的Include logic level distribution来查看

二、Logic Level distribution

2.1 logic level配置

    ​工程运行完Synthesize或implement时,进入菜单栏的“Reports”中,在“Reports->Report Design Analysis->Options”中,存在“Include logic level distribution”,默认不勾选,勾选后同时可以设置展示总的显示逻辑级数数量Number of paths,默认是1000条,表示最多只显示1000条,这1000条是所有路径中最差slack的1000条,不足1000条时按实际显示路径数显示。

2.2 Logic Level Distribution报告

    ​以Number of paths设置20为例,在Logic Level Distribution中将显示所有时序路径中最差的20条路径。注:logic level distribution只考虑setup路径。

左侧报告包含3类内容:

End Point Clock:根据所有时序路径中End Point Clock来划分

Requirement:展示的End point clock对应路径中最差的Requirement,以End point clock为clk1,逻辑级数为0的1条,逻辑级数为1的3条,逻辑级数为2的没有

查看逻辑级数为0路径的requirement

查看逻辑级数为1路径的requirement,在Logic level distribution中clk1选取的requirement为-2,即为所有路径requirement中的最小值

工程中各逻辑级数:此处时序路径数逻辑级数只有0级,1级和2级,下面对应的展示了各逻辑级数的路径数量,所有路径数量加起来即为设置的Number of paths值20

2.3 Logic Level 报告详情查看

在logic level distribution报告中,选中需要查看的路径,以下图clk2的逻辑级数为1的3条路径为例,见红框内,点击鼠标左键,弹出弹框

选择“Report Design Analysis on Timing Paths”,在原有的Design analysis窗口中打开报告,报告为setup path characteristics

选择“Report Timing on Timing Paths”,在新打开的Timing窗口中以时序报告路径的形式展现

在完成Implement后,选择“Select Timing Paths”,将会在Netlist窗口和device中显示该路径中的包含的cells和路径(白色高亮)

2.4 Route Distributions 报告详情查看

生成Report Design Analysis时如果勾选Routes,则可以生成Route Distributions报告,主要提供时序路径中完全布线的net数量

Routes数量表示时序路径上data path中属于fully routed的net数量,通常是和逻辑级数一致,如果时序路径属于起点或终点为port的,如recovery路径或设置了setup_output_delay的路径,则logic level值和routes会不一致

以上图的end point clock为clk2,数量为1的4为例,执行report timing on timing paths,时序报告中有一列Routes,显示了对应路径 routes的数量,图中都为1

执行select timing paths,在Net窗口会显示对应的routes名称,Route Status为Fully routed的才被考虑,如下图第1条net rst属于routed to a hierarchical port,则不会考虑进Routes Distribution中,因此路径的routes数量为1,level也为1。

Route Status为internally routed within one site也不会被统计到routes中

​下面的路径中logic level为1,route数量为2

2.5 示例代码

module logic_level(CLKIN1,CLKIN2,CLKINSEL,CLKFBIN,CLKFBOUT,clk1,clk2,rst,d1,d2,S,i_bus,o_bus,bus_clk2,out_syn,out_asyn,and_out,o_case);
input CLKIN1,CLKIN2,CLKINSEL,CLKFBIN,clk1,clk2,rst,d1,d2,S;
input [4:0] i_bus;
output reg [4:0] o_bus,bus_clk2;
output out_syn,out_asyn,and_out,CLKFBOUT;
reg ff1,ff2,ff_asyn,ff_syn,ff_and;
reg ff_case;
output reg o_case;
reg [4:0] bus;
wire sum12,and_c,CLKOUT0,CLKOUT1;
wire [4:0] bus_c;
wire o_bufgmux,ffcase_n;

 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("EXTERNAL"),   // 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(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
        ff1<=1'b0;
        ff2<=1'b0;
    end
    else begin
        ff1<=d1;
        ff2<=d2;
    end

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

always@(posedge clk1,negedge rst)
    if(!rst)
        ff_asyn<=1'b0;
    else begin
        ff_asyn<=sum12;
    end
assign out_asyn=ff_asyn;
assign and_c=ff_asyn&d1;

always@(posedge clk1,negedge rst)
    if(!rst)
        ff_and<=1'b0;
    else begin
        ff_and<=and_c;
    end
assign and_out=ff_and;

always@(posedge clk1,negedge rst)
    if(!rst)
        bus<=5'b0;
    else begin
        bus<=i_bus+1'b1;
    end
assign bus_c=bus+d2;
always@(*)
    begin
        o_bus=bus;
    end
always@(posedge clk2,negedge rst)
    if(!rst)
        bus_clk2<=5'b0;
    else begin
        bus_clk2<=bus_c+d1;
    end


//set_case_analysis
   BUFGMUX #(
   )
   BUFGMUX_inst (
      .O(o_bufgmux),   // 1-bit output: Clock output
      .I0(CLKIN1), // 1-bit input: Clock input (S=0)
      .I1(CLKIN2), // 1-bit input: Clock input (S=1)
      .S(S)    // 1-bit input: Clock select
   );

always@(posedge o_bufgmux,negedge rst)
    if(!rst)
        ff_case<=1'b0;
    else begin
        ff_case<=d1;
    end
assign ffcase_n=!ff_case;

always@(posedge o_bufgmux,negedge rst)
    if(!rst)
        o_case<=1'b0;
    else begin
        o_case<=ffcase_n;
    end

endmodule 

约束

//创建主时钟和生成时钟
create_clock -period 10.000 -name clkin1 -waveform {0.000 5.000} -add [get_ports CLKIN1]
create_clock -period 5.000 -name clkin2 -waveform {0.000 2.500} -add [get_nets CLKIN2]
create_clock -period 4.000 -name clk2 -waveform {0.000 2.000} -add [get_ports clk2]
create_clock -period 4.000 -name clk1 -waveform {0.000 2.000} -add [get_ports clk1]
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_jitter [get_clocks clk2] 0.500
set_clock_latency -clock [get_clocks clk2] 0.333 [get_pins {bus_reg[1]/D}]
set_system_jitter 0.009
set_clock_uncertainty 0.500 [get_clocks clk1]


//设置时钟组和总线偏斜
set_clock_groups -name clkin1_group -asynchronous -group [get_clocks clkin1]
set_bus_skew -from [get_cells {{bus_reg[0]} {bus_reg[1]} {bus_reg[2]} {bus_reg[3]} {bus_reg[4]}}] -to [get_cells {{bus_clk2_reg[0]} {bus_clk2_reg[1]} {bus_clk2_reg[2]} {bus_clk2_reg[3]} {bus_clk2_reg[4]}}] 0.550
set_input_delay -clock [get_clocks clk1] 1.111 [get_ports {d1 d2 {i_bus[0]} {i_bus[1]} {i_bus[2]} {i_bus[3]} {i_bus[4]} rst}]
set_output_delay -clock [get_clocks clk2] 0.222 [get_ports {and_out {o_bus[0]} {o_bus[1]} {o_bus[2]} {o_bus[3]} {o_bus[4]} out_asyn out_syn}]


//设置时序例外分析
set_false_path -setup -from [get_pins {bus_reg[2]/C}] -to [get_pins {bus_clk2_reg[4]/D}]
set_max_delay -from [get_pins {bus_reg[1]/C}] 2.000
set_min_delay -from [get_pins {bus_reg[0]/C}] 0.500
set_external_delay -from [get_ports CLKFBOUT] -to [get_ports CLKFBIN] 0.444
set_multicycle_path -from [get_pins {bus_reg[0]/C}] -to [get_pins {bus_clk2_reg[2]/D}] 2
set_disable_timing [get_cells {bus_reg[3]}]

//设置时序断言
set_case_analysis 1 [get_ports S]
set_data_check -from [get_pins {bus_reg[2]/C}] -to [get_pins {bus_reg[2]/Q}] 0.333 -clock [get_clocks clk2]
set_clock_sense -positive -clocks [get_clocks clk1] [get_pins ff_asyn_reg/C]
group_path -name {group_path} -weight 1.000 -from [get_ports {d1 d2}] 

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

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

相关文章

赚钱小思路,送给没有背景的辛辛苦苦努力的我们!

我是一个没有背景的普通人&#xff0c;主要靠勤奋和一股钻劲&#xff0c;这十几年来我的日常作息铁打不变&#xff0c;除了睡觉&#xff0c;不是在搞钱&#xff0c;就是在琢磨怎么搞钱。 ​ 可以说打拼了十几年&#xff0c;各种小生意都做过&#xff0c;以前一直是很乐观的&…

绘唐3最新版本哪里下载

绘唐3最新版本哪里下载 绘唐最新版本下载地址 推文视频创作设计是一种通过视频和文字的形式来进行推广的方式&#xff0c;可以通过一些专业的工具来进行制作。 以下是一些常用的小说推文视频创作设计工具&#xff1a; 视频剪辑软件&#xff1a;如Adobe Premiere Pro、Fina…

人工智能系列-Pandas基础

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Pandas简介 Pandas是Python语言的拓展程序库&#xff0c;用于数据分析。 Pandas是一个开放源码&#xff0c;BSD许可的库&#xff0c;提供高性能&#xff0c;易于使用的数据结…

SSM养老院管理系统-计算机毕业设计源码02221

摘要 本篇论文旨在设计和实现一个基于SSM的养老院管理系统&#xff0c;旨在提供高效、便捷的养老院管理服务。该系统将包括老人档案信息管理、护工人员管理、房间信息管理、费用管理等功能模块&#xff0c;以满足养老院管理者和居民的不同需求。 通过引入SSM框架&#x…

ChatGPT对话:Scratch编程中一个单词,如balloon,每个字母行为一致,如何优化编程

【编者按】balloon 7个字母具有相同的行为&#xff0c;根据ChatGPT提供的方法&#xff0c;优化了代码&#xff0c;方便代码维护与复用。初学者可以使用7个字母精灵&#xff0c;复制代码到不同精灵&#xff0c;也能完成这个功能&#xff0c;但不是优化方法&#xff0c;也没有提高…

微信小程序毕业设计-医院挂号预约系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

高考志愿填报,选专业是看兴趣还是看就业?

对于结束高考的学生来说&#xff0c;选择专业的确是一个非常让人头疼的事情。因为很多人都不知道&#xff0c;选专业的时候究竟是应该看一下个人兴趣&#xff0c;还是看未来的就业方向&#xff0c;这也是让不少人都相当纠结的问题。这里分析一下关于专业选择的问题&#xff0c;…

动手学深度学习(Pytorch版)代码实践 -循环神经网络-54循环神经网络概述

54循环神经网络概述 1.潜变量自回归模型 使用潜变量h_t总结过去信息 2.循环神经网络概述 ​ 循环神经网络&#xff08;recurrent neural network&#xff0c;简称RNN&#xff09;源自于1982年由Saratha Sathasivam 提出的霍普菲尔德网络。循环神经网络&#xff0c;是指在全…

字符串——string类的常用接口

一、string类对象的常见构造 二、string类对象的容量操作 三、string类对象的访问及遍历操作 四、string类对象的修改操作 一、string类对象的常见构造 1.string() ——构造空的string类对象&#xff0c;也就是空字符串 2.string(const char* s) ——用字符串来初始化stri…

【微服务】springboot对接Prometheus指标监控使用详解

目录 一、前言 二、微服务监控概述 2.1 微服务常用监控指标 2.2 微服务常用指标监控工具 2.3 微服务使用Prometheus监控优势 三、环境准备 3.1 部署Prometheus服务 3.2 部署Grafana 服务 3.3 提前搭建springboot工程 3.3.1 引入基础依赖 3.3.2 配置Actuator 端点 3.…

代码随想录算法训练营第14天|226.翻转二叉树、101. 对称二叉树、104. 二叉树的最大深度、111.二叉树的最小深度

打卡Day14 1.226.翻转二叉树2.101. 对称二叉树扩展100. 相同的树572. 另一棵树的子树 3.104. 二叉树的最大深度扩展559.n叉树的最大深度 3.111.二叉树的最小深度 1.226.翻转二叉树 题目链接&#xff1a;226.翻转二叉树 文档讲解&#xff1a; 代码随想录 &#xff08;1&#x…

博客的部署方法论

有了域名后&#xff0c;可以方便其他人记住并访问&#xff0c;历史上不乏大企业花大价钱购买域名的&#xff1a; 京东域名换成 JD.com&#xff0c;并且说是为了防止百度吸引流量&#xff0c;为什么&#xff1f;唯品会买下域名 VIP.COM 或花费千万 ‍ 域名提供商 如果想要域…

Xilinx FPGA:vivado关于真双端口的串口传输数据的实验

一、实验内容 用一个真双端RAM&#xff0c;端口A和端口B同时向RAM里写入数据0-99&#xff0c;A端口读出单数并存入单端口RAM1中&#xff0c;B端口读出双数并存入但端口RAM2中&#xff0c;当检测到按键1到来时将RAM1中的单数读出显示到PC端&#xff0c;当检测到按键2到来时&…

普通Java工程如何在代码中引用docker-compose.yml中的environment值

文章目录 一、概述二、常规做法1. 数据库配置分离2. 代码引用配置3. 编写启动类4. 支持打包成可执行包5. 支持可执行包打包成docker镜像6. docker运行 三、存在问题分析四、改进措施1. 包含environment 变量的编排文件2. 修改读取配置文件方式3. 为什么可以这样做 五、运行效果…

股票Level-2行情是什么,应该怎么使用,从哪里获取数据

行情接入方法 level2行情websocket接入方法-CSDN博客 相比传统的股票行情&#xff0c;Level-2行情为投资者打开了更广阔的视野&#xff0c;不仅限于买一卖一的表面数据&#xff0c;而是深入到市场的核心&#xff0c;提供了十档乃至千档的行情信息&#xff08;沪市十档&#…

JavaWeb-【1】HTML

笔记系列持续更新,真正做到详细!!本次系列重点讲解后端,那么第一阶段先讲解前端 目录 1、Javaweb技术体系 2、BS架构说明 3、官方文档 4、网页组成 5、HTML 6、HTML快速入门 7、HTML基本结构 8、HTML标签 ​9、HTML标签使用细节 ①、font标签 ②、字符实体 ③、标…

图神经网络dgl和torch-geometric安装

文章目录 搭建环境dgl的安装torch-geometric安装 在跑论文代码过程中&#xff0c;许多小伙伴们可能会遇到一些和我一样的问题&#xff0c;就是文章所需要的一些库的版本比较老&#xff0c;而新版的环境跑代码会报错&#xff0c;这就需要我们手动的下载whl格式的文件来安装相应的…

SSM中小学生信息管理系统 -计算机毕业设计源码02677

摘要 随着社会的发展和教育的进步&#xff0c;中小学生信息管理系统成为学校管理的重要工具。本论文旨在基于SSM框架&#xff0c;采用Java编程语言和MySQL数据库&#xff0c;设计和开发一套高效、可靠的中小学生信息管理系统。中小学生信息管理系统以学生为中心&#xff0c;通过…

机器学习筑基篇,​Ubuntu 24.04 编译安装 Python 及多版本切换

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 编译安装最新Python及多版本切换 描述&#xff1a;说到机器学习&#xff0c;人工智能&#xff0c;深度学习不免会提到Python这一门编程语言&#xff08;人生苦短&#xff0c;及时Pyt…

【MySQL】逻辑架构与存储引擎

一、逻辑架构 1、MySQL逻辑架构 我们可以根据上图来对sql的执行过程进行分析 第一步&#xff1a;客户端与服务器建立一个连接&#xff0c;从连接池中分配一个线程处理SQL语句第二步&#xff1a;SQL接口接受SQL指令第三步&#xff1a;如果是5.7版本&#xff0c;就会先去缓存中…