前言
正文
合理的左值
过程性赋值(procedural assignment)
连续赋值
过程连续性赋值
往期回顾
何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:assignment.
它有三种基本形式:
过程性赋值
过程连续赋值
一个赋值语句有两个部分–右值(rhs)和左值(lhs),中间有一个相等的符号(=)或一个小于相等的符号(<=)。
下一节博文将看到,<code>=</code>为阻塞赋值,<code><=</code>为非阻塞赋值。
在过程性赋值中,合理的左值应该是:
变量(矢量/标量)
向量reg、integer或time变量的<code>位选择</code>或<code>部分选择</code>。
存储器(memory word)
上述任何一项的合并
过程赋值通常发生在块语句中,例如initial块,always块,还有task以及function中。
连续性赋值中,合理的左值应该为:
线网(矢量/标量)
矢量线网的位选择或部分选择。
位选择和部分选择的合并
连续性赋值通常发生在assign中。
过程连续性赋值:
线网或者变量(向量/标量)
线网向量的位选择或者部分选择
rhs可以包含任何计算为最终值的表达式,而lhs表示一个线网或一个变量,rhs中的值被赋值给它。
例如:
过程性赋值发生在过程(procedures)中,如always、initial、task和函数中,用于将值放到变量上。变量将保持该值,直到下一次对同一变量的赋值。
当仿真在仿真时间内的某一时刻执行该语句时,该值将被放到变量上。这可以通过使用控制流语句,如if-else-if、case语句和循环机制来控制和修改我们想要的方式。
变量声明赋值
一个初始值可以在变量声明时被放置到变量上,如下图所示。这个赋值没有持续时间,并且在下一次对同一变量的赋值发生之前保持这个值。
<code>注意,不允许将变量声明赋值用给数组。</code>
如果变量在声明过程中和initial块中的时间0被初始化,如下例所示,则不保证赋值顺序,因此变量值可以有8’h05或8’hee。
这种方式是不推荐的,正常人是不会这么做的。
这用于将值分配到标量线网和矢量线网上,只要rhs发生变化就会发生。它提供了一种不需要指定门的互连就能建立组合逻辑模型的方法,并使其更容易用逻辑表达式来驱动线网。
每当b或c的值发生变化时,rhs中的整个表达式将被计算,a将被更新为新的值。
注意:我们仍然可以在线网声明的时候进行连续赋值,例如:
但我们必须谨慎使用,因为一个网只能声明一次,所以一个网只能有一次声明赋值。
也就是说,一旦我们在声明wire变量的时候进行了连续赋值,后面则不能再次连续赋值,否则就是多驱动。
这种赋值类型貌似很少听过,但却是存在。
有两种类型:
<code>assign ... deassign</code>
<code>force ... release</code>
assign … deassign
这将覆盖变量的所有过程性赋值,并通过使用与deassign相同的信号来停用。变量的值将保持不变,直到变量通过过程化或过程化连续赋值获得新的值。赋值语句的lhs不能是位选择、部分选择或数组引用,但可以是一个变量或变量的连接。
为了测试,我仿真了一下,仿真文件:
按照语法描述,应该是前20ns都保持为assign赋值0,之后为1;
仿真结果显示也为如此。
force…release
这些语句与assign… deassign语句类似,但也可以应用于网和变量。lhs可以是网的位选择、网的部分选择、变量或网,但不能是数组的引用和变量的位/部分选择。force语句将覆盖所有其他对变量的赋值,直到使用释放关键字释放它。
为了测试,我们设计如下仿真文件:
现在对这段简单的测试程序进行分析:
在一开始的时候,由于a和b的初始值都为1,又:
因此,o的值为1;
经过10ns,a和b的值被赋值为0,因此o应该为0,但是此刻:
我们尝试将o拉高;
同样在过10ns:
我们再次尝试将o拉低;
从如下仿真图中可以看出均为成功。
这说明,在release之前,对变量o的所有操作都被忽视了。
继续看,在release之后,我们对o的操作都是成功的:
verilog初级教程(13)verilog中的块语句
verilog初级教程(12)verilog中的generate块
verilog初级教程(11)verilog中的initial块
verilog初级教程(10)verilog的always块
verilog初级教程(9)verilog的运算符
verilog初级教程(8)verilog中的assign语句
verilog初级教程(7)verilog模块例化以及悬空端口的处理
verilog初级教程(6)verilog模块与端口
verilog初级教程(5)verilog中的多维数组和存储器
verilog初级教程(4)verilog中的标量与向量
verilog初级教程(3)verilog 数据类型
verilog初级教程(2)verilog hdl的初级语法
verilog初级教程(1)认识 verilog hdl
芯片设计抽象层及其设计风格
verilog以及vhdl所倡导的的代码准则
fpga/asic初学者应该学习verilog还是vhdl?
个人微信公众号: fpga lab
交个朋友