(* keep_hierarchy=“yes“ *)

Quartus 信号被优化 与 VIVADO 信号被优化 解决方法 Quartus 开发工具 信号布局布线防止优化添加语句。 Vivado 开发工具 信号局布线防止优化添加语句。 阅读详情

       在 Verilog 中,(* keep_hierarchy="yes" *) 是一个 层次保留属性,用于指示综合工具保持模块的层次结构,不将其展平或优化到其他模块中。

一、作用与含义

这个属性强制要求工具:

  • 保持层次:防止模块边界被打破

  • 禁止展平:阻止模块被合并到父模块中

  • 独立优化:在每个模块内部独立进行优化

  • 便于调试:保持与原始RTL相同的层次结构

二、语法格式

// 用于模块定义
(* keep_hierarchy = "yes" *)
module my_module (...);

// 用于模块实例(某些工具)
(* keep_hierarchy = "yes" *)
module_name instance_name (...);

三、使用场景

1. 保护IP核和子模块

(* keep_hierarchy = "yes" *)
module dsp_multiplier (
    input [15:0] a,
    input [15:0] b,
    output [31:0] p
);
    // DSP48E1 或其他专用硬件的映射
    assign p = a * b;
endmodule

module top_design (
    input [15:0] data_a,
    input [15:0] data_b, 
    output [31:0] result
);

// 这个实例的层次结构会被保留
dsp_multiplier u_mult (
    .a(data_a),
    .b(data_b),
    .p(result)
);

endmodule

2. 保持功能模块的独立性

(* keep_hierarchy = "yes" *)
module fifo_controller (
    input clk,
    input rst_n,
    input wr_en,
    input rd_en,
    input [7:0] data_in,
    output [7:0] data_out,
    output full,
    output empty
);
    
    reg [7:0] mem [0:15];
    reg [3:0] wr_ptr, rd_ptr;
    reg [4:0] count;
    
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            wr_ptr <= 0;
            rd_ptr <= 0;
            count <= 0;
        end else begin
            // FIFO 控制逻辑...
        end
    end
    
    assign full = (count == 16);
    assign empty = (count == 0);
    
endmodule

3. 分层设计中的关键模块

(* keep_hierarchy = "yes" *)
module aes_encryption_round (
    input [127:0] data_in,
    input [127:0] round_key,
    output [127:0] data_out
);
    
    wire [127:0] sub_bytes_out;
    wire [127:0] shift_rows_out;
    wire [127:0] mix_columns_out;
    
    // AES 轮函数...
    sub_bytes u_sub (.data_in(data_in), .data_out(sub_bytes_out));
    shift_rows u_shift (.data_in(sub_bytes_out), .data_out(shift_rows_out));
    mix_columns u_mix (.data_in(shift_rows_out), .data_out(mix_columns_out));
    
    assign data_out = mix_columns_out ^ round_key;
    
endmodule

四、完整的实际示例

// 通信接收机分层设计
(* keep_hierarchy = "yes" *)
module synchronizer (
    input clk,
    input rst_n,
    input async_signal,
    output sync_signal
);
    
    reg sync_reg1, sync_reg2;
    
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            sync_reg1 <= 1'b0;
            sync_reg2 <= 1'b0;
        end else begin
            sync_reg1 <= async_signal;
            sync_reg2 <= sync_reg1;
        end
    end
    
    assign sync_signal = sync_reg2;
    
endmodule

(* keep_hierarchy = "yes" *)
module deserializer (
    input clk,
    input serial_data,
    output [7:0] parallel_data
);
    
    reg [7:0] shift_reg;
    
    always @(posedge clk) begin
        shift_reg <= {shift_reg[6:0], serial_data};
    end
    
    assign parallel_data = shift_reg;
    
endmodule

module uart_receiver (
    input clk,
    input rst_n,
    input rx_data,
    output [7:0] received_data,
    output data_valid
);
    
    wire synchronized_rx;
    
    // 这些子模块的层次结构会被保留
    synchronizer u_sync (
        .clk(clk),
        .rst_n(rst_n),
        .async_signal(rx_data),
        .sync_signal(synchronized_rx)
    );
    
    deserializer u_deser (
        .clk(clk),
        .serial_data(synchronized_rx),
        .parallel_data(received_data)
    );
    
    // 其他控制逻辑...
    
endmodule

五、应用场景详解

1. 便于时序约束

(* keep_hierarchy = "yes" *)
module clock_domain_crossing (
    input src_clk,
    input dst_clk,
    input [31:0] src_data,
    output [31:0] dst_data
);
    
    // CDC 逻辑...
    // 保持层次便于添加跨时钟域约束
    
endmodule

2. 模块复用和团队协作

(* keep_hierarchy = "yes" *)
module eth_mac_controller (
    input clk_125m,
    input rst_n,
    input [7:0] tx_data,
    output [7:0] rx_data,
    // 其他以太网MAC接口...
);
    
    // 以太网MAC控制器实现
    // 保持层次便于在不同项目中复用
    
endmodule

3. 物理规划保留

(* keep_hierarchy = "yes" *)
module ddr_phy_interface (
    input mem_clk,
    input [63:0] write_data,
    output [63:0] read_data
);
    
    // DDR物理层接口
    // 保持层次便于物理布局规划
    
endmodule

六、相关属性对比

属性描述作用层次
keep_hierarchy="yes"保持模块层次结构模块级别
dont_touch="true"禁止优化逻辑模块、实例、信号级别
black_box="true"视为黑盒模块级别
buffer_type="none"禁止插入缓冲器端口级别

七、工具特定语法

1. Xilinx Vivado

(* keep_hierarchy = "yes" *)        // 推荐写法
(* keep_hierarchy = "soft" *)       // 软约束,允许在必要时展平
(* keep_hierarchy = "no" *)         // 允许展平(默认行为)

2. Synopsys Design Compiler

(* syn_hier = "hard" *)             // 硬层次保留
(* syn_hier = "soft" *)             // 软层次保留

八、多属性组合使用

(* keep_hierarchy = "yes", dont_touch = "true" *)
module critical_submodule (
    input clk,
    input [15:0] data_in,
    output [15:0] data_out
);
    // 既保持层次又禁止优化
    // ...
endmodule

九、注意事项

  1. 性能影响:过度使用可能影响综合优化效果

  2. 面积代价:可能阻止跨模块优化,增加资源使用

  3. 时序考虑:保持层次可能影响时序优化

  4. 调试优势:显著改善调试和分析的便利性

十、典型工作流程

// 1. 在关键模块定义时添加属性
(* keep_hierarchy = "yes" *)
module algorithm_core (...);

// 2. 综合时工具保持模块边界
// 3. 实现阶段维持层次结构
// 4. 便于模块级时序约束和物理规划

十一、实际工程应用

// 大型SoC设计中的层次保留
(* keep_hierarchy = "yes" *)
module cpu_core (
    input clk,
    input rst_n,
    input [31:0] instruction,
    output [31:0] result
);

(* keep_hierarchy = "yes" *)  
module dma_controller (
    input clk,
    input [31:0] src_addr,
    input [31:0] dst_addr
);

module soc_top (
    input system_clk,
    input system_rst_n
);
    
    cpu_core u_cpu (.clk(system_clk), .rst_n(system_rst_n), ...);
    dma_controller u_dma (.clk(system_clk), ...);
    // 其他模块...
    
endmodule

这个属性在以下情况下特别有用:

  • 大型分层设计项目

  • IP核集成和复用

  • 跨团队协作开发

  • 需要模块级时序约束的设计

  • 物理规划驱动的设计

  • 调试和分析复杂系统

解决FPGA中MIG IP核约束文件路径错误:Keep Hierarchy设置详解 在FPGA设计流程中,综合优化是提升设计性能的关键环节,它通过逻辑优化和资源整合来改善时序和面积。然而,当集成复杂IP核如Xilinx的MIG(Memory Interface Generator)时,综合工具的默认扁平化优化会破坏IP内部层次结构,导致约束文件中指定的信号路径在网表中“消失”,引发“NET does not match any design objects”错误。这一问题的核心在于综合属性设置,通过调整“保持层次结构”选项,可在保留约束有效性与允许后续优化间取得平衡。对于MIG这类精密IP 阅读详情

相关推荐

Vivado ILA信号被拆分?别慌,试试这3个综合属性(KEEP/DONT_TOUCH实战)

本文深入解析Vivado ILA调试中信号被拆分的常见问题,详细介绍了KEEP、KEEP_HIERARCHY和DONT_TOUCH三大综合属性的实战应用与避坑指南。通过实际案例和性能对比,帮助FPGA工程师有效保留关键观测信号,提升调试效率,同时平衡设计性能。

weixin_28366053的博客 441

vivado防止信号被优化

在添加ILA进行DEBUG时经常发现某些信号找不到了,可以在信号定义前添加如下约束(选择其中一个即可) 1.(* keep = "true" *) 2.(* keep_hierarchy = “yes” *) 3.(* DONT_TOUCH= “TRUE” *) 例如:(* keep = "true" *)wire aaa; 若在例化模块前加则表示该模块的层次结构不优化,如:(* keep = "true" *)name name_u; 其中1和2的约束是仅防止

weixin_45050717的博客 4426

Vivado GATED_CLOCK、IOB、KEEP等关键属性实战解析与优化策略

本文深入解析Vivado中GATED_CLOCK、IOB、KEEP等关键属性的实战应用与优化策略。通过具体代码示例和实际项目经验,详细阐述了如何正确配置门控时钟转换、优化I/O性能以及保留调试信号,帮助FPGA工程师避免常见陷阱,提升设计性能和调试效率。

rl6adventurer的博客 594

vivado模块端口名被优化

问题:需要搞清楚(*keep_hierarchy = “yes” *)和(*keep_true = “yes” *)区别。在该模块后增加了防止被优化的语句后正常。(*keep_hierarchy = “yes” *)将该模块放在一个大工程中,模块名发生了变化,增加了一些不知名的信号。一次作者在调试过程中发现单独综合某个模块,模块名正常。

FPGAer_QQ742875810的博客 784

【Vivado】ILA调试信号被优化拆分?综合属性KEEP与DONT_TOUCH实战解析

本文深入解析Vivado中ILA调试信号被优化拆分的问题,详细介绍了KEEP、KEEP_HIERARCHY和DONT_TOUCH三大综合属性的使用场景与实战技巧。通过具体代码示例和调试策略,帮助FPGA工程师有效保留关键观测信号,提升硬件调试效率。特别针对信号拆分问题提供了从基础到高级的完整解决方案。

weixin_29246195的博客 183

prokka-原核及病毒基因组高效便捷注释

文章目录简介安装使用参考 简介 Prokka: rapid prokaryotic genome annotation 全基因组注释是在一组基因组DNA序列中识别感兴趣的特征,并用有用的信息标记它们的过程。Prokka是一款软件工具,可以快速注释细菌、古生菌和病毒基因组,并生成符合标准的输出文件。 安装 conda install -c conda-forge -c bioconda -c defaults prokka Test Type prokka and it should output its

Neptuneyut的博客 3313

Vivado (* KEEP=“TRUE“*) 抓取波形 网表

使用Vivado17.4来抓取波形的时候,会遇到一些问题,比如,我想要观察的信号,在网表中找不到,那该怎么办呢? 在代码中添加几句常用语句可以解决这个问题。 1.一般在模块之前加上这句:(* KEEP_HIERARCHY="YES"*)。 例如: (* KEEP_HIERARCHY="YES"*)module ads1018( output reg ads_clk , output reg ads_din , output reg ads_...

AlibabaApple的博客 1万+

gRPC之gRPC开发流程与入门案例

gRPC之gRPC开发流程与入门案例

YIYIYI 3759

Vivado 综合属性实用命令

本文记录一些用于 Vivado 综合约束的实用命令,欢迎补充~ 本文会适当结合一些特定设计进行解释,并结合相关工程进行具体的综合实现分析,不只是理论知识还有实际操作。 演示使用的Vivado 版本:2018.3 FPGA芯片型号:xc7a35tfgg484-2 本篇博文,建议在电脑端网页/pad上查看~

记录所学,分享知识,结识挚友 5892

jane street market prediction 冠军方案 奇巧淫技与topline链接整理(3/3)

目录前言将income 作为loss(优化目标)读取数据,定义优化目标模型训练与微调提交结果多目标学习Topline整理AE+MLP (rank10)Current 17th solution: Ensembles of deep (49 layer) MLPsmixup augmentation: a way to learn from trades with weight=0 (rank4)My (perhaps) over-complicated LSTM solutionCurrent 62nd .

weixin_51484067的博客 2642

【100分】最长子字符串的长度

题目要求在一个环形字符串中找出字符 ‘o’ 出现了偶数次的最长子字符串长度。这里的字符串是一个环形的,即首尾相连。代码统计了字符串中字符 ‘o’ 的出现次数,并根据其奇偶性返回相应的最长子字符串长度。当 ‘o’ 的数量为偶数时,直接返回字符串长度;当 ‘o’ 的数量为奇数时,返回长度减去 1。给你一个字符串 s,字符串s首尾相连成一个环形 ,请你在环中找出 ‘o’ 字符出现了偶数次最长子字符串的长度。【最长子字符串的长度】

weixin_54707168的博客 899

KEEP_HIERARCHY

KEEP_HIERARCHY

cckkppll的博客 2148

19、情境理论中的信息结构解析

本文系统解析了情境理论中的信息结构,从信息元(infon)的基本概念出发,深入探讨了关系结构与简单信息结构的构建方法,分析了标准信息结构所满足的一系列公理(如A1-A14),并阐述了角色、同一性、高阶信息、循环现象、参数适当性及信息元部分性等核心性质。通过具体示例和流程图展示了信息结构的构建过程,并对比了不同公理下的结构差异,最后讨论了该理论在与其他领域融合中的发展趋势及面临的挑战。

book8的博客 81

KEEP TURE

使用Vivado17.4来抓取波形的时候,会遇到一些问题,比如,我想要观察的信号,在网表中找不到,那该怎么办呢? 在代码中添加几句常用语句可以解决这个问题。 1.一般在模块之前加上这句:(* KEEP_HIERARCHY="YES"*)。 例如: (* KEEP_HIERARCHY="YES"*)module ads1018( output reg ads_clk , output reg ads_din , output reg ads_...

BeiJing_Stu_New_2018的博客 2091

财务数字化——解读美的战略规划之财务组织体系建设【附全文阅读】

本文提出适用于集团企业的财务管控方案,面向财务负责人、HR及战略规划人员。方案整合四种管控模式,结合500强案例,构建"职能定位-架构设计-权责划分-人才发展"体系,涵盖财务五大模块。通过明确总部与事业部权责边界,提供组织架构等实操框架,旨在平衡财务管控与业务支持,提升效率与风控能力,满足集团财务体系规范化建设需求。

cdfunlove的博客 664

1、vectorCast单元测试常用操作

进入软件主页面,点击file,选择set working directory,随便选择一个保存该项目的目录即可。

weixin_59334478的博客 2158

vivado GATED_CLOCK、IOB、IO_BUFFER_TYPE、KEEP、KEEP_HIERARCHY、MARK_DEBUG

vivado GATED_CLOCK、IOB、IO_BUFFER_TYPE、KEEP、KEEP_HIERARCHY、MARK_DEBUG

cckkppll的博客 2572

RK3588网卡出现丢包或者带宽不足的问题验证排查

注意除了有最大的TCP数据接收缓冲,还有/proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲可以调整,这里暂时没用到,针对具体需要可适当调整。比如把ethx接口中断从默认的cpu0迁移到其它cpu,例如将eth0中断234移到cpu7 (10是16进制, cpu0 =3588的cpu有8个核,4个A55(小核)+4个A76(大核),可以找到对应中断 将中断从默认cpu0核切到cpu7。tcp_rmem:单位是字节,接收缓存区大小,缓存从对端接收的数据,后续会被应用程序读取。

Android/Linux驱动开发传帮带学习,让驱动入门门槛更低! 2030

vivado 物理约束KEEP_HIERARCHY

vivado 物理约束KEEP_HIERARCHY

cckkppll的博客 1740

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Vivado中如何避免信号被优化掉?

刚写了一段 Verilog代码,辛辛苦苦花了很长时间综合,在debug的过程中,却找不到需要debug的信号了,查看网表发现没有? 这种情况是因为我们的某些中间信号被优化掉了。 被优化掉的原因...

yundanfengqing_nuc的专栏 5127

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Vivado防止信号被综合掉的三种方法

1、 信号前面将keep  hierarchy选择YES ,或者选择soft(在综合时保持层次),这样有利于你从模块中找到你想抓取的信号和信号名不被更改。 2、  信号前面使用 (* KEEP = “{TRUE|FALSE |SOFT}” *),可以防止信号被综合掉,但是无法防止在布局布线的时候优化掉 3、 信号前面使用(* DONT_TOUCH= “{TRUE|FALS

坚持 3万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【无标题】

信号前面将keep hierarchy选择yes ,或者选择soft(在综合时保持层次),这样有利于你从模块中找到你想抓取的信号和信号名不被更改。转载:https://blog.youkuaiyun.com/weixin_46062412/article/details/125299437。信号前面使用(* DONT_TOUCH= “{TRUE|FALSE}” *),可以防止信号在综合,以及布局布线的时候被优化掉。在定义的时候在后面增加/* synthesis keep */。a, 需要保留的信号类型是 wire。

weixin_42126058的博客 25

【vivado】ila观测信号被拆分问题

在FPGA中用ILA观测设计中的信号时,有时一些多比特信号会被拆分成一些零散的信号,这会增大信号观测的难度。这一问题的产生与vivado的综合工具有关,viavdo在综合时会对一些逻辑信号进行优化、重命名等操作,从而导致信号被拆分。

liuchj的博客 3460
上一篇: (* dont_touch=“true“ *)
下一篇: (* full_case *)
Js_cold
博客等级 码龄4年 143粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值