电子产业一站式赋能平台

PCB联盟网

搜索
查看: 17|回复: 0
收起左侧

【芯片设计】为什么RTL中时钟复位信号避免和逻辑信号耦合

[复制链接]
匿名  发表于 昨天 12:05 |阅读模式
编写RTL一晃十来年了,遇到了很多形形色色工程编码规范、约束和建议,故而在此阶段性汇总。本系列中所提及和讨论的verilog/sv编码建议以及一些工程的要求只是工作过程所接触和了解内容,非普适性的编码规范,也并不代表个人赞同这些规范,一家之言仅和大家探讨这些建议原因和得失。
本系列的前九篇请参见:
  • 为什么要求不在RTL中使用always
  • 为什么避免在RTL中滥用宏定义
  • 为什么避免在RTL中使用task
  • 为什么在设计中优先使用无复位寄存器
  • 为什么RTL中避免使用#delay引入延迟
  • 为什么自研代码的filelist避免-y和-v索引
  • 为什么RTL中避免使用casez/casex
  • 为什么RTL中要谨慎for循环
  • 为什么RTL中谨慎使用function[/ol]这条和之前一样,仍然是适用在常见的数字同步设计中的规则,一些把时钟信号打包的场景就不计入这里了(复位信号没有打包的吧)。因此从这个维度讲,这一条也算是比较普适性的RTL编码规范,不知道有没有哪位大佬曾经写过或见到过普通信号和时钟复位信号耦合在一起做逻辑的情况,欢迎在评论区分享一下。我目前就见过两次,一个是朋友写的计数器单元,计数器有一个flush信号用于释放或者说将计数器值归零,于是就出现了这个代码:
  • //always_block  if(~rst_n || flush) xxx_cnt 4'b0;具体怎么被批的忘了,但是肯定是要求修改代码了,印象里这个lint检查也会报错。第二个是之前在知乎上一位咨询代码的朋友给我展示的一段代码,据他聊是已经有过流片经历的一段代码,当然并无意质疑这一点毕竟没见过的代码和写法还是很多的,只是单纯觉得有点奇怪仅在此展示:
  • assign xxx_pulse = xxx_in & clk;按这位朋友说的代码里是要得到一个半频的信号给后面用,所以或许这样写是可以的?这点我确实没有把握,存疑吧。第三个也是之前找我咨询的一个朋友发给我的,具体上下文记不清了,大概是有这样一句:
  • assign xxx_power = ~rst_n && case1 && enable;这里的reset是不是很冗余呀,删掉也完全不影响。而时钟和复位信号为什么不能和普通的信号逻辑耦合在一起需要分开探究下。对于复位信号而言,我个人自己觉得最核心的第一是,不管你怎么对复位信号进行处理了在目前较常见的情况里,复位也是一个异步信号。与普通信号做逻辑那至少是违背了避免多时钟域组合逻辑的要求。第二是,复位逻辑很长和逻辑信号混在一起,时序也没法收对吧?当然这个是自己想的,拿这个问题去问的时候,达到比较多的回答是:后端做不了,工具也不允许,容易打死你。拿这个问题问了下DeepSeek,得到的回答如下仅供参考。在RTL设计中,复位信号不能与普通信号混在一起做逻辑,主要原因如下:
    1. 复位信号的特殊功能
    复位信号用于初始化电路状态,确保系统从一个已知状态启动。与普通信号混合可能导致复位不完全或错误,影响电路的初始状态和后续行为。
    2. 时序要求严格
    复位信号通常异步有效、同步释放,时序要求严格。与普通信号混合可能导致时序问题,如复位信号延迟或毛刺,进而引发电路功能错误。
    3. 综合和优化问题
    综合工具对复位信号有特殊处理,混合使用可能导致工具无法正确识别复位信号,产生非预期的逻辑或时序路径,影响电路性能和面积。
    4. 可靠性和可测试性
    复位信号的纯净性对电路可靠性和可测试性至关重要。混合使用会增加故障风险,并可能掩盖设计缺陷,增加调试难度。
    5. 设计规范和最佳实践
    行业规范和最佳实践要求复位信号单独处理,以确保设计的一致性和可维护性。
    因此,复位信号应与普通信号分开处理,以确保电路的正确性、可靠性和可维护性。
    时钟为什么不能和普通信号做逻辑也直接问问好了,突然发现内容好写了很多啊,不过确实也因为我在工作里一直就这么写,没咋去深入探究过。在RTL设计中,时钟信号不能与普通信号混在一起做逻辑,主要原因如下:
    1. 时钟信号的严格时序要求
    时钟信号用于驱动同步逻辑(如触发器),其稳定性和延迟直接影响电路的时序行为。
    与普通信号混合可能导致时钟路径上引入额外的逻辑延迟,破坏时序关系,导致建立时间(setup time)或保持时间(hold time)违规。
    这种违规可能引发亚稳态(metastability)或功能错误。
    2. 时钟信号的纯净性
    时钟信号需要保持纯净,避免毛刺(glitch)或干扰。
    与普通信号混合可能导致时钟信号上产生毛刺,进而触发错误的逻辑行为,甚至导致系统崩溃。
    3. 综合和优化问题
    综合工具对时钟信号有特殊处理,会将其识别为全局信号并优化其路径。
    如果时钟信号与普通信号混合,综合工具可能无法正确识别时钟信号,导致非预期的逻辑或时序路径,影响电路的性能、功耗和面积。
    4.时钟树综合(CTS)问题
    在物理设计阶段,时钟信号会通过时钟树综合(Clock Tree Synthesis, CTS)进行优化,以确保时钟信号的低偏斜(skew)和低延迟。
    如果时钟信号与普通信号混合,CTS工具可能无法正确构建时钟树,导致时钟分布不均匀,影响电路性能。
    5. 可靠性和可测试性
    时钟信号的纯净性对电路的可靠性和可测试性至关重要。
    与普通信号混合会增加故障风险,并可能掩盖设计缺陷,增加调试和验证的难度。
    6. 设计规范和最佳实践
    行业规范和最佳实践要求时钟信号单独处理,以确保设计的一致性和可维护性。
    混合使用时钟信号和普通信号会违反这些规范,降低设计的可读性和可维护性。
    时钟信号是数字电路的核心,其稳定性和纯净性直接影响电路的功能和性能。因此,时钟信号必须与普通信号分开处理,避免引入额外的逻辑或延迟,以确保电路的正确性、可靠性和可维护性。

    系列文章入口
    【芯片设计】SoC 101(一):绪论【芯片设计】FIFO漫谈(零)从无处不在的FIFO开始说起【芯片设计】计算机体系结构(一)虚拟内存【芯片设计】深入理解AMBA总线(零)绪论
    【芯片设计】握手协议的介绍与时序说明【芯片设计】复位那些小事 —— 复位消抖【芯片设计】快速入门数字芯片设计(一)Introduction【芯片验证】UVM源码计划(零)下定决心读源码前的自测环节
    【芯片设计】异步电路碎碎念(一) 到底什么是异步电路
    【芯片设计】从RTL到GDS(一):Introduction
    【芯片设计】系统中的可维可测状态记录寄存器设计
    其他文章链接
    【芯片验证】sva_assertion: 15道助力飞升的断言练习【芯片验证】可能是RTL定向验证的巅峰之作【芯片验证】RTL仿真中X态行为的传播 —— 从xprop说起【芯片验证】年轻人的第一个systemVerilog验证环境全工程与解析
    【芯片设计】verilog中有符号数和无符号数的本质探究
    【芯片设计】论RTL中always语法的消失术
    【芯片设计】代码即注释,注释即代码
    【芯片设计】700行代码的risc处理器你确实不能要求太多了
    入职芯片开发部门后,每天摸鱼之外的时间我们要做些什么呢
    如何计算系统的outstanding 和 burst length?
    芯片搬砖日常·逼死强迫症的关键词不对齐事件
    熟人社会里,一群没有社会价值的局外人
  • 本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复

    使用道具

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表