2016-09-25 9 views
1

Я пытаюсь сделать процессор конвейера с помощью 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

Вот почему в Verilog есть неблокирующие (NBA) задания. Правило кодирования выполняется всякий раз, когда имеется несколько процессов (в данном случае несколько блоков always), получающих один и тот же сигнал (a_o), синхронизированные с тем же событием (@posdege clock), где один процесс записывает и другой процесс считывает, вам нужно использовать и назначение NBA <= для записи в сигнал.

+0

Большое спасибо за ваш ответ. Есть еще два вопроса: 1. Я должен использовать NBA только для написания блоков? 2. Является ли условие гонки только проблемой моделирования или это также проблема физической реализации (постсинтеза)? Я имею в виду, возможно ли иметь другое поведение из-за задержки разных путей после синтеза? –

+0

Вы должны использовать NBA в соответствии с приведенным мной правилом, иначе используйте обычное назначение. В RTL переводит на использование NBA для вывода последовательной логики. К сожалению, у вас может быть гонка в RTL, которая не существует в физической реализации и гонки в физической реализации, которая не существует в RTL. –

1

Да, может быть состояние гонки, потому что вы не узнаете, что сеть a_o сначала управляется модулем A, а затем захватывается модулем B или наоборот.

Таким образом, для этого необходимо использовать назначение без блокировки, так как это гарантирует, что независимо от того, какой модуль будет выполняться, модуль B всегда будет иметь прежнее значение net a_o.

Дополнительную информацию об этом неблокирующем назначении можно найти по следующей ссылке. http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf

 Смежные вопросы

  • Нет связанных вопросов^_^