|
编写RTL一晃十来年了,遇到了很多形形色色工程编码规范、约束和建议,故而在此阶段性汇总。本系列中所提及和讨论的verilog/sv编码建议以及一些工程的要求只是工作过程所接触和了解内容,非普适性的编码规范,也并不代表个人赞同这些规范,一家之言仅和大家探讨这些建议原因和得失。
本系列的前四篇请参见:为什么要求不在RTL中使用always为什么避免在RTL中滥用宏定义为什么避免在RTL中使用task为什么在设计中优先使用无复位寄存器[/ol]按理说,不在RTL里使用#delay引入延迟这点不需要作为专门作为一个编码规范来提,因为#delay本身就不是可综合语法嘛。验证里为了构建一些波形场景随便用别人管不着,要拿去综合的RTL代码里写这个就过分了。但是前司和前前司都将这一条拿出来说了一下,就很有意思了。既然有这个规范那说明之前肯定有人这么做过,所以我这种爱看八卦的人就必须去探究一下了。
探究的第一个问题是,有没有公司这么写过呢(即要求写#delay)?有,比如前前司的古早代码(耳闻)以及两个前同事口中的前司(同样是耳闻)。在github上的一些开源项目里也能看到类似这样的写法比如:
https://link.zhihu.com/?target=https%3A//github.com/risclite/ARM9-compatible-soft-CPU-core
always @ ( posedge clk or posedge rst )if ( rst ) reg_ans 64'd0;else if ( cpu_en ) if ( ~hold_en ) reg_ans else if ( cmd_is_ldm ) if ( cmd_sum_m==5'b1 ) reg_ans[6:2] else if ( cmd[23] ) reg_ans[6:2] 6:2] + 1'b1; else reg_ans[6:2] 6:2] - 1'b1; else;else;这个代码有一说一看得人头疼。此外根据某大佬的描述,某司的古早代码中采用的方式大概也是这样的,就是定义了一个宏使其在前端仿真和综合时定义不同:
`ifdef SIM_MODE `define RTL_DELAY #1ps`else `define RTL_DELAY //不记得这个#是在宏里面还是外面了,不影响意思倒是这样在综合时`RTL_DELAY相当于是空格完全不可见,在仿真时是#1ps参与仿真的进程。我后来想了一下,即使留着#delay综合工具是不是也会将其忽略呀?还是会报Error中断综合,记不清了之后我试试看然后把结果贴一下。
探究的第二个问题是,为什么这么做。根据该大佬的溯源,之所以当时的代码引入的#delay是为了避免仿真中的“竞争与冒险”,因为当时部门对于仿真行为的一些特点拿捏不好,为了快刀斩乱麻规避RTL和仿真的“竞争与冒险”问题所以引入了#delay。后来在验证力量逐步完善以及大佬等人的探究下,摸清了标准的仿真行为所以后面就把#delay统一在后续的项目中删掉并且禁止在RTL中使用了。
ifqcf3y5obq6404509405.jpg
关于这个探究后来我也跟着完整的学习了一遍,受益颇多。
efb2mlsdozl6404509505.jpg
q4gxfxpnbqh6404509605.png
系列文章入口
【芯片设计】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? | 芯片搬砖日常·逼死强迫症的关键词不对齐事件 | 熟人社会里,一群没有社会价值的局外人 | |
|