Я пытаюсь сделать процессор конвейера с помощью Verilog HDL. Я понял, что в моем коде есть какие-то условия гонки. Так что я собираюсь написать код SUDO и хотел бы спросить вас о том, есть ли состояние гонки внутри и как избежать этого:Verilog: Является ли следующий код, чтобы сделать условие гонки?
module A(input wire reset, input wire clock, output reg a_reg_o);
always @(posedge clock)
begin
if(reset == 1'h1)
begin
a_reg_o = 1'h0;
end
else
begin
a_reg_o = 1'h1;
end
end
endmodule
module B(input wire reset, input wire clock, input a_i);
reg b;
always @(posedge clock)
begin
if(reset == 1'h1)
begin
b = 1'h0;
end
else
begin
if(a_i == 1'h1)
begin
b = 1'h1;
end
else
begin
b = 1'h0;
end
end
end
endmodule
module Main(input wire reset, input wire clock);
wire a_o;
A a(reset, clock, a_o);
B b(reset, clock, a_o)
endmodule
Итак, представьте, я вызвать сигнал сброса. После первого положительного края часов регистр a_reg_o будет равен 0, а регистр b из модуля B также будет равен 0 (пока еще нет условий гонки). Теперь я отпускаю кнопку сброса и позволяю ей быть отрицательной. На следующем положительном фронте часов регистр a_reg_o будет равен 1, но как насчет регистра b из модуля B? Это будет: 1. Zero, потому что он еще не видел изменений a_i. 2. Это зависит от полной задержки модулей (A и B) (т. Е. Состояния гонки).
спасибо.
Большое спасибо за ваш ответ. Есть еще два вопроса: 1. Я должен использовать NBA только для написания блоков? 2. Является ли условие гонки только проблемой моделирования или это также проблема физической реализации (постсинтеза)? Я имею в виду, возможно ли иметь другое поведение из-за задержки разных путей после синтеза? –
Вы должны использовать NBA в соответствии с приведенным мной правилом, иначе используйте обычное назначение. В RTL переводит на использование NBA для вывода последовательной логики. К сожалению, у вас может быть гонка в RTL, которая не существует в физической реализации и гонки в физической реализации, которая не существует в RTL. –