【总结:<=是所有数据同时变化,而=是顺序执行。如果是左边数据的赋值都是不关联的,那么就可以用<=,使所有赋值同时有效。如果有a和b都需要赋值,且b的值跟a有关的同时还需要一起变化,那么可以用=】
一般情况下可以用<=,因为如果信号需要寄存打一拍,如果给的激励刚好打在要寄存那一拍的时钟上,可能从仿真波形看不出来打拍
比如要实现以下逻辑:(也就是b_sig_reg_sync_pos比b_sig_s_1晚一拍)
always @(posedge input_b_clk_sig)
begin
if (input_b_rst_ogsr == 1'b1)
begin
b_sig_reg_sync_pos <= 0;
end
else if (input_b_ce_sig == 1'b1)
begin
if(REG2_INPUTB_BYP=="ENABLED")
b_sig_reg_sync_pos <= b_sig_s_1;
else
b_sig_reg_sync_pos <= b_sig_reg_sync_pos_r;
end
end
最开始的输入来自din_0_B (从tb激励里面给)
1.直接用“=”进行赋值,并没有寄存一拍
task generate_signals;
input integer num_sets;
integer i;
begin
for (i = 0; i < num_sets; i = i + 1) begin
@(posedge Clock)
begin
din_0_B = i + 1;
end
#100;
end
end
endtask
2.直接用“<=”进行赋值,有寄存一拍
task generate_signals;
input integer num_sets;
integer i;
begin
for (i = 0; i < num_sets; i = i + 1) begin
@(posedge Clock)
begin
din_0_B <= i + 1;
end
#100;
end
end
endtask
注:(还要一种方式是)
@(posedge Clock)
Begin
#10;
din_0_B = i + 1;
end
#100;
那么数据就会在上升沿之后错过一点点有效,最后的结果也会是在下一个上升沿发生变化
3.用时钟下降沿去赋值,会在下一个时钟上升沿来的时候变化,相当于打半拍
task generate_signals;
input integer num_sets;
integer i;
begin
for (i = 0; i < num_sets; i = i + 1) begin
@(negedge Clock)
begin
din_0_B <= i + 1;
end
#100;
end
end
endtask