Verilog设计:理解阻塞与非阻塞赋值及其竞争冒险

需积分: 17 2 下载量 119 浏览量 更新于2024-08-20 收藏 447KB PPT 举报
"本资源主要探讨Verilog语言中关于同一变量的多次赋值问题,特别是在always块中的阻塞和非阻塞赋值,以及如何避免竞争冒险。内容来源于深圳大学信息工程学院的数字系统设计课程,讲解深入理解Verilog语言的关键概念。” 在Verilog数字系统设计中,对同一变量进行多次赋值可能会引发竞争冒险,这不仅限于阻塞赋值,非阻塞赋值同样可能产生此类问题。竞争冒险通常发生在不同的always块中对同一个变量进行赋值时,由于执行顺序的不确定性,导致输出结果不可预测。例如,有两个always块都试图对输出变量q进行赋值,由于执行顺序的随机性,可能会在仿真过程中观察到竞争冒险的现象。 Verilog中的always块扮演着关键角色,它可以用来描述时序逻辑或组合逻辑。每个always块只能有一个事件控制表达式,如posedge或negedge时钟沿,或者是无沿触发的组合逻辑。对于时序逻辑,应确保always块由单一的时钟边沿触发,并且最好在此时钟边沿上同时触发置位和复位。在always块内部,所有用于赋值的信号都应声明为reg类型或整型。整型变量默认为32位,但可以通过范围说明来定义不同宽度的整型变量。 在always块中,应当避免组合逻辑的反馈回路,因为这可能导致综合器插入不必要的锁存器。如果在设计中发现有组合回路,而综合器认为这不是电平敏感的锁存器,可能会引发错误。此外,对reg或integer类型的变量的赋值应在单个always块内完成,否则会导致语法错误。 阻塞赋值(=)和非阻塞赋值(<=)是Verilog中的两种赋值方式。阻塞赋值会在当前语句执行时立即更新变量的值,与输入信号的电平变化有关,而与触发沿无关。相比之下,非阻塞赋值会在当前语句执行后才更新变量的值,通常用于描述时序逻辑,以确保在所有先行赋值完成后才进行新的赋值。 综合器在处理Verilog代码时,如果遇到不确定的状态(如未知值'bx),会尽可能简化生成的硬件电路。因此,避免竞争冒险和理解何时使用阻塞和非阻塞赋值是Verilog设计的关键,以确保正确性和可综合性。深圳大学信息工程学院的这部分内容深入讲解了这些概念,对于理解和解决Verilog设计中的常见问题具有很高的实用价值。