阻塞赋值、非阻塞赋值硬件背景以及数据流建模、行为建模适用条件.pdfVIP

阻塞赋值、非阻塞赋值硬件背景以及数据流建模、行为建模适用条件.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据流建模和行为建模 数据流建模的按需赋值语句基于电平敏感行为,总是处于活动状态,即只要赋值语句右 边表达式中任一变量发生电平变化,该表达式即被重新计算,然后将新值传递给左边。不同 的连续赋值语句之间是并行执行,没有语句次序 (先后)上的关系,所以连续赋值语句一般 不应存在反馈,否则可能导致逻辑振荡。一个特例是条件赋值语句可以描述锁存器电路。 所以,数据流建模一般用于给组合逻辑建模,以及条件赋值语句可以给锁存器建模(门 控锁存器,状态转时间长控制信号有效期长,在控制信号有效期内,锁存器状态直接由输 入激励决定)。 行为描述是基于周期性的行为,always 结构一次执行语句,并且是无限反复运行。这种 周期的触发 (当触发时,开始一个新的周期—always 重新从头执行)可以是电平敏感,也可 以是时钟边沿敏感,因为周期性行为,在周期之间信号或变量应保持其状态(保持不变,是 触发器的特性),所以在行为描述结构中只能对寄存器类型变量赋值。 行为建模可以给组合逻辑电路建模(敏感列表是电平),也可以给时序逻辑建模(是clk 边沿敏感)。 ******************************************************************************* ******************************************************************************* 阻塞赋值和非阻塞赋值 在写组合逻辑电路的代码时,我发现书上例子大都用的=;而在写时序逻辑电路代码 时,我发现书上例子大都用的=。之前就知道在Verilog HDL 中阻塞赋值=和非阻 塞赋值=有着很大的不同,但一直没有搞清楚究竟有什么不同,现在来慢慢的琢磨它。 对于我这样的初学者而言,首先要掌握可综合风格的 Verilog 模块编程的 8 个原则, 并且牢记,才能在综合布局布线的仿真中避免出现竞争冒险现象。 (1) 时序电路建模时,用非阻塞赋值。 (2) 锁存器电路建模时,用非阻塞赋值。 (3) 用always 块建立组合逻辑模型时,用阻塞赋值。 (4) 在同一个always 块中建立时序和组合逻辑电路时,用非阻塞赋值。 (5) 在同一个always 块中不要既用非阻塞赋值又用阻塞赋值。 (6) 不要在一个以上的always 块中为同一个变量赋值。 (7) 用$strobe 系统任务来显示用非阻塞赋值的变量值。 (8) 在赋值时不要使用 #0 延时。 这样做的目的是为了使综合前仿真和综合后仿真一致。在很多时候,用=或者是= 实际上对应的是不同的硬件电路,这点一定要十分清楚。 如果我们想让两个最基本的 D 触发器串联,我们用阻塞和非阻塞赋值看看结果有什么 不同 阻塞和非阻塞的不同造成了电路上巨大的不同,因此他们的差别应该牢记。 ******************************************************************************* ******************************************************************************* 非阻塞赋值语句的功能是使得所有语句右侧变量的值都同时被赋给左侧的变量,因此, 在上面的实例中,q[1]得到的是 q[0]的原始值,而非sin 的值(在第一条语句中,sin 的值被 赋给了 q[0] )。这正是我们期望得到的实际硬件电路。当然,我们可以把上边的四条语句合 并写成一条简短的语句:q= {q[2:0],sin} 。 阻塞赋值语句的功能更接近于传统的程序设计语言,但是阻塞赋值语句并不是准确的硬 件工作模型。下面考虑使用阻塞赋值语句来实现同一模块可以得到什么结果。在始终clk 的 上升沿,verilog 将会把sin 的值赋给q[0],然后 q[0]的新值被赋给q[1],如此继续执行下去。 最终所有的四个寄存器都会得到相同的值:sin 的值。 本部分内容用意在于:讲述使用 always 语句块对时序逻辑电路进行建模的时候,如何 使用非阻塞赋值。如果设计者能够充分的灵活应用,比如倒转上例中四条语句的顺序,那么 使用阻塞赋值语句仍然能实现相应的功能 (语句顺序改成9-8-7-6 ),但是与使用非阻塞赋值 的方法相比,这种方法并不会带来任何好处,相反还暗藏了巨大的风险。 q[

文档评论(0)

bhyq + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档