You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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实体里加:
    attribute keep_hierarchy : string;
    attribute keep_hierarchy of your_top_entity : entity is "yes";
    
    然后打开ISE的XST设置,找到「Keep Hierarchy」选项,把默认的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"更可靠。比如:
    attribute syn_keep : boolean;
    attribute syn_keep of wr_adr_ram_1 : signal is true;
    
    如果是Verilog,直接在寄存器声明前加标记:
    (* 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

火山引擎 最新活动