首页 > 其他分享 >STA 静态时序分析 第十章——鲁棒性分析(2)

STA 静态时序分析 第十章——鲁棒性分析(2)

时间:2024-12-12 13:57:54浏览次数:4  
标签:STA 功耗 时序 信号 鲁棒性 门控 单元 时钟

这章节介绍了一些特别的STA分析:时间借用(time borrowing),时钟门控(clock gating),非时序检查(non-sequential timing checks)。此外,先进的STA概念如片上变化(on chip variation),统计时序(statistical timing),时序和功耗之间的折中平衡(trade off between timing and power)。


之前的文章STA 静态时序分析 第十章——鲁棒性分析(1)


目录

10.5 时钟门控检查

高电平有效的时钟门控检查

低电平有效的时钟门控检查

使用MUX的时钟门控

使用反转时钟的时钟门控检查

10.6 功耗管理

10.6.1 时钟门控

10.6.2 电源门控

10.6.3 多阈值电压单元

具有高活动性的高性能模块

具有低活动性的高性能模块

10.6.4 阱极偏置

10.7 反标(Backannotation)

10.7.1 SPEF

10.7.2 SDF

10.8 签核方法论

寄生参数互连角(parasictic interconnect corners)

工作模式(operating modes)

PVT 工艺角

多模式多角分析(Multi Mode Multi Corner Analysis)


10.5 时钟门控检查

如果一个门控信号,可以控制逻辑单元时钟信号的路径,此时有时钟门控检查。如下图。逻辑单元中,连接到时钟的引脚称为时钟引脚(clock pin),门控信号连接到的引脚称为门控引脚(gating pin)。时钟门控发生的单元也称为门控单元。

条件:

1. 门控单元时钟的使用必须要作为下游时钟(downstream)。这一条件要求经过门控单元的时钟信号必须在后续电路中仍然作为时钟信号使用。如果该时钟信号在门控单元之后没有继续作为时钟,那么就没有必要进行时钟门控检查,因为没有时钟信号在后续电路中影响工作。因此,时钟门控检查只对那些在门控单元后继续驱动其他模块的时钟有效。下游的时钟使用方式可以是:

  • 触发器时钟:时钟信号驱动触发器或寄存器;
  • 扩展到输出端口:时钟信号通过门控单元传递并影响电路的输出;
  • 生成时钟:门控单元的输出作为其他时钟生成模块的时钟源。

2.  时钟门控单元的门控信号引脚上的信号不应是时钟信号。如果该信号是时钟信号,那么该时钟信号不应在下游被再次用作时钟。

在通常情况下,时钟信号以及门控信号无需连接到一个单独的逻辑单元,比如说与门、或门,但是可以是任意逻辑块的输入。这情况下,检查的时钟引脚、门控引脚,必须扇出到共同的输出引脚(可能经过一些逻辑,比如都连到一个与门的输入,然后得到输出)。

有两种时钟门控检查:

  • 高电平有效时钟门控检查:门控单元中有与门、与非门
  • 低电平有效时钟门控检查:门控单元中有或门、或非门

"Active-high" 和 "Active-low" 指的是门控信号的逻辑状态,这些状态用于激活门控单元输出的时钟信号。如果门控单元是一个复杂的功能单元,且其门控关系不明显(例如多路复用器或异或门单元),那么STA的输出通常会提供一个警告,提示未推断出时钟门控检查。然而,可以通过显式地使用 set_clock_gating_check 命令为门控单元指定时钟门控关系来改变这一情况。在这种情况下,如果 set_clock_gating_check 指定的时钟门控关系与门控单元的功能不一致,STA通常会提供警告。我们将在本节后面展示此类命令的示例。

如前所述,时钟只能作为门控信号,前提是它在下游没有被用作时钟。考虑下图中的示例。由于 CLKA 衍生的时钟定义,CLKB 在下游没有被用作时钟 —— CLKB 的路径被衍生时钟的定义所阻塞。因此,对于与门单元,时钟 CLKA 会推断出时钟门控检查。

高电平有效的时钟门控检查

这项检查在与门、与非门处发生,如下图所示。门控单元的引脚B是时钟信号,引脚A是门控信号。假设AB时钟有着同样的波形。

create_clock -name CLKA -period 10 -waveform {0 5} \
[get_ports CLKA]
create_clock -name CLKB -period 10 -waveform {0 5} \
[get_ports CLKB]

由于是与门,UAND0门控引脚A的高电平打开了门控单元,允许时钟信号传播。时钟门控检查的目的是验证门控引脚的转换不会为输出时钟引起一个有效的边缘(如果引起了一个有效的边缘就会对后一级的触发器造成影响)。对于正边沿触发的逻辑,这意味着门控信号的上升沿应该发生在时钟的时钟低电平。类似地,对于负边沿触发的逻辑,门控信号的下降沿应该仅发生在时钟低电平时。如果时钟同时驱动正边沿和负边沿触发的触发器,那么门控信号的任何转换(无论是上升沿还是下降沿)必须只发生在时钟为低电平时。下图展示了一个门控信号在激活边缘期间的转换例子,这种转换需要被延迟以通过时钟门控检查。

 下面是时序检查报告:

注意到Endpoint显示出他是一个时钟门控检查。此外,这条路径在clock_gating_default 路径组中。这个检查验证了门控信号在CLKB10ns处正边沿到来之前就已经发生了改变。

高电平有效时钟门控保持检查,要求在时钟信号的负边沿之后,门控信号才能发生改变。下面是保持时间报告。

保持时间门控检查违例。因为门控信号变的太快,在CLKB在5ns的下降沿到来之前就已经发生了变化,如果在 UDFF0/QUAND0/A1 引脚之间增加了 5ns 的延迟,那么时钟门控的建立和保持检查都将通过,这验证了门控信号只在指定的时间窗口内发生变化。

可以看出,保持时间要求相当大。这是由于门控信号的极性与被门控的触发器相同所导致的。这个问题可以通过使用不同类型的启动触发器来解决,比如使用负边沿触发的触发器来生成门控信号。此时由于与门A2的输入引脚为低电平,就算是A1得到了UFF0捕获的数据为1,也不会引起与门输出由0-1的变化,从而不会对UFF1这个正边沿触发的触发器造成影响。接下来将展示一个这样的例子。下图中,触发器 UFF0 由时钟 CLKA 的负边沿控制。安全的时钟门控意味着触发器 UFF0 的输出必须在门控时钟的非激活部分发生变化,即在 5ns 到 10ns 之间。

 与描述相符的波形,如下图所示。

 建立时间的时序报告如下:

 下面是保持时间时序报告

 由于发起门控信号的边沿与门控信号的边沿是相反的,所以建立时间和保持时间的要求容易达到。这是用于门控时钟的最常见的结构。

低电平有效的时钟门控检查

下图展现了低电平有效的时钟门控检查。代码如下。

create_clock -name MCLK -period 8 -waveform {0 4} \
[get_ports MCLK]
create_clock -name SCLK -period 8 -waveform {0 4} \
[get_ports SCLK]

低电平有效门控检查验证了门控信号的上升沿是否当时钟为高电平时候到达,适用于正边沿触发的逻辑。如前所述,关键在于门控信号不应引发输出门控时钟的有效边缘。当门控信号为高时,时钟信号不能通过。因此,门控信号应该仅在时钟为高电平时切换,如下图所示。以下是低电平有效时钟门控建立时序报告。此检查确保门控信号在时钟边缘变为低电平之前到达,在此例中是 4ns。应当在时钟信号SCLK的高电平期间到达,原因在于门控的逻辑为或,SCLK为高电平,则或门输出恒为1不会发生改变,从而也不会引起有效的边沿。如果在SCLK的低电平期间到达了,并且,UDFF0捕获并传送到A1的数据为1,那么就会引起或门的输出由0-1的变化,从而引起有效的边沿,对后续的逻辑产生影响。

下面是时钟门控保持时间时序报告,这个检查保证了门控信号在时钟信号的上升沿之后才开始变化,也就是0ns。

使用MUX的时钟门控

下图展示了使用多路复用器单元的时钟门控示例。时钟门控检查会确保多路复用器的选择信号在正确的时机到达,以便干净地在MCLK和TCLK之间切换。在这个示例中,我们关心的是切换到MCLK,并假设当选择信号切换时,TCLK处于低电平。这意味着,多路复用器的选择信号应仅在MCLK为低电平时切换。这类似于高电平有效的时钟门控检查。

下图中展示了时序的关系,MUX的选择信号只能在MCLK为低电平的时候到达。同时我们也假设TCLK当选择信号改变的时候始终保持低电平。由于门控单元是一个复用器,时钟门控检查不会自动推断出来,就像下面这个警告所述。

Warning: No clock-gating check is inferred for clock MCLK at pins UMUX0/S and UMUX0/I0 of cell UMUX0.

Warning: No clock-gating check is inferred for clock TCLK at pins UMUX0/S and UMUX0/I1 of cell UMUX0.

但是,我们我可以使用set_clock_gating_check 来显式的指定一个时钟门控检查。

set_clock_gating_check -high [get_cells UMUX0]
# The -high option indicates an active-high check.
set_disable_clock_gating_check UMUX0/I1

disable这行代码,关闭了在指定引脚上进行的时钟门控检查,因为我们并不关心这个引脚的行为。我们在上述代码中指定了这是一个高电平有效的时钟门控检查。下面是建立时间报告。

上面是为了验证在选择信号在MCLK的下个上升沿之前到来。下面是时钟门控保持时间报告,是为了验证在MCLK的本下降沿之后到来。

使用反转时钟的时钟门控检查

在这个例子中,连接到触发器的时钟被反转了,触发器的输出是门控信号。由于门控单元是一个与门,所以门控信号只能在与门的时钟信号为低电平时候改变。

下面是建立时间检查的例子。

注意到,建立时间检查验证了数据在15ns的上升沿之前变化。

 保持时间检查验证数据是否在MCLK10ns的下降沿之前变化。

在当门控单元是一个复杂单元且建立时间和保持时间检查不明显的情况下,可以使用 set_clock_gating_check 命令来指定门控信号的建立和保持检查,该门控信号用于控制时钟信号的门控。建立时间检查验证门控信号在时钟信号的有效边缘之前是否稳定。建立时间失败可能会导致门控单元输出出现毛刺。保持时间检查验证门控信号是否在时钟信号的无效边缘处稳定。以下是一些 示例:

set_clock_gating_check -setup 2.4 -hold 0.8 \
[get_cells U0/UXOR1]
# Specifies the setup and hold time for the clock gating check at the specified cell.
set_clock_gating_check -high [get_cells UMUX5]
# Check is performed on high level of clock. Alternately, the low option can be used for an active-low clock gating check.

10.6 功耗管理

管理功耗是任何设计中非常重要的一个方面,涉及到功耗如何实现。在设计实现过程中,设计师通常需要评估不同的方法,以在速度、功耗和面积(speed, power and area)之间做出权衡。

如第三章所述,设计中逻辑部分的功耗由泄漏功耗(leakage power)和活动功耗(activity power)组成。此外,模拟宏单元(analog macros)和输入输出缓冲区(IO buffers)(尤其是那些具有主动终端的缓冲区)也可能消耗功耗,这些功耗与活动无关,且不是泄漏功耗。本节将重点讨论在设计的逻辑部分中消耗的功耗的权衡。

通常来说,管理来自数字逻辑(包括标准单元和存储宏单元)的功耗贡献有两个主要考虑因素:

  • 最小化设计的总活动功耗:设计师需要确保总功耗保持在可用的功率限制内。设计的不同工作模式可能有不同的功耗限制。此外,设计中使用的不同电源也可能有各自不同的功率限制。

  • 最小化设计在待机模式下的功耗:对于电池供电的设备,例如手机,目标是尽可能减少待机模式下的功耗。待机模式下的功耗包括泄漏功耗以及在待机模式下仍然处于活动状态的逻辑部分的功耗。如上所述,还可能存在其他模式(如睡眠模式),这些模式对功耗有不同的约束条件。

本节描述了多种功耗管理的方法。每种方法都有其优缺点,下面将对这些优缺点进行讨论。

10.6.1 时钟门控

如第3章所述,触发器上的时钟活动是总功耗的一个重要组成部分。即使触发器的输出没有发生变化,触发器由于时钟翻转也会消耗功耗。考虑下图中的示例,其中触发器只有在使能信号EN激活时才接收新的数据,否则它保持之前的状态。当使能信号EN处于非激活状态时,触发器上的时钟翻转虽然没有导致输出变化,但时钟活动仍然会导致触发器内部的功耗。时钟门控的目的是通过在触发器输入不活跃的时钟周期中消除触发器上的时钟活动,从而最小化这一功耗。通过时钟门控进行的逻辑重构在触发器引脚处引入了时钟门控。下图中展示了时钟门控引起的转换示例。

时钟门控因此保证了触发器的时钟引脚,只在数据输入引脚有新数据存在时,才进行翻转(toggle)。

10.6.2 电源门控

电源门控是通过切断电源供应来关闭不活跃模块的电源。这个过程如下图所示,其中在电源供应与模块之间串联了一个 footerheader MOS晶体管。控制信号 SLEEP 被配置为在模块正常工作时,footer 或 header MOS晶体管处于导通状态。由于电源门控MOS晶体管(footer或header)在正常操作期间是导通的,模块就会被供电并以正常功能模式运行。在模块处于不活跃(或睡眠)模式时,门控MOS晶体管被关闭,这样就消除了逻辑模块中的任何活动功耗。footer 是一个大型 NMOS 晶体管,位于实际接地和模块的接地网之间,由电源门控控制;而 header 是一个大型 PMOS 晶体管,位于实际电源和模块的电源网之间,也由电源门控控制。在睡眠模式下,模块中唯一的功耗来自于通过 footer(或header)晶体管的泄漏功耗。

footer 或 header 通常通过多个电源门控单元实现,这些单元对应多个并联的 MOS 器件。footer 和 header 器件会在电源供应路径中引入串联电阻。如果导通电阻的值过大,通过门控 MOS 器件的 IR 压降可能会影响逻辑模块中单元的时序。关于门控器件大小的主要标准是确保导通电阻值足够小,但这之间存在一个权衡,因为电源门控 MOS 器件决定了在非活动或睡眠模式下的泄漏电流。
总的来说,为了确保在活动模式下最小化串联电阻带来的 IR 降压,应该有足够数量的电源门控单元并联。然而,在非活动或睡眠模式下,门控单元的泄漏电流也是选择并联电源门控单元数量时需要考虑的一个标准。 

10.6.3 多阈值电压单元

如3.8小节中所述,通常使用多种Vt单元来权衡速度与泄漏。高Vt单元的泄漏较小,但速度较慢;而标准Vt单元则速度较快,但泄漏较高。类似地,低Vt单元比标准Vt单元更快,但相应地,泄漏也较高。

在大多数设计中,目标是最小化总功耗,同时实现所需的操作速度。尽管泄漏可能是总功耗的重要组成部分,但仅通过实现全部使用高Vt单元来减少泄漏,可能会导致总功耗增加,即使泄漏已减少。这是因为,在这种设计中,可能需要更多的或更强大的高Vt单元才能达到所需的性能。等效门数的增加可能会使得活动功耗的增加,远远超过由于使用高Vt单元导致的泄漏功耗减少。然而,也存在一些场景,其中泄漏是总功耗的主导成分;在这种情况下,使用高Vt单元的设计可能会导致总功耗的减少。上述在不同Vt单元之间的权衡(在速度和泄漏方面)需要根据设计和其切换活动特征适当地利用。以下将展示两个高性能模块的场景,其中根据模块的活动性或低切换活动性,实施方法可能不同。

具有高活动性的高性能模块

这种情况下,功耗主要取决于动态功耗。这种情况,如果只盲目的减少漏功耗,反而会导致总功耗的上升(具体原因前面说了)。最初设计的实现,应当使用标准Vt或者低Vt单元来满足性能的要求。在满足时序的要求之后,沿着时序路径中,有着正裕度的模块,可以尝试使用更高Vt的单元来实现,这样就既可以满足时序的要求,也能减少漏电的功耗。因此,在最终的实现中,标准Vt单元只会被用在那些关键路径(或很难满足时序的路径),其他不是关键路径,时序较为宽松的,将会使用高Vt的单元。

具有低活动性的高性能模块

这种情况下,泄漏功耗成为整体功耗中非常重要的一个部分。由于具有低活动性,动态功耗不是这个设计整体功耗的主导因素。这样的模块,最初的设计实现将会尝试用高Vt的单元。这里有一个例外,时钟树一直活跃,因此对他使用标准的Vt单元。只使用高Vt单元的初步实现以后,可能会存在一些时序路径,他的时序无法满足要求。这些路径上的单元,就不再用高Vt的单元而是使用标准的Vt单元去满足预期的性能。

10.6.4 阱极偏置

阱极偏置是指在NMOS和PMOS器件的P-well或N-well上加一个小的电压偏置。NMOS器件的衬底(或P-well)通常连接到地。类似地,PMOS器件的衬底(或N-well)通常连接到电源轨。

如果衬底连接施加一个轻微的负偏置,泄漏功耗可以显著减少。这意味着,NMOS器件的P-well连接到一个小的负电压(例如-0.5V),而PMOS器件的N-well连接到一个比电源轨高的电压(例如Vdd + 0.5V)。通过施加衬底偏置,虽然会影响单元的速度,但泄漏功耗会大大降低。单元库的时序是考虑了衬底偏置后的结果。

使用衬底偏置的缺点是,它需要额外的电源电压(例如-0.5V和Vdd+0.5V)来提供P-well和N-well的供电电压。


10.7 反标(Back Annotation)

10.7.1 SPEF

STA 如何知道设计的寄生参数呢?通常这是使用一个寄生参数提取工具来实现的,数据以SPEF的格式被STA工具读取。详细的信息,以及SPEF的格式在附录C中有。

一个物理层设计的布局工具的STA引擎,通常也进行这样的操作,不同的是提取到的信息存入了内部的数据库。

10.7.2 SDF

某些情况下,单元以及互连的延时由别的工具进行计算,STA通过SDF的形式进行读取。使用SDF的优点在于单元延时以及互连延时不再需要被计算。因为这些延时可以直接从SDF得到,STA就可以专心致志的完成时序检查了。但是,这种延时标注的缺点就在于STA不能进行串扰的计算,因为寄生参数的有关信息是没有的。SDF通常是一种用来将延时信息传递给仿真器的机制。

SDF的详细内容在附录B。


10.8 签核方法论

STA可以在多种不同的情况下运行。不同的情况主要由三个变量决定:

  • 寄生角(parasitic corners):RC互连角,以及用于寄生参数提取的工作条件
  • 工作模式(operating mode)
  • PVT角

寄生参数互连角(parasictic interconnect corners)

寄生参数可以在不同的工艺角下进行提取,这通常由金属走线的宽度以及生产过程中的金属刻蚀决定。其中一些是:

  • Typical:指的是互连电阻和电容的标准值。
  • Max C:这指的是互连角有着最大的电容。互连电阻比Typical的情况小。这个角会导致较短网络的路径延迟最大,因此可用于最大路径分析。
  • Min C:这指的是互连角有着最小的电容。互连电容比Typical的情况大。这个角会导致较短网络的路径延迟最小,因此可用于最小路径分析。
  • Max RC:这指的是互连角有着最大的RC乘积。这通常对应着更大的刻蚀,减少了走线的宽度。这会导致相对于标准值,有更大的电阻,有更小的电容。总的来说,这个角会导致有较长互连的路径有着最大的延时,可以用于最大路径分析。
  • Min RC:这指的是互连角有着最小的RC乘积。这通常对应于较小的刻蚀,增加了走线的宽度。这会导致相对于标准值,有更小的电阻,有更大的电容。总的来说,这个角会导致有较长互连的路径有着最小的延时,可以用于最小路径分析。

基于上述描述的不同的互连R、C,工艺角的大C会导致小R;小C会导致大R。因此,电阻部分地补偿了电容在不同工艺角下的变化。这意味着,对于所有类型网络的延迟,没有一种角对应的是极限情况(最坏情况或者是最好情况)。使用Cworst、Cbest 角,只是针对于较短网络是极限的;但是RCworst、RCbest 角,针对于较长网络是极限的。Typical 角,针对于平均长度的网络是极限的(也就是不长不短的网络)。因此,设计人员经常需要在上述不同的互连角下验证时序能否满足。但是,即使在每个角处都进行了验证也可能无法涵盖所有可能的情况,因为不同的金属层实际上可以独立地处于不同互连角下,例如:在金属层2,有着Max C 角;在金属层1,有着Max RC 角;等等情况都有可能发生。在10.9中描述的静态时序分析,提供了一种方法,从而使得不同的金属层可以使用不同的互连工艺角。

工作模式(operating modes)

操作模式规定了设计所要执行的操作,设计的各种操作模式包括:

  • Functional mode 1 (for e.g. high-speed clocks)
  • Functional mode 2 (for e.g. slow clocks)
  • Functional mode 3 (for e.g. sleep mode)
  • Functional mode 4 (for e.g. debug mode)
  • Test mode 1 (for e.g. scan capture mode)
  • Test mode 2 (for e.g. scan shift mode)
  • Test mode 3 (for e.g. bist mode)
  • Test mode 4 (for e.g. jtag mode)

PVT 工艺角

 PVT 工艺角规定在什么环境下进行静态时序分析。最常见的PVT工艺角为:

  • WCS (slow process, low power supply, high temperature):慢工艺,低供电电压,高温
  • BCF (fast process, high power supply, low temperature):快工艺,高供电电压,低温
  • Typical (typical process, nominal power supply, nominal temperature):典型工艺,标准供电电压,标准温度
  • WCL (worst-case slow at cold - slow process, low power supply, low temperature):慢工艺,低供电电压,低温

或者其他的情况。

STA可以在任何情况下进行,这里的情况指的是:互连角、工作模式、PVT工艺角的组合。

多模式多角分析(Multi Mode Multi Corner Analysis)

多模式多角度(MMMC)分析是指在多个工作模式、PVT角点(过程、温度、电压角点)和寄生互连角点下同时执行静态时序分析。例如,考虑一个具有四个工作模式(正常、睡眠、扫描移位、JTAG)的设计单元(DUA),并在三个PVT角点(WCS、BCF、WCL)和三个寄生互连角点(典型、最小C、最小RC)下进行分析,如下表所示。

总共有36种可能的情境,可以在这些情境下执行所有时序检查,例如设置时间、保持时间、上升/下降时间和时钟门控检查。根据设计的大小,同时在所有三十六种情境下运行静态时序分析,可能会导致过长的运行时间。在某些情况下,某些情境可能不需要执行,因为它们可能已经包含在另一个情境中,或者某些情境本身可能不必要。例如,设计人员可能会判断情境4、6、7和9不相关,因此不需要进行分析。同时,也不必在一个角点下运行所有模式,例如在情境5中,扫描移位模式(Scan Shift)或 JTAG模式可能不需要。若系统支持多模式多角点能力,则可以仅在一个单一情境下运行STA,或者在多个情境下并行运行STA。

运行多模式多角点(MMMC)静态时序分析的优势在于节省了运行时间和分析脚本设置的复杂度。在MMMC场景中,设计和寄生效应只需要加载一次或两次,而不像每个模式或角点那样需要多次单独加载。此外,这种任务也更适合在LSF集群上运行。多模式多角点在优化流程中具有更大的优势,因为优化是在所有场景下进行的,这样在一个场景中修复的时序违规不会在另一个场景中引入新的时序违规。

对于I/O约束,可以用 -add delay 选项与多个时钟源一起分析不同的模式,例如扫描模式(Scan)或内建自测试模式(BIST),或者分析PHY1中不同的工作模式,这些模式对应不同的速度。通常,每个模式会在单独的运行中分析,但并非总是如此。

在设计中,通常会有大量的时钟,可能需要数十次独立的运行来覆盖所有模式,包括最大角点和最小角点,以及考虑串扰和噪声的影响。


部分内容翻译自“Static Timing Analysis for Nanometer Designs A Practical Approach”  欢迎指正!

标签:STA,功耗,时序,信号,鲁棒性,门控,单元,时钟
From: https://blog.csdn.net/Lvplus7/article/details/144241528

相关文章

  • 【stablediffusion教程】你们要的AI换装秀来了,一秒换10件衣服,AI绘画详细教程
    前言昨天有粉丝留言,问如何让人物在保持现有姿势不变的情况下对小姐姐的图片进行换装,这不,你们要的AI换装秀来了,具体如何制作,看我一步一步操作给大家看。1、准备****换装图片首先,先准备一段tag,我们用它生成一个AI小姐姐的图片。当然,你也可以自己准备一张现实中拍的图片......
  • 【StableDiffusion教程】使用Stable Diffusion制作角色三视图
    使用StableDiffusion制作角色三视图,可以借助ControlNet功能来实现人物姿势控制,并结合LoRA模型进行精细调整。以下是一般步骤:安装StableDiffusionWebUI:建议使用最新版本,并确保已安装并正确配置ControlNet和LoRA模型。准备角色描述:用简洁明了的文字描述角色的特征......
  • 在node.js项目开发时,如何决定一个依赖是dependencies依赖还是devDependencies依赖?例如
    在Node.js项目中,决定一个依赖是dependencies还是devDependencies主要取决于该依赖的用途:它是用于生产环境(生产依赖)还是仅用于开发环境(开发依赖)。1.dependencies(生产依赖)这些依赖是应用程序在运行时所需的。无论是部署到生产环境,还是在开发环境进行测试,应用都会需要这些依......
  • 还在使用定时器吗?试试requestAnimationFrame
    目录基本认识简介停止自动停止手动停止使用场景js动画前言:相信能点进来看我博客的小伙子们,应该都是前端吧。那想必是知道定时器或者requestAnimationFrame 吧。这里说的重点呢就是 requestAnimationFrame。如果你对它并不了解,那我下文中也会对它进行补充说明的。......
  • 如何避免易优EyouCms在使用过程中出现“SQLSTATE[HY000]: General error: 1615 Prepar
    在使用易优EyouCms时,为了避免出现“SQLSTATE[HY000]:Generalerror:1615Preparedstatementneedstobere-prepared”的错误,可以采取以下预防措施和优化步骤。这个错误通常是由于数据库配置不当或预处理语句处理不当引起的。以下是详细的解决方案:正确配置数据库参数:使用......
  • The 3rd Universal Cup. Stage 15: Chengdu I. Good Partitions
    I.GoodPartitions非预期解,思考方式和官解完全不同,所以写一个题解供参考。题面就不复述了,上面链接里有,直接看题解。不妨考虑映射到\([a_0,a_1,a_2,\ldots,a_{n-1}]\),我们划分为长为\(k\)的段时,每个段可以被描述为\([a_{ik},a_{ik+1},\ldots,a_{(i+1)k-1}]\),容......
  • FastAPI Pydantic 模型
    Pydantic是一个用于数据验证和序列化的Python模型库。它在FastAPI中广泛使用,用于定义请求体、响应体和其他数据模型,提供了强大的类型检查和自动文档生成功能。以下是关于Pydantic模型的详细介绍:1.定义Pydantic模型使用Pydantic定义一个模型非常简单,只需创建一......
  • FastAPI 请求和响应
    在FastAPI中,请求(Request)和响应(Response)是与客户端交互的核心。FastAPI提供了强大的工具来解析请求数据,并根据需要生成规范的响应。接下来我们来详细看下FastAPI的请求和响应。请求数据查询参数以下实例中我们定义了一个 /items/ 路由,接受两个查询参数 skip 和 ......
  • FastAPI 基本路由
    在FastAPI中,基本路由是定义API端点的关键。每个路由都映射到应用程序中的一个函数,用于处理特定的HTTP请求,并返回相应的响应。根路径路由创建FastAPI实例和根路径路由:实例from fastapi import FastAPIapp = FastAPI()@app.get("/")def read_root():  ......
  • 【C++】static 知识整理 【静态与局部静态】
    目录类外类内局部静态localstatic类外类内类外C++的静态可以分为两种情况来讨论:在类外和在类内。对于静态变量/函数,链接将只在内部(如果不用static,那么在不同文件定义同名变量会报错)声明定义在其他地方的变量需要使用extern,函数则不需要类内静态变量/方法将与类的所有实例......