0 简介
赋值分为“连续赋值语句”、“过程赋值语句”和“过程连续赋值语句”。
1 连续赋值语句
语法上,必须有assign关键字标识;
用于对线网进行赋值,等价于门级描述;
不能出现在过程块(initial / always)中;
产生作用后,赋值表达式中的信号任何变化都会立即反映到左值线网型数据中;
2 过程赋值语句
语法上,无assign关键字标识;
用于对变量(寄存器、整数、实数或时间)等赋值;
只能出现在过程块中;
只有赋值语句被执行才赋值,即必须满足过程块中敏感信号表还有过程块中的各种条件语句才会执行,且执行完之后,即使右值(可能是表达式)发生变化,也不会影响到左值。
连续赋值与过程赋值区别如下
| 过程赋值 | 连续赋值 |
Assign | 无assign | 有assign |
符号 | 使用“=”或者“<=” | 只使用“=” |
位置 | 在always语句或initial语句 | 不可出现在always或initial语句 |
执行条件 | 与周围其它条件有关 | 右值一旦发生变化即刻反映 |
用途 | 驱动寄存器 | 驱动网线 |
3 过程连续赋值语句
为了在过程块中实现连续赋值的特性(需求何在?见例一),定义了过程连续赋值语句,使用的方法有两种:assign-deassign 和 force-release。前者只能用于对寄存器型变量的连续赋值,而不能用于对线网数据连续赋值,后者则是两者都可以进行连续赋值。
例一
module DEF(D,Clr,Clk,Q)
input D,Clr,Clk;
output Q;
reg Q;
always@(negedge Clk)
Q = D;
always@(Clr)
begin
if(!Clr)
assign Q = 0;
else
deassign Q;
end
endmodule
以上的程序段,第一个always会将Q的值赋为D,第二个always语句在Clr的值发生变化时执行,若Clr是由高电平变为低电平,则assign 有效,并一直保持这个赋值(直到遇到deassign),这时尽管第一个always也在执行(Clk的下降沿是不会起作用的),Q的值会一直保持“assign Q = 0;”,直到Clr来一个高电平为止(deassign Q语句执行)。
4 我的理解
作为码农,在有了上述非常官方的解释阐述后,应该总结出对于在日常搬砖过程中的起到的作用。
1)如果你需要对网线型数据赋值时,那么你只能在结构体外进行连续型赋值,此时你也只能使用“=”进行赋值。
2)如果你需要对变量赋值,那么你只能在结构体内进行过程赋值,此时你可以使用“=”或者“<=”,根据你的需求是阻塞式还是非阻塞式。
3)如果你一定要将线网型数据在过程块内使用那么你就在使用过程连续赋值语句(目前为止只有在写testbench时使用过),那么你只能使用过程连续赋值语句,但是仍然只能使用“=”进行赋值。
同时,你需要理解赋值完成之后,它是如何产生变化的,是否满足需求。
参考文献
http://www.cnblogs.com/nanoty/archive/2012/10/21/2733017.html
http://shihchieh.lofter.com/post/1785ab_447edf