为什么收发器重配置控制器的reconfig_busy输出在复位后会变为高电平?
收发器重配置'reconfig_busy \'输出端口可能会在复位断言后卡住,置为高电平。连接到受影响的重配置控制器的收发器通道也可能陷入复位状态。即使在重置配置控制器后,“reconfig_busy”输出端口仍然卡住;只有重新编程器件才能解决问题。
此症状可能由收发器重新配置控制器的内部重置结构引起。驱动M20K RAM地址总线的逻辑的异步复位断言可能导致异步逻辑传播。这可能导致进入M20K的多条地址线同时被置位,这可能导致位单元之间的电荷共享,从而破坏M20K的内容。
这种损坏会影响Stratix®V和Arria®VGZ器件收发器重配置控制器,因为它包含用于PMA校准的Nios®II处理器,处理器的程序代码存储在M20K RAM中。如果在Nios®II程序存储器中发生损坏,则可能导致处理器锁定,从而导致reconfig_busy输出端口被置为高电平。只有通过重新编程器件才能从这种情况中恢复,因为M20K内容仅在器件编程期间加载。
解决/修复方法
针对此问题的修复将更改内部复位控制器和收发器重配置控制器的重置结构以使用同步复位,以及在复位条件期间抢先取消激活M20K clock_enable端口。
该修复程序将在Quartus®II软件的未来版本中提供。通过在mySupport中提交服务请求,可以为早期版本的Quartus II软件提供补丁。如果立即需要解决方案,可以使用以下说明手动应用修复程序。
有9个文件需要添加或修改:
- altera_reset_controller_early_ce_mod.v(add)
- altera_reset_synchronizer_early_ce_mod.v(add)
- 与收发器重配置控制器关联的QIP文件(修改)
- alt_xcvr_reconfig.sv(修改)
- alt_xcvr_reconfig_soc.sv(修改)
- alt_xcvr_reconfig_cpu.v(修改)
- alt_xcvr_reconfig_cpu_ram.sv(修改)
- sv_xrbasic_lif_csr.sv(修改)
- sv_xcvr_reconfig_mif_avmm.sv(修改)
这9个文件应位于生成收发器重配置控制器的目录中。
下载altera_reset_controller_early_ce_mod.v并将其放在保存收发器重新配置文件的目录中:
下载 altera_reset_synchronizer_early_ce_mod.v 并将其放在保存收发器重新配置文件的目录中:
要将这两个文件添加到您的设计中,请找到并修改与Transceiver Reconfiguration Controller实例关联的.qip文件,并将以下两行添加到该文件中:
set_global_assignment -library“LIBRARY_NAME”-name VERILOG_FILE [file join $ :: quartus(qip_path)“LIBRARY_PATH / altera_reset_controller_early_ce_mod.v”]
set_global_assignment -library“LIBRARY_NAME”-name VERILOG_FILE [file join $ :: quartus(qip_path)“LIBRARY_PATH / altera_reset_synchronizer_early_ce_mod.v”]
在上面两行中,修改LIBRARY_NAME和LIBRARY_PATH以匹配收发器重配置控制器的.qip文件中的其他条目。
对于alt_xcvr_reconfig.sv ,进行以下修改:
- 找到alt_xcvr_resync模块实例化,并反转'd'和'reset'端口之间的连接。修改后,实例化应如下所示:
alt_xcvr_resync#(
.INIT_VALUE(1)
)inst_reconfig_reset_sync(
.clk(mgmt_clk_clk),
.d(mgmt_rst_reset),
.reset(1 \'b0),
.q(r_mgmt_rst_reset)
);
对于alt_xcvr_reconfig_soc.sv ,进行以下修改:
在模块顶部附近添加以下电线定义:
wire cpu_reset_req;
找到alt_xcvr_reconfig_cpu模块的实例化并添加以下端口:
.ram_ce(cpu_reset_req),
找到alt_xcvr_reconfig_cpu_ram模块的实例化并添加以下端口:
.ram_ce(cpu_reset_req),
对于alt_xcvr_reconfig_cpu.v ,进行以下修改:
- 将以下端口添加到顶级:
输出线ram_ce,
- 将以下代码添加到模块:
wire m20k_gate;
wire altera_ram_clock_enable;
assign altera_ram_clock_enable = ~m20k_gate;
assign ram_ce = altera_ram_clock_enable;
- 找到altera_reset_controller的实例化,并将其更改为altera_reset_controller_early_ce_mod的实例化。将m20k_gate端口添加到此实例化,并将其连接到m20k_gate信号。进行这些修改后,实例化应如下所示:
altera_reset_controller_early_ce_mod#(
.NUM_RESET_INPUTS(1),
.OUTPUT_RESET_SYNC_EDGES(“deassert”),
.SYNC_DEPTH(2)
)rst_controller(
.reset_in0(~reset_reset_n),// reset_in0.reset
.clk(clk_clk),// clk.clk
.reset_out(reconfig_ctrl_reset_reset),// reset_out.reset
.m20k_gate(m20k_gate),
.reset_in1(1 \'b0),//(已终止)
.reset_in2(1 \'b0),//(已终止)
.reset_in3(1 \'b0),//(已终止)
.reset_in4(1 \'b0),//(已终止)
.reset_in5(1 \'b0),//(已终止)
.reset_in6(1 \'b0),//(已终止)
.reset_in7(1 \'b0),//(已终止)
.reset_in8(1 \'b0),//(已终止)
.reset_in9(1 \'b0),//(已终止)
.reset_in10(1 \'b0),//(已终止)
.reset_in11(1 \'b0),//(已终止)
.reset_in12(1 \'b0),//(已终止)
.reset_in13(1 \'b0),//(已终止)
.reset_in14(1 \'b0),//(已终止)
.reset_in15(1 \'b0)//(已终止)
);
对于alt_xcvr_reconfig_cpu_ram.sv文件,请进行以下修改:
- 添加以下输入端口:
输入ram_ce,
- 找到altsyncram实例化并修改clocken0端口以将其连接到新的ram_ce输入端口:
.clocken0(ram_ce),
- 修改defparam clock_enable_input / output_a / b定义如下:
altsyncram_component.clock_enable_input_a =“正常”,
altsyncram_component.clock_enable_input_b =“正常”,
altsyncram_component.clock_enable_output_a =“NORMAL”,
altsyncram_component.clock_enable_output_b =“正常”,
对于sv_xrbasic_lif_csr.sv文件,请进行以下修改:
- 找到控制逻辑通道地址的顺序始终块。该始终块可以通过其上方的注释“//逻辑通道寄存器”来识别。从灵敏度列表中删除重置条件。修改后,always块的开头应如下所示:
//逻辑通道寄存器
总是@(posedge reconfig_clk)开始
如果(重置== 1)开始
- 找到控制本机重新配置地址寄存器的顺序始终块。可以通过注释“// native reconfig address register,可以将其解释为通道偏移地址或物理地址”来识别此始终块。从灵敏度列表中删除重置条件。修改后,always块的开头应如下所示:
// native reconfig address register,可以解释为通道偏移地址或物理地址
总是@(posedge reconfig_clk)开始
如果(重置== 1)开始
对于sv_xcvr_reconfig_mif_avmm.sv文件,仅当在收发器重配置控制器Megawizard GUI中启用了通道或PLL重配置时,才需要进行此更改。进行以下修改:
- 找到上面带有“// Avalon输出和内部存储”注释的顺序始终块,并从灵敏度列表中删除重置条件。修改后,always块的开头应如下所示:
完成所有这些更改后,您的设计将需要重新编译。// Avalon输出和内部存储
永远@(posedge clk)
开始
如果(重置)开始