assign
1. assign 目标变量名 = 驱动表达式
这是一种数据流描述方式,当等号右侧的驱动表达式中的任一信号变量发生变化时,此表达式即被计算一遍,并将获得的数据赋值给目标变量。
属于并行赋值语句。
assign和always中的 “=” 从综合角度的结果通常是相同的,assign不能使用块语句,故只允许引导一条含 “=” 的赋值语句。
assign赋值语句中,目标信号类型必须是网线型wire,端口信号恰好默认为wire类型。
2. assign #6 R1 = A & B
其中 #6 表示延时6个时间单位,时间单位在用 `timescale 10ns/100ps 表示。
阻塞式赋值 =
一旦执行完当前的赋值语句,赋值目标变量即刻获得来自等号右侧表达式的计算值。
如果在一个语句块中有多条阻塞式赋值语句,而当执行到其中某条赋值语句时,其他语句则被禁止执行。属于顺序执行语句。
非阻塞式赋值 <=
必须在块语句执行结束时才整体完成赋值操作。
用testbench仿真一下就能发现明显区别
在电路结构上
always @(posedge clk)
begin
b <= a;
z <= b;
end
always @(posedge clk)
begin
b = a;
z = b;
end
以上 b 为寄存器变量,但是不一定添加了寄存器变量,就一定会添加寄存器。
always过程语句中,被赋值的变量必须是reg型。
对于阻塞赋值,b为寄存器变量,可没有输出为b的寄存器。