时序约束高级进阶使用详解一:Set_max_delay

目录

一、前言

二、设计示例

2.1 示例代码

2.2 时序约束

三、Set_max_delay

3.1 start points

3.1.1 对象有效性

3.1.2 边沿有效性

3.1.3 start point非有效起点

3.2 Through points

3.2.1 约束对象为Cells

3.2.2 约束对象为Cell pin/Net

3.3 to points

3.4 rise/fall

​3.5 only datapath

3.6 Reset path

3.7 多对象设置


一、前言

    关于Set_max_delay/Set_min_delay的基础用法之前的文章已进行过简单的介绍,主要作用就是修改时序路径默认的setup/recovery或hold/removal时间要求,本章将对约束Set_max_delay的一些细节使用进行解释。

二、设计示例

    以一个简单的3个触发器为例,包含同步时钟路径和异步时钟路径,以异步时钟路径为主

2.1 示例代码

module MAX_MIN(d1,clk1,clk2,ce,ff3);
input d1,clk1,clk2,ce;
output ff3;
reg ff1,ff2,ff3;
wire bus;
always@(posedge clk1,negedge ce)
begin
if(!ce)
begin
ff1<=0;
end
else begin
ff1<=d1;
 end
end

always@(posedge clk2,negedge ce)
begin
if(!ce)
ff2<=0;
else begin
ff2<=ff1;
end
end

assign bus=ff2+ff1;
always@(posedge clk2)
begin
if(!ce)
 ff3<=0;
 else begin
 ff3<=bus;
 end
end
endmodule

连接关系如下图,clk1中同步时序路径下,ff1_reg到ff2_reg,clk1与clk2的异步时序路径中,ff1_reg和ff2_reg逻辑运算后输出到ff3_reg

2.2 时序约束

此处主要是主时钟约束

create_clock -period 10.000 -name clk1 -waveform {0.000 5.000} -add [get_ports clk1]
create_clock -period 8.000 -name clk2 -waveform {0.000 4.000} -add [get_ports clk2]

三、Set_max_delay

Set_max_delay约束的设置中,不仅可以指定起点,中间点,终点,还可以设置对应单元生效的上升沿或下降沿,生成时序报告时建议将配置nworst和max path设大,可报告出所有路径

3.1 start points

start points为set_max_delay约束的时序路径起点,需为时序路径的有效起点,可为Clock,Cell,Cells pin,IO port

3.1.1 对象有效性

以clock为clk2为例,设置约束如下

set_max_delay -rise_from [get_clocks clk2] 1.111

只有以clk2为源时钟,并且上升沿触发的时序路径约束才会生效

源时钟为clk1,目的时钟为clk2的不属于约束范围

3.1.2 边沿有效性

对源时钟为clk1,下降沿的路径设置max_delay

set_max_delay -fall_from [get_clocks clk1] 1.111

下面ff1_reg到ff2_reg的路径因为clk1为上升沿有效,因此max_delay约束不生效

将约束设置为clk1的上升沿有效

set_max_delay -rise_from [get_clocks clk1] 1.111

此时约束生效

3.1.3 start point非有效起点

将ff1_reg/D设置为max_delay的起点,因为ff1_reg/D不是有效的时序路径起点,约束不会生效

set_max_delay -from [get_pins ff1_reg/D] 1.111

同时有对应的告警

如果将ff1_reg/C设置为max_delay的起点,同时上升沿有效

set_max_delay -rise_from [get_pins ff1_reg/C] 1.111

以path17的结果看出,符合上述约束条件,因此约束生效

约束的对象如果非时序路径的有效起点时,会导致路径分段

3.2 Through points

3.2.1 约束对象为Cells

约束对象为Cell时,设置的Transition边沿是直接对该单元的相应边沿生效,查看的路径都是ff1_reg到ff3_reg的时序路径

a)以经过中间的组合逻辑ff3_i_1(LUT2)为例,Transition默认为rise/fall,即上升沿下降沿都支持,在Transition为默认值时,约束命令如下

set_max_delay -through [get_cells ff3_i_1] 1.111

查看对应的时序报告结果,此时ff3_i_1使用为上升沿时约束生效

查看ff3_i_1为下降沿时的路径,约束依旧生效

b)修改约束,指定Transition为下降沿fall_through

set_max_delay -fall_through [get_cells ff3_i_1] 1.111

此时时序路径中ff3_i_1为下降沿的4条路径,约束生效

ff1_reg到ff3_reg的另外4条路径中因为ff3_i_1为上升沿,故约束不生效

3.2.2 约束对象为Cell pin/Net

当through point的对象更加具体,如为pin时,此时Transition是体现在对应对象的时序边沿上

a)修改约束对象为pin,指定ff3_i_1/I0为下降沿fall_through

set_max_delay -fall_through [get_pins ff3_i_1/I0] 1.111

时序报告中,ff2_reg到ff3_reg中约束生效的4条路径中,ff3_i_1前面连接的ff2_reg都为下降沿触发

对于另外4条ff2_reg到ff3_reg约束未生效的的时序路径中,ff2_reg为上升沿触发,故不属于约束生效的范围

3.3 to points

to points的与start points的使用相同,可参见start piont的介绍

3.4 rise/fall

在options中勾选Only rising/falljing path delays are to be constrained,下拉框中选择rising/falling可对约束路径设置边沿生效,边沿为终点数据端口的边沿

以下列约束rise为例

set_max_delay -rise -from [get_clocks clk1] 2.222

第20号路径生效,对应data path中ff2_reg/D的边沿为上升沿

第17号路径中,data path中 ff2_reg/D的边沿为下降沿,故不生效

​3.5 only datapath

勾选set maximum delay for only the datapath时,将不会考虑发起时钟和捕获时钟间的skew和hold检查。带有only the datapath设置时必须指定from对象

示例约束如下

set_max_delay -datapath_only -from [get_clocks clk1] 1.111

报告如下,无source clock path,无对应的hold分析,只有setup

因为不考虑source clock path,故没有skew

3.6 Reset path

Set max delay约束中存在一个配置项"Remove existing path exceptions before setting path delays",即约束的路径上如果已存在max_delay时序约束时是否被新的覆盖

以如下两条约束为例,

set_max_delay -from [get_clocks clk1] -to [get_clocks clk2] 1.111
set_max_delay -from [get_clocks clk1] 2.222

第二条max_delay无reset_path时,尽管第二条是后加的,但生效的是第一条约束1.111

如果第二条约束添加-reset_path,则会覆盖第一条的约束

set_max_delay -from [get_clocks clk1] -to [get_clocks clk2] 1.111
set_max_delay -reset_path -from [get_clocks clk1] 2.222

报告结果如下图

3.7 多对象设置

    start/through/to中也可以同时设置多个对象,将同时生效。如下图中对from为ff1_reg/C和ff2_reg/C的时序路径都设置max delay为2.222ns

set_max_delay -from [get_pins {ff1_reg/C ff2_reg/C}] 2.222

相关路径都将生效

内容概要:本文介绍了如何使用Python识别图片和扫描PDF中的文字。首先,文章讲解了使用Spire.OCR for Python库来识别图片中的文字,包括安装库、配置OCR模型路径和语言设置、扫描图片以及保存识别后的文本。其次,详细描述了从图片中提取文字及其坐标位置的方法,使用户不仅能够获取文本内容,还能知道文本在图片中的具体位置。最后,文章还介绍了如何结合Spire.PDF for Python将PDF文件转换为图片格式,再通过OCR技术从中提取文字,适用于处理扫描版PDF文件。文中提供了完整的代码示例,帮助读者理解和实践。 适合人群:对Python编程有定基础,希望学习或提高光学字符识别(OCR)技术的应用开发者,尤其是需要处理大量图片或PDF文档中文字信息的工作人员。 使用场景及目标:① 开发者可以利用这些方法自动化处理图片或PDF文档中的文字信息,提高工作效率;② 实现从非结构化数据(如图片、扫描件)到结构化数据(如文本文件)的转换,便于后续的数据分析和处理;③ 提供了种解决纸质文档数字化的有效途径,特别是对于历史档案、书籍等资料的电子化保存。 其他说明:需要注意的是,OCR的准确性很大程度上取决于图片的质量,清晰度高、对比度好的图片可以获得更好的识别效果。此外,不同OCR库可能对特定语言或字体的支持程度不同,选择合适的库和配置参数能显著提升识别精度。在实际应用中,建议先进行小规模测试,优化参数后再大规模应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA芯中的小蚂蚁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值