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

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
楼主: zhuyuefeng2009

[求助] 夏宇闻书上的一个例子说是模块会不稳定

[复制链接]
发表于 2013-5-9 11:58:48 | 显示全部楼层
本帖最后由 changan1216 于 2013-5-9 13:51 编辑

回复 8# lordlion

或许我说话有些言重了,那好吧,我也道个歉,
不可否认,您的话确实有道理,这个例子几乎没有实用的意义,原因楼上我刚刚解释了,该例子仅是老外为了解释阻塞非阻塞差别而有意引入的一个并不合理的例子,也说明了,这种时序逻辑使用阻塞赋值的使用方法是应当避免的

您说的:"忽略了硬件设计语言的本质,纠结在语法的小技巧里,十分怀疑这些人是否真的干过设计,看书的风格完全是从C语言跑出来的,"
您说的这个c的思想来分析,实际上在原文当中,是站在综合器和仿真器的角度来分析的,那么遇见阻塞赋值,就必然要把这两句y1=y2和y2=y1分出个先后顺序了,所以前仿真必然会出现与设计想法相悖的结果,当然这个结果仅限于前仿真,后仿真走的综合后电路模型,是不存在这个错误的
当然了这个例子到底具备什么样的实际意义?我觉得存在就有它的道理,可能我才疏学浅,不知道罢了,至少在这里,这个例子的存在意义说明了阻塞和非阻塞赋值在综合和仿真工具对实际电路分析中的原理和差别.

或许我年纪尚轻,也孤陋寡闻,接触的人也比较少,至少夏先生是我见过的不可综合的行为模块写的最好的,这一点也是我周围的人公认的,
至于夏先生的不足之处,不可否认,人无完人,

我不知道您对夏先生认识有多深,至少就我个人而言,我觉得我比您了解的多一些,先抛开书中错误和对人的误导,也抛开他的学术和项目设计与验证的功底,至少古稀之年还每日坚持翻译国外最新教材和书籍,这一点我是折服的,这份心应当值的肯定,

书中有错误就是误人子弟么?我不认为,难道仅凭这一个例子?况且这个例子出现的前因后果我也说了,一点也没有误导人,只是您以偏概全误解了
如果您能指出书中真的存在对硬件描述语言本质的严重误导,以我对夏先生的了解,他一定会邀请您去他家做客的

瘦死的骆驼比马大,再怎样,几十年的经验,不敢说方方面面都强于您,总有比你我认识深刻的地方,总是值得人尊敬和学习的
谦虚和尊重,尤其是对你并不了解的人,始终是一个好的品质

回复 10# 加油99

是的,这个例子当中阻塞非阻塞综合后电路是没差别的,后仿真也是一样的,差别仅在于前仿真,由于使用阻塞赋值会导致前仿真出错,因此时序逻辑要求使用非阻塞赋值实现,正如前面所说,即便这样描述可以综合出正确的电路,但应当避免这样描述
回复 支持 反对

使用道具 举报

发表于 2013-5-9 13:13:30 | 显示全部楼层
看大家说的都挺精彩的,批判和争论也是种学习啊!
回复 支持 反对

使用道具 举报

发表于 2013-5-9 13:48:34 | 显示全部楼层
还是10楼的方法最实在,你得看看综合出来的实际电路是怎么样的,根据电路来分析结果是最好的,光盯着代码看没意义,毕竟这是HDL不是C语言。
回复 支持 反对

使用道具 举报

发表于 2013-5-9 14:06:22 | 显示全部楼层
回复 13# arccosx


    蒽,这是正路~

只是这段代码在原文中的原本用意并不是为了说明综合出什么样的电路,而是为了说明多个时序逻辑always块用同一个时钟触发,其内部用了阻塞赋值,且互相耦合,会对综合器和仿真工具的分析过程造成影响,会使前仿真结果出现不确定性,仅此而已,
并且也说明了为了避免这种不确定性的错误,不要在时序逻辑当中使用阻塞赋值,
回复 支持 反对

使用道具 举报

发表于 2013-5-9 14:13:49 | 显示全部楼层




    但是这段代码里面,用阻塞赋值和非阻塞赋值的方式,综合出的电路是一样的。因为这段代码遵循了一个原则:在一个always块里面只对一个变量进行赋值,或者多个变量之间没有因果关系。这应该是HDL代码编写的基本原则吧。
回复 支持 反对

使用道具 举报

发表于 2013-5-9 14:28:34 | 显示全部楼层
有争论是好的,可以让概念更清晰, 不过最好限制在问题本事上。

我一开始并没注意到这个赋值的方式,个人觉得这是个很不好的书写习惯。
对应综合而言,always里的触发方式基本就决定了是组合电路还是时序电路,
所以在systemverilog里面,还特别增加了不同的always关键字。
对于DC综合,只要不在一个always里面混用两种赋值方法,都不会出问题。
但是如果养成这种赋值不规范的习惯,就容易出现混用的可能,导致综合出问题。
好的习惯一定可以避免很多低级错误, 所以有些坚持还是值得的。

这个例子是有些不妥的,如果要达到书上说的情况,只限于手工放置这两个寄存器,
一个离时钟源很近, 一个很远,造成hold violation;
如果用综合工具,很容易保证时序不会有问题,即便时钟有skew,造成有一个寄存器(DFF1)
先采到数据,但是因为hold time,采到的数据也不会立刻出现在DFF1/Q上而被
另外一个寄存器(DFF2)采到,否则DFF2就是漏掉了前一个DFF1/Q,这是hold violation.

可能作者在用这个例子说明自己的想法的时候,并没有考虑实现的问题。或许是作者觉得
交代太多的背景条件,会让很多初学者难以理解。但无论如何,应该找一个更恰当的例子才好。
回复 支持 反对

使用道具 举报

发表于 2013-5-9 14:42:51 | 显示全部楼层
回复 15# arccosx


蒽,综合后形成电路没差别,后仿真也没差别,

有影响的仅仅是前仿真或者该模块作为行为模块时,在仿真工具中运行时,由于会对同时变化互相耦合却使用了阻塞赋值的两个量分出个先后顺序关系来,因此会对仿真结果产生不确定性

当然,我也觉得这里用"几个p秒"来描述有些不妥,毕竟几个p秒对于实际电路同步时钟的影响来说恐怕构不成威胁,
实际上通篇阅读以后,可以明白原文的意图,理解其思想才是我们要做的,
至于这几个p秒么....毕竟老外的东西,翻译成中文难免有瑕疵.....咱们就放过它吧...........
回复 支持 反对

使用道具 举报

发表于 2013-5-9 14:51:30 | 显示全部楼层
回复 16# mipsgreen


蒽,您分析的很对,原文就是以此例为反例,说明这种赋值方式是不好的,会造成不确定性和时序违逆,因而不建议这样使用
后面紧跟着一个没有歧义的用非阻塞赋值实现的振荡器实例,楼主没有贴出来而已,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-9 16:07:43 | 显示全部楼层
人间自有真情在啊。这么多人回复。。。
回复 支持 反对

使用道具 举报

发表于 2013-5-10 09:43:38 | 显示全部楼层


   
回复  arccosx


蒽,综合后形成电路没差别,后仿真也没差别,

有影响的仅仅是前仿真或者该模块作为行 ...
changan1216 发表于 2013-5-9 14:42




    嗯,有道理
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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


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

GMT+8, 2025-10-2 23:16 , Processed in 0.020550 second(s), 3 queries , Gzip On, Redis On.

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