在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: IC.Michael

[求助] 关于RTL中#DLY问题的请教及帧头检测方面的疑惑?

[复制链接]
 楼主| 发表于 2019-4-9 17:32:37 | 显示全部楼层


gaurson 发表于 2019-4-9 15:38
采错的根因一般是采样时钟和采样信号在时钟边沿事务队列中的位置不同所致,可能你用了环境产生的时钟去采 ...


感谢点拨,有点明白了,感觉这个根因很深奥啊,时钟边沿事务队列,我得去找找资料。多谢多谢。
 楼主| 发表于 2019-4-9 17:35:33 | 显示全部楼层


gaurson 发表于 2019-4-9 15:38
采错的根因一般是采样时钟和采样信号在时钟边沿事务队列中的位置不同所致,可能你用了环境产生的时钟去采 ...


哦哦,再请教下啊,这个原因是因为仿真的时候CPU特性决定的(比如逐条执行命令,导致两者时间并不完全对齐),还是说是Verilog代码时钟沿触发的时候存在这个问题呢,在硬件上应该没有这个“时钟边沿事务队列”的问题吧?
发表于 2019-4-10 16:09:39 | 显示全部楼层
仿真工具决定的这种行为,因为实际硬件上任何路径都是有时延的,不存在完全在一个时钟边沿处理多个事务的情况。
 楼主| 发表于 2019-4-10 22:44:52 | 显示全部楼层


gaurson 发表于 2019-4-10 16:09
仿真工具决定的这种行为,因为实际硬件上任何路径都是有时延的,不存在完全在一个时钟边沿处理多个事务的情 ...


大概明白了,多谢您的回复。
发表于 2019-4-11 15:24:01 | 显示全部楼层


IC.Michael 发表于 2019-4-10 22:44
大概明白了,多谢您的回复。


不客气。
发表于 2019-6-12 15:36:15 | 显示全部楼层
原来是这样。。
难怪看很多人做FPGA开发的代码里面,非要加一个延时,原来是兼容仿真工具和查看的时候可以一目了然知道时钟边沿对齐了哪个数据。
发表于 2019-6-15 11:26:03 来自手机 | 显示全部楼层


七点班车 发表于 2019-4-8 21:10
不加#UDLY,有些仿真工具可能会采错,本来是要采时钟沿前的数据,结果采到了时钟沿后的数据了,即使是前仿 ...


出现这种问题的原因是设计中手动例化了标准单元,标准单元的描述是用primitive或者udp完成的而不是用一般的阻塞和非阻塞描述。或者testbench给激励方式的问题,例如给a赋值,你可以这样initial a = b; end也可以initial a <= b; end通常这两种方式产生的仿真结果不同,如果a和时钟沿对齐,那么前者可以当拍采到,后者在下一拍采到。
非阻塞赋值中加#1并不会改变非阻塞所谓估值事件,更新事件队列的调度,起的作用充其量只是波形看起来方便有个1单位的延时而已。
如果你仿真中发现信号a和时钟沿对齐居然当拍采样,那的把那个信号改一下
always @(*) a_tmp <= a;然后时钟去采样a_tmp就可以完美的解决这个问题,且不影响设计本身逻辑,前后仿不会出现不一致的情况。
实际上,很多公司所谓的编码规则就强制要求非阻塞添加#1,包括一些大厂,理由是避免仿真问题,然后以讹传讹,大厂员工流向现场,就这样一个错误概念成“真理”。synopsys官方是不建议这样做,因为这样会极大降低仿真benchmark,而且就算使用delay_zero模式屏蔽#1仿真效率也达不到最大!!!synopsys官方提交的一篇优秀获奖论文就极力反对非阻塞添加#1,并且论述极为精准,从ieee1364标准角度严格证明了市面上流传的非阻塞添加#1的理由就是彻头彻尾的伪真理!有兴趣的朋友可以在谷歌上搜索这篇论文。
 楼主| 发表于 2019-9-17 10:47:50 | 显示全部楼层


saipolo 发表于 2019-6-15 11:26
出现这种问题的原因是设计中手动例化了标准单元,标准单元的描述是用primitive或者udp完成的而不是用一般 ...


赞!感谢!看到了不一样的解释。大神能否贴下那篇文章呢。
 楼主| 发表于 2019-9-17 18:39:42 | 显示全部楼层


saipolo 发表于 2019-6-15 11:26
出现这种问题的原因是设计中手动例化了标准单元,标准单元的描述是用primitive或者udp完成的而不是用一般 ...


——【always @(*) a_tmp <= a;然后时钟去采样a_tmp就可以完美的解决这个问题,且不影响设计本身逻辑,前后仿不会出现不一致的情况】
请问下,如果这么操作的话不是很麻烦么,所有的信号都得这么赋值一遍?这是解决根因的最有效办法吗?那如果不这么做,而是在赋值的时候#1,这种方法有风险吗?
发表于 2019-10-10 20:57:07 | 显示全部楼层


IC.Michael 发表于 2019-9-17 18:39
——【always @(*) a_tmp


并非每一个都加,我遇到的情况都是一个项目中最多有一两个这种情况,手动改掉这一两个就行,完全不影响逻辑功能。
当然如果你愿意,完全可以使用VPI来监测这种情况,然后VPI来自动改正,这非常复杂,完全可以申请一个软件专利了。
你想阅读的论文 是Clifford E. Cummings所做的VerilogNonblocking Assignments With Delays, Myths & Mysteries,谷歌上去搜索吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-13 18:05 , Processed in 0.021438 second(s), 7 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表