之前在写自加逻辑时,仿真结果经常会出现高阻态,常常百思不得其解,这次简单分析一下。
always@(negedge clk_ad or negedge rst_n)begin
if(!rst_n)begin
CNT_SIGNAL <= 10'b0;
score_reg_signal <= 0;
end
else if(cs)begin
if(CNT_SIGNAL<SIGNAL)begin
score_reg_signal <= score_reg_signal+score_reg_point;
CNT_SIGNAL <= CNT_SIGNAL + 1'b1;
end
else begin
CNT_SIGNAL <= 0;
score_reg_signal <= 0;
end
end
else begin
end
这样一个简单的自加逻辑,输出的结果是这样的
可以看到,在第一轮自加过程中,输出结果一直是高阻态,分析原因是没有给寄存器赋初值导致的。虽然我们在rst中设置了寄存器结果为零,但实际上并没有给寄存器的输入赋初值,实际上综合出来的电路是这样的。
可以看到,rst只能控制CLRN端,寄存器的输入D由一个选择器控制是清0还是累加。
选择器的控制信号是由比较器产生的
if(CNT_SIGNAL<SIGNAL)
这就意味着第一轮自加时,自加的信号并不知道自己的初始值是多少,所以即使在自加也一直是高阻态。
直到清0,它才有确定的初始输入值0。所以后续也就可以正常输出了。
此外,如果用initial进行初始化
initial begin
score_reg_signal = 0;
score_reg_signal_buff = 0;
end
always@(negedge clk_ad or negedge rst_n)begin
//initialize target_reg and xnor_reg_14bit
if(!rst_n)begin
full <= 1'b0;
CNT_SIGNAL <= 10'b0;
xnor_reg_point <= 0;
score_reg_signal <= 0;
end
else if(cs)begin
if(CNT_SIGNAL<SIGNAL)begin
xnor_reg_point <= data_in ^ target_reg[CNT_SIGNAL];
score_reg_point <= score_wire_point;
score_reg_signal <= score_reg_signal+score_reg_point;
CNT_SIGNAL <= CNT_SIGNAL + 1'b1;
full <= 1'b0;
end
else begin
full <= 1'b1;
CNT_SIGNAL <= 0;
score_reg_signal <= 0;
score_reg_signal_buff <= score_reg_signal;
end
end
else begin
full <= 1'b0;
end
end
输出结果会变成这样
说明只要进入自加的if,就会被判断为没有初值