有些朋友可能还是对什么时候使用阻塞赋值,什么时候 使用非阻塞赋值有些疑惑,在这里给大家总结如下。
在描述
组合逻辑电路
的时候,使用
阻塞赋值
,比如
assign 赋值语句和不带时钟的 always
赋值语句,这 种电路结构只与输入电平的变化有关系,代码如下:
示例
1
:
assign
赋值语句
assign data = (data_en == 1'b1) ? 8'd255 : 8'd0;
示例
2
:不带时钟的
always
语句
always @(*) begin
if (en) begin
a = a0;
b = b0;
end
else begin
a = a1;
b = b1;
end
end
在描述
时序逻辑
的时候,使用
非阻塞赋值
,综合成时序逻辑的电路结构,比如带时钟的
always
语句; 这种电路结构往往与触发沿有关系,只有在触发沿时才可能发生赋值的变化,代码如下:
示例
3
:
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n) begin
a <= 1'b0;
b <= 1'b0;
end
else begin
a <= c;
b <= d;
end
end