目录
参考《Verilog 编程艺术》魏家明著
Verilog 赋值操作
1.连续赋值(Continuous assignment),用于对线网Nets的赋值
2.过程赋值(Procedural assignment),用于对变量variables的赋值
3.过程连续赋值:assign/deassign 和 fork/realease
赋值由两部分构成:左手端LHS和右手端RHS,它们由 = 或 <= 分开。
连续赋值
当RHS发生变化时,连续赋值就会发生。连续赋值可以模拟组合逻辑,不需要使用逻辑门,直接使用逻辑表达式驱动线网。
例子:
assign {carry_out, sum_out} = ina + inb + carry_in;
assign mynet = {enable ? data : 1'b0};
在声明线网时也可以赋值,但是这个线网就不能被多驱动了
wire mynet = {enable ? data : 1'b0};
我们可以针对下面这些类型线网的连续赋值指定驱动强度:wire,wand,wor,tri,triand,trior,trireg,tri0和tri1
使用驱动强度的规则:
1.连续赋值的驱动强度既可以在线网声明时指定,也可以在单独的赋值(使用assign)中指定。当有连续赋值驱动线网时,就按照驱动强度的值驱动线网。
2.驱动强度的值应该包含两个:一个是线网等于1的驱动强度;另一个是线网等于0的驱动强度。下面分别是线网等于1和0的驱动强度:
supply1;strong1;pull1;weak1;highz1;
supply0;strong0;pull0;weak0;highz0;
3.这两个驱动强度的顺序是任意的
4.这两种组合(highz1,highz0)和(highz0,highz1)是非法的,不能使用。
5.如果没有指定驱动强度,那么就默认使用(strong1,strong0)
例子:
assign (strong1, pull0) mynet1 = enable;
assign (strong0, highz1) mynet2 = enable;
过程赋值
过程赋值就是把值放到变量中。过程赋值没有持续时间,相反,变量将保持赋值的值,直到发生下一次对变量的赋值。
过程赋值发生在过程快(always,initial,task,和function)中,可以把它认为是触发赋值(Triggered assignment)。当执行到达过程快的赋值时,触发就发生。过程赋值受执行语句控制,事件控制,延迟控制,if语句,case语句和循环语句都能用来控制是否执行赋值操作。
变量声明赋值(Variable declaration assignment)是一种特殊的过程赋值,允许在声明变量时把初始值赋给变量。
1/对变量声明赋值所赋的值只能输常数。
2/对数组不能使用变量声明赋值。
3/只允许在模块级使用变量声明赋值。
4/如果对同一个变量既有变量声明赋值,又有在initial中赋了其他值,那么它们的执行顺序是不定的。
例子:变量声明赋值
reg [3:0] a = 4'h4;
// 等价于
reg [3:0] a;
initial a = 4'h4;
标签:变量,强度,编程,线网,Verilog,驱动,assign,赋值
From: https://blog.csdn.net/qq_53922164/article/details/137170937