Я думаю, что ваша проблема заключается в следующих утверждениях:
// When a new bit stream arrives
if(index == 0) begin
r_cnt_tmp <= {OUT_WIDTH{1'b0}}; // Reset the output data
o_done <= 1'b0; // Data is now invalid because it is a new bit stream
// It only happens after a reset or a valid data output
end
// If bit is set
if(i_data == 1'b1) begin
r_cnt_tmp <= r_cnt_tmp + 1; // Count up
end
Возможно, у вас есть index == 0
и i_data == 1
. Теперь запланировано, что значение r_cnt_tmp станет равным 0
после выполнения блока, поскольку там используется неблокирующее назначение.
Следующий блок попытается увеличить значение, но он будет использовать старое значение счетчика и успешно переопределит ранее запланированное значение сброса. Скорее всего, это не будет «1» или «0».
Один из способов переписать это следующий. В этом примере начальное значение счетчика станет '1', если i_data равен '1', а индекс равен 0.
// When a new bit stream arrives
if(index == 0) begin
r_cnt_tmp <= i_data; // Reset the output data to '0' or '1' depending on i_data
o_done <= 1'b0; // Data is now invalid because it is a new bit stream
// It only happens after a reset or a valid data output
end
else if(i_data == 1'b1) begin // you definitely need this 'else'
r_cnt_tmp <= r_cnt_tmp + 1; // Count up
end
Извините, я не проверял его, в частности, когда i_data равен 'x' ,
Возможно, для начального условия могут потребоваться другие требования. Таким образом, вы можете написать это по-своему.