Если у вас есть 2 защелки, как это:
always @(posedge clk)
a <= b;
always @(posedge clk)
b <= c;
результатом a
после установки будет старое значение b
.Итак, если b
было 1, а c
было 2, то в позиции
a --> 1 (old b)
b --> 2 (old c)
, если вам нужно гарантировать, что a
получит новое значение b
, у вас есть пара вариантов:
1) вычислить b
с помощью комбинационного процесса:
always @(*)
b = c;
2) назначить b при необходимости clk
always @(negedge clk)
b <= c;
3) вы можете убедиться, чточто ваш b
имеет значение, которое вам нужно на конкретном такте, оценивая его на текущем этапе, что-то вроде следующего.
always @(posedge clk) begin
a <= b;
next_b <= c;
end
always @*
b = next_b;
Существуют и другие способы, которые могут ограничивать переменные.Например, если b
- это просто временная переменная, используемая внутри логики флопа, вы можете использовать блокирующие назначения для ее оценки.Но не используйте его где-либо еще:
always @(posedge clk) begin
b = c; // b only used inside this block and uses BA
a <= b;
end
Вы должны подумать, какой метод лучше подходит вам.Вероятно, увеличение i
в случае необходимости может работать.Вы должны понимать, как оценивается «memread».