原则5:不要在同一个always块中同时使用阻塞和非阻塞赋值。
Verilog语法并没有禁止将阻塞和非阻塞赋值自由地组合在一个always块里。虽然Verilog语法是允许这种写法,但不建议在可综合模块的编写中采用这种风格。
下面这种情况,严禁使用!
module ba_nba2(q, a, b, clk, rst_n);
output q;
input a, b, rst_n;
input clk;
reg q;
always@(posedge clk or negedge rst_n) begin:ff
reg tmp;
if(!rst_n)
q <= 1'b0;
else begin
tmp = a & b;
q <= tmp;
end
end
endmodule
其,可以得到正确的仿真和综合结果,因为阻塞赋值和非阻塞赋值操作的不是同一个变量。虽然这种方法是可行的,但不建议使用。
module ba_nba6(q, a, b, clk, rst_n);
output q;
input a, b, rst_n;
input clk;
reg q, tmp;
always@(posedge clk or negedge rst_n)
if(!rst_n)
q = 1'b0; // 阻塞赋值
else begin
tmp = a & b;
q <= tmp; // 非阻塞赋值
end
endmodule
其,仿真时结果通常是正确的,但是综合时会出错,因为对同一变量既进行阻塞赋值,又进行了非阻塞赋值。
因此,必须将其改写为可综合模型。