jesdin 2026-03-21 20:07 采纳率: 0%
浏览 7

libero如何避编译被优化

VERILOG,我要进行门级延迟,但编译器会优化,具体是综合的时候没有被优化,但是编译的时候被优化。
libero11.9,verilog ProASIC3 的fpga
下面是代码,需要完全保留这个或门和与门的电路结构实现门级延迟和一定的延迟逻辑,实际逻辑是冗余的,但不想被优化。

`timescale 100ps/100ps

module top_externalinterface (
    input wire      a_ctrl,
    input wire      ik,

    output wire     zout
);

wire yout;


OR2 OR2_u1 ( .A( a_ctrl ), .B( ik ), .Y( yout ) );
AND2 AND2_u1 ( .A( yout ), .B( ik ), .Y( zout ) );
endmodule


  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-03-21 20:08
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    在使用 Libero 11.9ProASIC3 FPGA 进行 Verilog 开发时,如果希望保留门级电路结构(如 OR2、AND2)以实现特定的延迟逻辑,但又不被综合工具或编译器优化掉,可以采取以下措施。由于你提到“编译的时候被优化”,这可能指的是 Synopsys 的综合工具(如 Design Compiler)或者 Libero 自身的综合过程。


    ✅ 问题分析

    你提供的代码中,OR2AND2 是两个基本逻辑门,它们的组合是冗余的(即最终输出 zout 可能等同于某个更简单的逻辑表达式),但在实际设计中需要保留这些门级结构以实现特定的延迟效果。然而,综合工具可能会将这些冗余逻辑进行优化,导致最终的硬件中没有这些门。


    🔧 解决方案

    为了防止门级逻辑被优化,可以采用以下几种方法:

    1. 使用 (* keep = "true" *) 属性

    这是最常用的方法之一,用于告诉综合工具不要对某些信号或模块进行优化。

    修改后的代码如下:

    `timescale 100ps/100ps
    
    module top_externalinterface (
        input wire      a_ctrl,
        input wire      ik,
    
        output wire     zout
    );
    
    wire yout;
    
    (* keep = "true" *) OR2 OR2_u1 ( .A( a_ctrl ), .B( ik ), .Y( yout ) );
    (* keep = "true" *) AND2 AND2_u1 ( .A( yout ), .B( ik ), .Y( zout ) );
    
    endmodule
    

    加粗说明:
    (* keep = "true" *) 是关键属性,它告诉综合工具不要对这个门级逻辑进行优化,确保其在最终的网表中保留。


    2. 使用 attribute 语法(适用于某些综合工具)

    有些工具支持通过 attribute 指定保留逻辑:

    (* attribute = "keep" *) OR2 OR2_u1 ( .A( a_ctrl ), .B( ik ), .Y( yout ) );
    (* attribute = "keep" *) AND2 AND2_u1 ( .A( yout ), .B( ik ), .Y( zout ) );
    

    加粗说明:
    不同工具对保留属性的语法可能不同,建议查阅 Libero 或 Synopsys 的文档。


    3. 将逻辑封装为模块并加上 (* keep = "true" *)

    如果你希望进一步隔离逻辑,可以将其封装为一个子模块,并加上 keep 属性。

    示例:

    `timescale 100ps/100ps
    
    module logic_block (
        input wire a,
        input wire b,
        output wire y
    );
    
    (* keep = "true" *) OR2 or_gate ( .A(a), .B(b), .Y(y) );
    (* keep = "true" *) AND2 and_gate ( .A(y), .B(b), .Y(y) );
    
    endmodule
    
    module top_externalinterface (
        input wire      a_ctrl,
        input wire      ik,
    
        output wire     zout
    );
    
    wire yout;
    
    logic_block logic_block_u1 (
        .a(a_ctrl),
        .b(ik),
        .y(yout)
    );
    
    endmodule
    

    加粗说明:
    通过封装逻辑到子模块并加上 keep 属性,可以提高保留率,避免被优化。


    4. 设置综合工具选项(如 Synopsys DC)

    如果你使用的是 Synopsys 的综合工具(如 Design Compiler),可以在命令文件中添加以下语句:

    set_dont_touch [get_cells OR2_u1]
    set_dont_touch [get_cells AND2_u1]
    

    加粗说明:
    在综合阶段通过脚本指令强制保留某些单元,是最直接的方式。


    5. 检查 Libero 编译流程中的优化设置

    在 Libero 中,你可以进入 Project Settings > Synthesis,查看是否有自动优化选项被启用,例如:

    • Optimize for Area
    • Remove Redundant Logic
    • Retiming

    加粗说明:
    关闭这些优化选项可以防止逻辑被删除,但要注意这会影响整体性能和资源占用。


    ✅ 总结

    | 方法 | 说明 | 是否推荐 | |------|------|----------| | 使用 (* keep = "true" *) | 最常用方式,直接告诉综合工具保留逻辑 | ✅ 推荐 | | 使用 attribute = "keep" | 适用于部分工具 | ⚠️ 依赖工具支持 | | 封装为子模块 + keep | 提高可维护性 | ✅ 推荐 | | 设置综合工具选项 | 强制保留 | ✅ 推荐 | | 调整 Libero 优化设置 | 避免自动优化 | ✅ 推荐 |


    如有更多关于 ProASIC3 的具体配置或 Libero 工具链的问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 3月21日