Verilog程序设计与EDA(二版) 课件 第3章 Verilog HDL的基本语句.pptx
3.1赋值语句
3.2块语句
3.3条件语句
3.4循环语句
3.5结构说明语句
3.6行为描述语句
3.7内置门语句
;3.1赋值语句;3.1.1连续赋值语句和过程赋值语句
赋值语句分为连续赋值语句和过程赋值语句。
1.连续赋值语句
连续赋值语句一直是有效的,无论何时输入一旦改变,输出就随着改变。它的标志(即关键字)是assign。
连续赋值语句的格式为
assign[drive_strength][delay]list_of_net_assignments;
其中:方扩号都是可选部分;驱动强度[drive_strength]默认为strong0和strong1,也可指定为除supply0和supply1之外任何类型的标量线网;延迟[delay]默认为0;list_of_net_assignments是列出线网赋值。;2.过程赋值语句
只有当过程到来且控制权传递给它时才执行的语句称为过程赋值语句。过程赋值语句的前面没有关键字,它出现在过程块中。
过程赋值的格式为
regtype=expression;
其中,regtype寄存器变量必须是寄存器类型或存储器型变量,应在模块的说明部分确认;expression是表达式。
直接用“=”给变量赋值的过程赋值的左端变量必须是reg。
过程赋值只允许出现在always和initial结构块中。
;3.1.2阻塞赋值语句和非阻塞赋值语句
赋值语句又分为阻塞赋值语句和非阻塞赋值语句。
阻塞赋值语句用=符号连接,非阻塞赋值用=符号连接,可形象的记忆为非阻塞赋值多了个非,符号就多了个。
阻塞赋值语句和非阻塞赋值语句是用VerilogHDL建模的难点之一,设计时要仔细琢磨。
1.阻塞赋值语句
我们先看如图3.1所示的阻塞赋值语句的执行“路线图”。
阻塞,即本条语句具有影响下一条语句的作用。在同一个always
进程中,一条阻塞赋值语句的执行直接影响着下条语句的执行情况和
结果。阻塞,从字面层上可理解为本条语句阻塞了下一条语句的执行。;2.非阻塞赋值语句
我们先看如图3.2所示的非阻塞赋值语句的执行“路线图”。
非阻塞,即各条语句是并发执行(同时执行)的。它更能体现时
序逻辑硬件电路的某些特点。任何always和initial语句中,等待同
一个变化沿的所有非阻塞赋值语句都是同步的。非阻塞赋值通常与
边沿触发(敏感)电路对应,时钟边沿到来时,电路??动作,赋值才
有效。
通常,阻塞赋值语句运用在组合电路中,非阻塞赋值语句运用在时序电路中。但许多数字电路往往是既有组合又有时序,此时要仔细考虑。
当为时序逻辑建模时,使用“非阻塞赋值”;当描述边沿敏感电路系统中的并行传输时,一定要使用“非阻塞赋值”;当为锁存器(latch)建模时,使用“非阻塞赋值”;当在同一个always块里面既为组合逻辑又为时序逻辑建模时,使用“非阻塞赋值”。
;当用always块为组合逻辑建模时,使用“阻塞赋值”。
不要在同一个always块里面混合使用“阻塞赋值”和“非阻塞赋值”。
不要在两个或两个以上always块里面对同一个变量进行赋值。
可通过编写一个测试模块,并使用系统选通任务$strobe或系统显示任务$display进行功能仿真显示已被“非阻塞赋值”、“阻塞赋值”的值,观测、理解其概念。
本书在6.1.3小节比较了电路设计中阻塞赋值与非阻塞赋值的区别。
值得注意的是:采用非阻塞赋值的赋值语句,只有当整个设计中等待同一个边沿的所有非阻塞赋值语句“=”的右边计算完毕后,才更新它左边的值,左边的新值在下一条语句中是不能使用的。
阻塞赋值语句和非阻塞赋值语句可看成是两种类型以不同方式完成的过程赋值语句。;3.2块语句;VerilogHDL的块语句有顺序块语句和并行块语句。
3.2.1顺序块语句
顺序块语句的格式为
begin[:block_identifier{block_item_declaration}]
{statement}
end
其中:方扩号是可选部分(书中以后解释相同);block_identifier块标识符是给顺序块起的名子;block_item_declaration块项目说明可以是参数说明、寄存器说明、事件说明等。可以在命名的begin…end块内对新的局部变量进行规定和存取。begin...end之间可包含多条过程赋值语句。它们的用途是将多个过程语句组合成一个复合句。;3.2.2并行块语句
并行块语句的格式为
fork[:block_identifier{block_item_declaration}]
{statement}
join
其中:bl