过程快块中的赋值语句被称为过程赋值语句。过程性赋值是在initial语句或者always语句内的赋值。过程赋值语句有阻塞赋值语句和非阻塞赋值语句两种。
1.阻塞赋值语句
阻塞赋值语句的操作符号为“ = ”,其语法格式如下:
变量 = 表达式;
例如:b = a;
特点:
1.在串行语句块中,各条阻塞赋值语句将按照排列顺序依次执行;在并行语句块中,语句同时执行,没有先后之分
2.执行阻塞赋值语句的顺序是,先计算等号右端表达式的值,然后立刻将计算的值赋给左边的变量,与仿真时间无关
下面是一个阻塞赋值语句的例子,该程序只能综合出一个D触发器。
module dut_blocking(clk,a,c);
input clk,a;
output c;
reg b,c;
always @(posedge clk) begin
b=a;
end
always @(posedge clk) begin
c=b;
end
endmodule
测试代码如下:
module tb_blocking;
reg clk;
reg a;
wire c;
dut_blocking inst1(
.clk (clk),
.a (a),
.c (c)
);
initial begin
$monitor("clk=%b,a=%b,c=%b",clk,a,c);
end
initial begin
clk=1'b0;
forever begin
#10;
clk=~clk;
end
end
initial begin
repeat (20) begin
#0 a=1'b0;
#22 a=1'b1;
#60 a=1'b0;
#80 a=1'b1;
#100;
end
$finish();//finish simulation
end
initial begin
$fsdbDumpfile("blocking_dut");
$fsdbDumpvars;
$vcdpluson;
end
endmodule
编译、仿真之后,用DVE工具打开
仿真波形图如图所示,当上升沿到来的时候,采样到数据a,a立刻赋值给b,b又立刻赋值给c
2非阻塞赋值语句
非阻塞赋值语句的操作符号为“ <= ”,其语法格式如下:
变量 <= 表达式;
例如:b <= a;
特点:
1.在串行语句块中,各条阻塞赋值语句执行没有先后顺序之分,后面语句的执行不会受到前面语句的限制,各条语句并行执行
2.执行非阻塞赋值语句的顺序是,先计算等号右端表达式的值,然后等待延迟时间的结束,再将计算的值赋给左边的变量
下面是一个非阻塞赋值语句的例子
module non_blocking(clk,a,c);
input clk,a;
output c;
reg b,c;
always @(posedge clk) begin
b<=a;
end
always @(posedge clk) begin
c<=b;
end
endmodule
测试代码同上
编译、仿真之后,用DVE工具打开
仿真波形图如图所示,当上升沿到来的时候,采样到数据a,a赋值给b,但是b不是立刻赋值给c,当前时刻c依然保持上一时刻b的值。因为这两条语句没有先后关系,综合后会产生两个D触发器。