ISE与Synplify Pro属性被忽略,信号名无法保留问题求助
解决ISE 14.7/Synplify Pro 2013.03综合布线后信号名称丢失的问题
这种信号名称在综合布线后被修改/丢失的问题,在这些老版本的FPGA工具里确实很常见——往往不是属性没用,而是我们没踩对工具的“优化优先级”或者属性的语法细节没到位。结合你用的工具版本,给你分工具梳理具体的解决步骤:
针对XST(ISE 14.7)的调整
- 先把
keep属性的语法补全:从你贴的代码片段看,属性声明可能没写完。XST对VHDL属性的格式要求很严格,必须明确指定信号类型,比如:
别省略attribute keep : string; attribute keep of wr_adr_ram_1 : signal is "true"; attribute keep of rd_adr_ram_1 : signal is "true";: signal这部分,老版本XST对未明确类型的属性经常“视而不见”。 keep_hierarchy要绑定到实体/模块:这个属性不是给单个信号用的,得绑在整个模块上,同时要配合ISE的GUI设置。比如在VHDL实体里加:
然后打开ISE的XST设置,找到「Keep Hierarchy」选项,把默认的attribute keep_hierarchy : string; attribute keep_hierarchy of your_top_entity : entity is "yes";Auto改成Soft或者Hard——Auto模式下工具会自己判断要不要扁平化层级,很容易把你的寄存器合并重命名。- 关掉极端优化选项:如果你的综合策略选了「Optimize for Area」的极端模式,XST会强行合并冗余寄存器、重命名信号来减小面积。暂时改成「Balanced」,或者手动禁用「Register Duplication」「Register Retiming」这些会动寄存器结构的选项。
- 排查是否被优化成常量:如果
wr_adr_ram_1这类信号在某些场景下是固定值,XST会直接把它变成常量,keep属性自然没用。可以加个无意义的赋值(比如wr_adr_ram_1 <= wr_adr_ram_1_temp xor '0'),或者试试dont_touch属性(部分老版本XST支持)来规避常量优化。
针对Synplify Pro 2013.03的调整
syn_keep要选对属性类型:Synplify对VHDL的属性类型很敏感,用boolean类型比字符串的"true"更可靠。比如:
如果是Verilog,直接在寄存器声明前加标记:attribute syn_keep : boolean; attribute syn_keep of wr_adr_ram_1 : signal is true;(* syn_keep = "true" *) reg [7:0] wr_adr_ram_1;- 叠加
syn_preserve属性:这个属性的优先级比syn_keep高,能强制工具保留寄存器的结构和名称,适合你这种所有寄存器都被修改的情况:(* syn_keep = "true", syn_preserve = "true" *) reg [7:0] rd_adr_ram_1; - 调整综合策略的层级保留:打开Synplify的Project Settings,找到「Compiler Options」,禁用「Remove Unused Registers」「Merge Duplicate Registers」这两个选项。同时把「Hierarchy Preservation」改成
Full,别用默认的Auto。 - 确保信号被“使用”:如果寄存器没有被任何后续逻辑引用,Synplify会直接删掉它,属性再强也没用。可以临时加一个未使用的输出端口,把要保留的信号连上去,或者在Synplify里右键信号,标记为「Do Not Optimize」。
通用验证技巧
- 先查综合网表:别等布局布线完才发现问题——综合完成后,打开生成的.edn或.vhd网表文件,搜索你的信号名称。如果综合后就没了,那问题出在综合阶段,不是布局布线。
- 布局布线阶段要开名称保留:在ISE的PAR(布局布线)设置里,找到「Preserve Net Names」选项,勾选「All Nets」或者「Selected Nets」(如果只需要保留特定信号)。有些版本的PAR会忽略综合阶段的
keep属性,必须手动开这个选项。 - 仿真模型的名称保留:如果网表里信号还在,但ModelSim仿真时看不到,可能是ISE生成仿真库时没保留名称。打开ISE的仿真设置,启用「Preserve Signal Names」,重新生成仿真模型。
内容的提问来源于stack exchange,提问作者D.vader




