阻塞和非阻塞赋值讲义.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2006-4-7 阻塞和非阻塞赋值 周晓波 电信学院 xbzhou@bjtu.edu.cn 阻塞赋值 阻塞赋值的执行可以认为是只有一个步骤的操作: 计算RHS并更新LHS,此时不能允许有来自任何其他Verilog语句的干扰。 所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的。 如果在一个过程块中阻塞赋值的RHS变量正好是另一个过程块中阻塞赋值的LHS变量,这两个过程块又用同一个时钟沿触发,这时阻塞赋值操作会出现问题,即如果阻塞赋值的次序安排不好,就会出现竞争。 阻塞赋值 非阻塞赋值 非阻塞赋值的操作可以看作为两个步骤的过程: 在赋值时刻开始时,计算非阻塞赋值RHS表达式。 在赋值时刻结束时,更新非阻塞赋值LHS表达式。 非阻塞赋值 Verilog模块编程要点 时序电路建模时,用非阻塞赋值。 锁存器电路建模时,用非阻塞赋值。 用always块建立组合逻辑模型时,用阻塞赋值。 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。 不要在一个以上的always块中为同一个变量赋值。 用$strobe系统任务来显示用非阻塞赋值的变量值 在赋值时不要使用 #0 延迟 移位寄存器模型 阻塞赋值实现移位寄存器模型 阻塞赋值实现移位寄存器模型 非阻塞赋值实现移位寄存器模型 非阻塞赋值实现移位寄存器模型 移位寄存器模型描述 四种阻塞赋值设计方式中有一种可以保证仿真正确 四种阻塞赋值设计方式中有三种可以保证综合正确 四种非阻塞赋值设计方式全部可以保证仿真正确 四种非阻塞赋值设计方式全部可以保证综合正确 阻塞赋值简单例子 时序反馈移位寄存器建模 时序反馈移位寄存器建模 时序反馈移位寄存器建模 原则1 :时序电路建模时,用非阻塞赋值。 原则2 :锁存器电路建模时,用非阻塞赋值。 组合逻辑建模时应使用阻塞赋值 在Verilog中可以用多种方法来描述组合逻辑,但是当用always块来描述组合逻辑时,应该用阻塞赋值。 如果always块中只有一条赋值语句,使用阻塞赋值或非阻塞赋值语句都可以,但是为了养成良好的编程习惯,应该尽量使用阻塞赋值语句来描述组合逻辑。 非阻塞赋值组实现合逻辑建模的问题 组合逻辑建模时应使用阻塞赋值 原则3 :用always块描述组合逻辑时,应采用阻塞赋值语句 时序和组合的混合逻辑——使用非阻塞赋值 时序和组合的混合逻辑——使用非阻塞赋值 原则4:在同一个always块中描述时序和组合逻辑混合电路时,用非阻塞赋值。 其他将阻塞和非阻塞混合使用的原则 Verilog语法并没有禁止将阻塞和非阻塞赋值自由地组合在一个always块里。 不建议在可综合模块中采用! 在always块中同时使用阻塞和非阻塞赋值的例子 对同一变量既进行阻塞赋值,又进行非阻塞赋值会产生综合错误 原则5:不要在同一个always块中同时使用阻塞和非阻塞赋值。 对同一变量进行多次赋值 误解: “在Verilog语法标准中未定义可在同一个always块中对某同一变量进行多次非阻塞赋值”。 事实是: Verilog标准定义了在同一个always块中可对某同一变量进行多次非阻塞赋值但多次赋值中,只有最后一次赋值对该变量起作用。 对同一变量进行多次赋值 结论:最后一个非阻塞赋值决定了变量的值 对同一变量进行多次赋值 小结 原则1:时序电路建模时,用非阻塞赋值。 原则2:锁存器电路建模时,用非阻塞赋值。 原则3:用always块写组合逻辑时,采用阻塞赋值。 原则4:在同一个always块中同时建立时序和组合逻辑电路时,用非阻塞赋值。 原则5:在同一个always块中不要同时使用非阻塞赋值和阻塞赋值。 原则6:不要在多个always块中为同一个变量赋值。 原则7:用$strobe系统任务来显示用非阻塞赋值的变量值 原则8:在赋值时不要使用 #0 延迟 initial begin a = 0; a = 1; end module badcode1 (q, d1, d2, clk, rst_n); output q; input d1, d2, clk, rst_n; reg q; always @(posedge clk or negedge rst_n) if (!rst_n) q = 1b0; else q = d1; always @(posedge clk

文档评论(0)

w447750 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档