让我们从分析参考设计入手。通过研读用户手册,可以掌握其功能特性,进而推导出设计需求。基于这些需求,我们能更深入地理解底层实现原理,最终透彻把握复位机制的设计思路。
参考设计
参考设计是Xilinx的Processor System Reset核,用户手册是Xilinx的PG164。
关键特性
a)支持外部异步复位输入,且该复位后续会和时钟同步。
b)外部复位输入和辅助复位输入均可配置为高有效或低有效。
c)可配置复位输入的最小脉冲宽度(确保复位被稳定识别)。
1)板级复位(如按键)可能因机械抖动产生毛刺,若模块直接识别这类信号,会导致系统误复位。通过配置最小脉冲宽度(如5个时钟周期),只有持续时间达到阈值的复位信号才会被识别,有效过滤毛刺,避免系统因偶然干扰误触发复位。
d)支持DCM锁定输入。
1)FPGA中DCM用于生成系统所需时钟,若DCM未锁定(如上电初期、时钟源波动),输出时钟频率/相位异常,此时系统运行会出错。该特性将DCM锁定信号接入复位模块,一旦DCM失锁,模块立即触发所有复位输出,强制系统进入复位状态;待DCM重新锁定后再释放复位,确保系统仅在时钟稳定时工作。
e)支持生成上电复位POR。
1)FPGA上电时,各组件(寄存器、RAM、外设)初始化速度不同,若无统一上电复位,可能出现部分组件未就绪但已开始工作的情况(如处理器先启动,总线未初始化导致数据传输失败)。模块在上电后前2个时钟内激活所有复位,持续16个时钟周期,为所有组件提供充足初始化时间,避免上电初期的功能异常。
f)可通过参数配置为核心与互连结构生成低有效复位信号。
g)复位信号释放时序可控:总线结构(互连结构与桥接单元)先释放复位、外设(UART、SPI、IIC)在16个时钟周期后释放复位、MicroBlaze处理器在外设释放复位后,再经过16个时钟周期释放复位。
功能说明
a)

1)该核心包含5个输入和5个输出信号,通过总线复位、外设复位、互联复位的数量选择,可生成额外的输出信号。
b)该模块接收两个参数:外部复位有效窗口宽度、辅助复位有效窗口宽度。这两个参数用于设定外部复位与辅助复位信号相对于最慢同步时钟的最小持续时间,只有达到该时间,复位信号的变化才能被核检测到并响应。注意,辅助复位和外部复位二者功能逻辑完全一致。
1)外部复位通常对应板级触发,针对整体上电或人工干预。而辅助复位,则对应内部触发,如检测到硬件故障、软件主动请求复位等。
c)此外, 亚稳态电路会导致1-2个时钟周期的延迟,由于外部复位输入无需与输入时钟同步,延迟的具体时钟周期数无法精确确定。复位信号会在输入变为有效后6~7个时钟周期内激活,并持续5个时钟周期;当外部复位输入变为无效且持续5个时钟周期后,复位释放时序启动。若在复位释放时序过程中,外部复位输入再次变为有效且持续5个以上时钟周期,则所有输出信号会重新激活。
d)外部复位有效极性参数用于设定外部复位输入触发复位的逻辑电平:若该参数设为1,则当ext_reset_in在时钟上升沿为高电平时,核心启动复位;辅助复位有效极性参数功能同理,若设为0,则当aux_reset_in为低电平时,核心启动复位。
e)总线复位数量和互连复位数量用于产生额外的总线结构复位信号和互连结构复位信号。这种设计能优化信号负载分布并改善布线效果(避免单路信号扇出过大)。
1)设计建议:每条总线建议单独配置一路总线结构复位信号、互连结构则对应配置interconnect_aresetn信号;
2)应用示例:当系统包含1个AXI4接口时,总线复位(高电平有效)数量可设为1;bus_struct_reset信号用于复位总线上的仲裁器和桥接器;互连结构复位信号的配置逻辑与总线复位完全一致。
f)mb_debug_sys_rst为输入信号,其复位功能与ext_reset_in完全一致,且信号宽度需满足外部复位有效窗口宽度参数设定的最小持续时间。该信号固定为高有效,不受外部复位有效极性参数影响,通常需连接至微处理器调试模块MDM。
1)当工程师通过MDM调试MicroBlaze(如断点调试后重启、程序下载后初始化)时,需触发系统复位以确保处理器从初始状态开始运行。固定极性避免了调试模块与复位核的极性适配问题,确保调试流程顺畅。
g)dcm_locked为复位模块的输入信号,若系统未使用任何DCM,该输入需接高电平;若系统使用1个DCM生成系统时钟,则需将DCM的锁定输出信号连接至该端口。若系统使用多个DCM生成时钟,则需将最后完成锁定的DCM输出信号连接至dcm_locked端口。
h)slowest_sync_clk输入需连接至系统中最慢的同步时钟,通常为AXI4-Lite接口时钟,也可选择其他总线时钟或CPU时钟。
1)选择最慢同步时钟而非最快时钟,核心原因是:复位信号需同步到所有组件的时钟域,若用最快时钟,低速组件可能因采样频率不足而 漏采复位信号。
i)所有输出信号会在同一时钟边沿激活,但复位释放过程需遵循固定时序:
1)首先释放的复位信号:bus_struct_reset(总线结构复位)与interconnect_aresetn(互连结构复位);
2)16个时钟周期后:释放peripheral_reset与peripheral_aresetn(外设复位);
3)再经过16个时钟周期:释放mb_reset(MicroBlaze处理器复位),此时所有复位信号均已释放,系统可开始正常运行。因MicroBlaze是系统控制核心,需等待总线(数据通道)、外设(功能模块)均就绪后,处理器才能发送指令/数据,避免因处理器先启动而组件未就绪导致的指令丢失或数据错误。
j)


复位理论基础0
参考文档------Xilinx WP272
全局复位并非时序关键信号的认知误区
a)全局复位信号的典型驱动源有:按键开关、电源状态、微处理器输出。这些复位信号似乎速度很慢,因此往往被认为是非时序关键信号。在为FPGA设计设定时序约束时,通常会给这类信号分配较长的周期。然而,这一假设并非绝对正确,尤其是在时钟频率提高时,该假设不成立的概率会显著增加。
b)尽管复位脉冲的持续时间相对于时钟周期可能较长,足以保证器件内所有触发器都被复位,但复位信号的释放应被视为时序关键事件。
1)器件内部的全局置位复位信号GSR本质上也是一种全局复位,即便它是硅片硬件的一部分,也并非万无一失。GSR在器件内部同样属于高扇出网络,虽然启动序列可与用户时钟同步,但无法与设计中的所有时钟同步 。器件包含多个DLL/DCM/PLL模块,每个模块都能生成多个时钟及不同相位的时钟。
2)复位信号在两个时钟沿之间的某个时刻被释放,随后传播到各个触发器。对每个触发器而言,复位信号需在时钟有效沿前的建立时间内完成释放。显然,时钟频率越高,复位信号的分布时间窗口就越小,而复位信号作为高扇出网络,要满足释放时序要求,难度极大。

3)若复位信号与时钟异步释放(实际设计中常出现这种情况),即便复位信号的分布时间小于一个时钟周期,也无法保证所有触发器都在同一个时钟沿释放复位。在A点接收到复位释放信号的触发器,会在第一个时钟沿进入工作状态;而在C点接收到复位释放信号的触发器,要到下一个时钟沿才会激活。在B点接收信号的触发器,其状态难以界定,甚至可能引发亚稳态。随着时钟频率的升高,以及大型器件固有的分布延迟偏差(信号在不同区域传播的延迟差异),并非所有触发器都能为同一个时钟沿做好复位释放准备这一问题,将变得几乎无法避免。好消息是,99.99%的情况下,复位释放的时序并不会影响电路功能。

复位释放时刻真的重要吗?
a)

当数据通过流水线流程传输时,主复位的释放时机其实无关紧要。经过几个时钟周期后,整个流水线会正常工作,所有错误数据都会被排出系统。事实上,这类电路甚至基本不需要复位。即便在仿真中,FPGA配置后会自动模拟初始状态,即便存在未定义状态,在输入有效数据后,这些状态也会被清除。
b)

在这个简单的一位热码状态机示例中,存在明显的失效风险:若存储热态(有效状态)的第一个触发器比第二个触发器早一个时钟周期释放复位,那么热态会丢失,状态机将永久进入冷态(无有效状态)。虽然触发器物理位置靠近(局部复位网络延迟小)会降低这种情况的概率,但只要建立时间无法保证,风险就始终存在。此外,若编码状态机的所有触发器未在同一时钟周期释放复位,还可能跳转到意外状态(包括非法状态)。
c)归根结底,含反馈路径的电路需要谨慎处理复位问题,而无反馈的电路其实根本不需要复位。在数字信号处理应用中,有限脉冲响应滤波器不含反馈,在有效数据填满所有抽头前,输出本就无意义,复位抽头寄存器毫无作用。但无限脉冲响应滤波器含有反馈,若复位释放不彻底导致产生异常输出样本,该样本会通过反馈持续影响后续输出,最坏情况下会因不稳定导致滤波器完全失效。
d)99.99%场景的自动覆盖

当Xilinx FPGA进行配置或重配置时,所有单元(包括触发器、RAM)都会被初始化,这是一种终极的主复位方式,其覆盖范围远不止单纯的触发器。FPGA配置过程中,触发器(如FDC、FDP、FDR)和RAM单元都会被预设初始值(例:RAM被写入00101110等二进制数据)。随着FPGA内嵌RAM容量的增加,这种初始化功能极具价值,已知所有RAM内容预先定义,对仿真和实际运行都非常有利,还省去了通过启动序列清空内存的步骤。
e)0.01%场景的应对策略

设计的关键在于制定清晰的复位处理策略,并将其纳入设计评审流程。首先应识别设计中需要与时钟域同步释放复位的关键模块,然后仅针对这些模块构建局部高性能复位网络,从而精准控制相关触发器。图中,链中触发器的数量决定了向局部复位网络输出的复位脉冲的最小持续时间。局部复位随时钟同步释放,被复位的触发器可采用同步置位(FDS)或同步复位(FDR),进而实现全同步设计,便于后续的时序规范定义与时序分析。
f)复位的成本:在设计实现过程中,HDL代码中全局复位的成本往往被忽视,但实际成本可能十分显著:
1)占用器件路由资源:减少其他信号连接的自由度、可能降低系统性能,进而需选用更高速度等级的器件、增加布线时间;
2)占用器件逻辑资源:需使用触发器的专用复位端、功能性复位会在D输入前增加额外门电路,或占用专用复位输入、几乎必然会增大设计规模、额外的逻辑层级几乎必然会降低系统性能、增加布局布线时间;
3)无法使用高效特性:SRL16E可在单个LUT中实现最多16个触发器,但其不支持复位,若HDL代码指定全局复位,综合工具将无法利用该特性、可能导致设计尺寸和产品成本增加高达16倍、设计尺寸增大还可能进一步降低系统性能、增加布局布线时间。
总结
a)在Xilinx FPGA设计中,通常不需要引入全局复位网络。这是因为器件配置完成后,所有触发器和RAM的初始状态比任何逻辑复位都更完整。仿真时也无需额外添加复位信号,因为不存在未定义状态。此外,Xilinx FPGA作为经过全面验证的芯片,无需依赖扫描逻辑或测试向量进行测试,因此全局复位也不作为测试流程的必要环节。值得注意的是,全局复位不仅会延长开发周期并增加成本(尽管难以精确量化),而且在当前高频时钟和SoC设计趋势下,其潜在的可靠性问题更需引起重视。建议设计时仅对真正需要复位的关键模块进行复位处理,且无论系统启动还是运行期间,这些复位信号的释放都应像同步信号一样受到严格的时序约束。
复位理论基础1
参考文档------Xilinx WP275(该文档较为久远,部分量化数据可能不适配新器件,但思路依旧值得学习)
逻辑层级
a)在Xilinx FPGA中,简单逻辑通过slice(逻辑切片,在CLB内)中的LUT和触发器实现。即便是XC3S50这类小型器件,也包含超过1500组LUT与触发器对,因此这些资源常被视为可灵活使用。但实际设计中,积少成多的道理同样适用,高效利用每一组LUT - 触发器对,对整体设计至关重要。
b)LUT4可实现任意4输入逻辑函数,无论该函数需用多少门电路描述。其输出会直接接入触发器的D端。这种高度紧凑的实现方式,能让设计体积更小、性能更高。

c
always @(posedge clk) begin
data_out <= a & b & c & d;
end
c)尽管LUT输入需用到部分可编程互联资源,但LUT实现的逻辑功能本身可融入触发器的建立时间(该时间通常小于1纳秒)。因此,单级逻辑是所有FPGA设计应优先追求的理想实现方式。
d)当一个逻辑功能的输入超过4个时,综合工具别无选择,只能以某种方式将逻辑拆分到两个或多个LUT中实现。

需注意,该逻辑功能的资源开销是单级逻辑的两倍。由于FPGA的硬件粒度特性,该功能的资源占用不可能只增加5%。一旦逻辑无法装入单个LUT,就必须使用两个LUT。此外,两级逻辑对性能的影响也十分显著。尽管额外增加的一个LUT本身延迟仍小于 1 纳秒,但连接两个LUT的互联网络会带来额外延迟,最终对触发器建立时间的整体影响可能很大。当然,时序规格和布局布线工具会发挥作用,将互联延迟控制在限定范围内,但显然,避免这种情况(即避免两级逻辑)能让设计同时实现更小体积和更高速度。
加入控制信号
a)设计师在设计中添加控制逻辑时,常会纳入全局复位,这种复位尤其受仿真需求青睐。但需注意,Xilinx FPGA在配置完成后,会自动进入已知初始状态,因此全局复位实际上并非必需。每个触发器都配有专用控制引脚,支持置位/复位/和时钟使能功能。显然,综合工具应在可能时优先使用这些专用引脚,这样就能让LUT仅用于实现核心功能逻辑,而非浪费在控制信号上。如图所示,此处使用了触发器的异步清零脚,这意味着设计仍能保持理想的单级逻辑结构。
c
always @(posedge clk or posedge reset) begin
if (reset) begin data_out <= 1'b0;
end else begin
data_out <= a & b & c & d;
end

b)添加更多控制信号
c
process (clk,reset)
begin
if reset='1' then
data_out <= '0';
elsif clk'event and clk='1' then
if enable='1' then
if force_high='1' then
data_out <= '1';
else
data_out <= a and b and c and d;
end if;
end if;
end if;
end process;

注意!此时单级逻辑变成两级逻辑,意味着面积加倍且性能降低。综合工具已尽其所能。问题的根源在于代码本身。代码所描述的功能,无法在FPGA的逻辑切片中直接自然实现。或许代码确实准确表达了设计师想要的功能,但综合工具只能被迫利用现有可用资源,去模拟实现该功能。这就好比用刀刃去拧松动的螺丝,虽然可能把螺丝拧紧(功能实现),但螺丝会受损、刀刃也会变钝,而且操作过程对使用者来说,还存在一定的风险!
c)不要混合控制类型!!!
1)FPGA中的触发器可支持异步复位/置位控制,也可支持同步复位/置位控制,但无法在同一个触发器上同时支持异步与同步控制的混合。因此,综合工具只能二选一,要么实现带同步置位/复位的同步触发器,要么实现带异步预置/清零的异步触发器。其中,异步复位始终拥有最高优先级,一旦代码中包含异步复位,就会直接迫使综合工具选择异步触发器方案。

2)异步复位会让我们重新面临全局复位带来的问题。很多时候,全局复位被定义为异步类型(建议你检查自己的代码,确认是否存在这种情况)。前文示例中同时使用了置位和复位控制,这种场景可能并不常见。但实际设计中,还存在同一个触发器需要两种复位条件的情况:一种是代码风格中默认存在的全局复位,另一种是出于功能运行需求的局部复位(例如,BCD计数器计数到9后必须翻转为0的复位)。
若全局复位为异步类型,那么局部同步复位就必须通过LUT模拟实现,这可能会迫使设计从单级逻辑变为两级逻辑,导致资源开销翻倍,同时性能也会下降。
d)同步化设计
1)若你仍坚持使用全局复位,可尝试在同一示例中改用同步复位,看看能否改善情况。
c
process (clk)
begin
if reset='1' then
data_out <= '0';
elsif clk'event and clk='1' then
if enable='1' then
if force_high='1' then
data_out <= '1';
else
data_out <= a and b and c and d;
end if;
end if;
end if;
end process;
图中展示了XST对同步复位代码的处理结果。遗憾的是,工具似乎仍浪费了触发器上的专用SET控制引脚,转而通过LUT实现置位功能。最终结果仍是两级逻辑。资源开销翻倍,性能也随之下降。

确保正确的优先级
a)成功实现单级逻辑的关键,在于理解触发器的工作方式。尽管FPGA整体具备可编程性,但每个底层功能模块(如触发器的控制逻辑)实际上是固定的。所谓可编程,本质是决定这些固定功能模块是否被启用,而非改变其工作规则。

b)同步触发器的优先级规则为:同步复位(优先级最高)→ 同步置位(优先级次之)→ D型时钟使能(优先级最低),对应触发器型号为 FDRSE。

c)FPGA内部所有触发器都具备相同的控制逻辑,仅异步触发器的型号为FDCPE(字母C代表异步清零,P代表异步预置)以区分其异步控制特性。当使用多个控制信号时,每个信号都必须遵循预设的优先级规则。在同步设计章节的VHDL代码示例中,代码里使能的优先级高于置位,这与触发器专用控制引脚支持的优先级顺序(置位 > 使能)不兼容。因此,综合工具只能通过结合部分符合优先级的专用控制引脚+LUT模拟剩余功能的方式来适配代码描述,最终导致了两级逻辑的问题。
d)


我们在连接外部元器件时,都会非常关注控制信号及其优先级,而原理图设计师在使用FPGA内部触发器时,同样会高度重视其控制优先级 。因为他们需要从器件库中手动选择触发器,且必须遵循优先级规则才能让电路正常工作。但在更高抽象层级编写HDL代码时,这些硬件特性却很容易被忽略。幸运的是,FPGA内所有触发器的控制规则都完全一致,只要掌握这些简单规则,编写适配硬件的通用代码就会变得相对容易。
挑战
a)回顾你最近设计中编写的HDL代码,审视其中的控制优先级是否符合FPGA硬件规则:**你的设计中,有多少次因使用异步复位,导致后续的同步复位或置位无法直接通过触发器专用引脚实现?又有多少次出现使能优先级高于同步复位的情况?**并非所有这些问题都会必然导致逻辑层级增加(形成两级逻辑),但这类问题确实存在引发体积增大、性能下降的潜在风险。
b)如果你的现有设计能够正常工作,就不要修改它!记住 "if it isn't broken, don't fix it" 的原则。而对于你的下一个设计,只需在编写代码时多关注硬件适配性(如控制优先级、避免混合控制类型),就能找到诸多既缩小设计体积、又提升运行性能的方法。
复位理论基础2
参考文档------Xilinx UG470
a)硬件复位是最直接的复位方式,下面重点解释PROGRAM_B和INIT_B两个核心引脚,及其与配置时序、电气特性的关联。
1)PROGRAM_B引脚:主动配置复位,低电平有效。作为配置逻辑的硬复位引脚,低电平触发FPGA清除配置内存(CMOS配置锁存器CCLs)、复位配置控制器,并启动新的配置序列。当PROGRAM_B从高电平拉低时,FPGA立即进入配置复位状态,清除配置内存中的比特流数据。当PROGRAM_B从低电平释放为高电平时,FPGA开始初始化(清除残留数据),随后根据M[2:0]模式引脚选择的配置模式,启动数据加载。
2)PROGRAM_B引脚外部必须接≤4.7kΩ的上拉电阻至VCCO_0(配置bank0的供电),确保上电时稳定为高电平,避免误触发。最小低电平脉冲宽度需满足TPROGRAM时序参数,不同器件型号典型值为100ns-1μs,具体需参考对应器件数据手册,否则复位可能不生效。
3)上电时若持续拉低PROGRAM_B,无法维持复位状态。FPGA上电后会先执行内部上电复位(POR,TPOR时序),即使PROGRAM_B低电平,POR完成后仍会启动配置,需通过INIT_B引脚延迟配置。复位期间,除专用配置引脚外,所有用户I/O通过全局三态信号GTS置于高阻态,内部上拉电阻是否启用由PUDC_B引脚控制。
4)上电或PROGRAM_B复位后,FPGA驱动INIT_B低电平,指示配置内存正在初始化。初始化完成后释放为高阻态,由外部上拉电阻拉至高电平。若配置过程中检测到CRC错误、IDCODE不匹配,INIT_B会重新拉低,直到错误解除或触发fallback。
5)上电时若外部拉低INIT_B,可暂停配置序列。FPGA会在初始化完成后等待INIT_B释放为高电平,再采样M[2:0]模式引脚并启动配置。适用场景:当外部配置存储(如SPI flash)上电就绪慢于FPGA时,通过INIT_B延迟配置,避免因存储未就绪导致配置失败。
6)INIT_B引脚外部需接≤4.7kΩ的上拉电阻至VCCO_0,确保初始化完成后能稳定拉至高电平。与PROGRAM_B时序配合:PROGRAM_B脉冲后,INIT_B会延迟TPL时序后拉低,典型值为200ns-500ns,需等待INIT_B释放为高电平后再启动配置。
b)指令触发复位通过JTAG接口或内部配置端口ICAPE2发送专用指令实现,适用于调试、远程控制、动态重配置场景,文档中重点描述了 IPROG、JPROGRAM、JSHUTDOWN三类指令。
1)IPROG指令:内部程序触发的重配置,不清除关键寄存器。PROGRAM_B复位会清除所有配置相关寄存器(包括WBSTAR、TIMER、BOOTSTS),而IPROG仅清除配置内存,保留WBSTAR(热启动地址寄存器)、TIMER(看门狗)、BOOTSTS(启动状态)等专用重配置逻辑。其优势是,可从WBSTAR指定的非0地址加载新比特流,无需重新从地址0加载golden image,节省重配置时间。
2)IPROG指令需与WBSTAR配合:写WBSTAR寄存器(设置下一次重配置的起始地址,如0x00000000外的其他地址)→写CMD寄存器(发送IPROG指令,CMD[4:0]=01111,十六进制0x0F)→执行效果(INIT_B和DONE拉低,配置内存清除后从WBSTAR地址加载新比特流)。
3)通过ICAPE2 Primitive(用户逻辑触发)
3)JPROGRAM指令(JTAG接口的全复位):功能等同于PROGRAM_B引脚复位,清除配置内存、复位配置控制器,且会清除WBSTAR、TIMER等寄存器(区别于IPROG)。适用场景是通过JTAG工具远程触发复位,常用于调试阶段的重新开始配置。
c)错误/超时触发复位:自动故障恢复机制
1)看门狗定时器:监测配置过程,从比特流加载开始计数,若未在TIMER_VALUE指定时间内完成启动序列(EOS信号断言),触发fallback复位。监测用户逻辑运行,用户需定期通过LTIMER指令或直接写TIMER寄存器复位计数器,超时则触发fallback。其时钟源基于内部专用振荡器CFGMCLK(典型65MHz),预分频256后,计数器周期约4000ns,30位计数器最大计时约4230秒。
2)TIMER_VALUE计数至0时,BOOTSTS寄存器的WTO_ERROR位(bit3/11)置1,记录超时错误。内部生成复位脉冲,拉低INIT_B和DONE,清除配置内存,从地址0加载golden image。fallback期间看门狗自动禁用,需通过IPROG重配置成功后重新启用。
复位理论基础3
参考文档------Xilinx UG901
同步异步复位
a)同步复位指复位信号与时钟同步,仅在时钟上升沿(或下降沿)生效。其核心优势是,可直接映射到器件架构(如DSP48、BRAM)的内部资源,不额外占用逻辑。此外,避免了亚稳态风险,因为复位释放时与时钟同步,无恢复/移除时序违例问题。此外,控制集的映射也更加灵活,因为可以重映射到数据路径优化布局密度和时钟频率。适用于绝大多数设计,尤其是DSP和BRAM等专用资源场景。
b)异步复位增加了布线复杂性,且因为全局异步复位需要布线到所有寄存器,导致偏差较大。另外复位断言器件可能损坏BRAM、LUTRAM、SRL的存储内容。异步复位的释放需要同步到时钟,否则容易引起亚稳态。另外异步复位无法直接映射到专用资源上。适用于需快速响应复位的安全关键场景,此时需额外处理同步释放。
复位相关的属性
a)这类属性直接控制复位信号的行为、推断逻辑、优先级,支持在RTL或XDC中配置。
1)DIRECT_RESET:强制指定信号直接连接到触发器的复位端,适用于多复位源场景,或需明确复位信号路径时。如:(* direct_reset = "yes" ) input rst3。注意,在XDC中需通过get_nets指定信号,因属性仅对net类型生效。
2)EXTRACT_RESET:控制寄存器是否推断复位逻辑(覆盖工具默认启发式推断行为)。需避免工具错误推断复位时(如某些寄存器无需复位)或强制将复位逻辑融入组合逻辑时,可以设置为no,如:( extract_reset = "yes" ) reg my_reg。
3)ASYNC_REG:标记寄存器为异步寄存器,可接收异步数据,常与异步复位配合使用。工具会将其视为DONT_TOUCH属性,避免优化,确保异步复位/数据路径不被破坏。常用于异步复位后的同步器、跨时钟域复位信号处理。
4)FSM_SAFE_STATE:状态机复位后进入安全状态,避免非法状态。复位后若状态机处于非法状态,自动跳转到预设安全状态。如:( fsm_safe_state = "reset_state" *) reg [7:0] my_state。
b)编码规范
1)禁止异步置位/复位混用:因为触发器原语不支持同时带置位和复位。混用会导致面积增大、性能下降,且无法利用DSP/BRAM等资源的内置复位。
2)优先使用同步复位:异步复位会增加时序收敛难度,因为复位信号需要跨时钟域同步。同步复位可以与数据路径共享时钟树,减少毛刺风险,且支持增量合成。
3)复位信号电平要求:必须为active-high。若为active-low,工具会插入反相器,增加延迟和资源消耗。
4)避免冗余复位。
5)寄存器复位后的初始值可通过信号声明时的默认值定义,替代复位逻辑。如:reg [3:0] cnt=4'b0000;(上电复位为0)。减少复位信号路由,适用于全局统一复位场景。
6)必须为状态机寄存器设置复位/上电初始状态,避免上电后处于非法状态。
c
parameter S_IDLE = 3'b000; // 复位状态
reg [2:0] state = S_IDLE; // 上电复位为IDLE
always @(posedge clk) begin
if (rst) state <= S_IDLE; // 同步复位到IDLE
else case(state) ... endcase
end
c)避免异步复位的场景:多时钟域设计(复位信号需同步,否则易引起亚稳态)、DSP/BRAM等内置寄存器的场景,它们只支持同步复位、需增量合成的设计,因为异步复位会破坏增量优化。
d)复位信号的负载限制:高扇出的复位信号需插入缓冲器,如BUFG,避免时序skew。可通过MAX_FANOUT属性限制复位信号扇出。DONT_TOUCH/KEEP_HIERARCHY可能阻止复位逻辑优化,需谨慎搭配。另外EXTRACT_RESET=no时,复位逻辑会通过组合逻辑实现,可能增加延迟。