当 always语句中对变量反复赋值的时候,会发生什么后果?
实验测试一下:
RTL代码
module always_test(
input sys_rst_n ,
input sys_clk ,
output reg [2:0] led
);
//led_0 连续写两个反转
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
led[0] <= 1'b0;
else begin
led[0] <= !led[0];
led[0] <= !led[0];
end
end
//led_1 连续赋两次不同的值
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
led[1] <= 1'b0;
else begin
led[1] <= 1'b1;
led[1] <= 1'b0;
end
end
//led_2 连续赋三次不同的值
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
led[2] <= 1'b0;
else begin
led[2] <= 1'b1;
led[2] <= 1'b0;
led[2] <= 1'bz;
end
end
endmodule
tb代码:
`timescale 1ns/1ns
module tb_always_test();
parameter CLK_PERIOD = 20;
reg sys_rst_n ;
reg sys_clk ;
wire [2:0] led ;
initial begin
sys_rst_n <= 1'b0;
sys_clk <= 1'b0;
#10
sys_rst_n <= 1'b1;
end
always #(CLK_PERIOD/2)
sys_clk <= !sys_clk;
always_test u_always_test(
.sys_rst_n (sys_rst_n),
.sys_clk (sys_clk ),
.led (led )
);
endmodule
测试结果波形图如下:
分析
1.LED[0],并没有翻转两次而是只反转了一次
2.LED[1],取了最后赋的值0
3.LED[2],取了最后赋的值z
结论一个always块内使用非阻塞赋值,对同一变量多次赋值,从时间上来看是并行的,但是从结果上来看,会采用最后一次赋值,在编写代码的时候应当避免这种无效多次赋值,这样会导致逻辑混乱 。