2015-10-16 4 views
0

Получение ошибки 9: error: genvar is missing for generate "loop" variable 'r'. 1 error(s) during elaboration.genvar отсутствует для генерации «петли» переменной: Verilog

Весь код:

module divider (dividend, divisor, quotient, remainder) ; 
    input [7:0] dividend ; // eight input lines modeled as a bus 
    input [7:0] divisor ; // select lines bundled as a bus 
    output reg [7:0] quotient ; 
    output reg [7:0] remainder ; 
    reg [7:0] r; 
    reg [7:0] q; 
    assign q = 0; 
    for(r = dividend; r >= divisor; r = r - divisor) 
     assign q = q + 1; 
    assign remainder = r; 
    assign quotient = q; 
endmodule 

module main; 
    reg [7:0] dd; 
    assign dd = 12; 
    reg [7:0] dr; 
    assign dr = 5; 
    reg [7:0] q; 
    reg [7:0] r; 
    wire a = divider(dd, dr, q, r); 
    initial begin 
    $display("quotient %d", q); 
    $display("remainder %d",r); 
    end 
endmodule 

Я пытаюсь написать модуль для вычисления частного и остатка путем многократного вычитания с использованием поведенческого моделирование в verilog. Это моя первая программа verilog, и у меня возникли проблемы с исправлением этих ошибок, пожалуйста, укажите, есть ли в моем коде какие-либо ошибки.

ответ

2

Проблема с циклом for. Вы можете либо использовать генерировать блок или всегда блок для его использования. Один из способов сделать это следующим образом:

module divider (dividend, divisor,quotient, remainder) ; 
input [7:0] dividend ; // eight input lines modeled as a bus 
input [7:0] divisor ; // select lines bundled as a bus 

output reg [7:0] quotient ; 
output reg[7:0] remainder ; 

always @(*) 
    begin 
     quotient=0; 
     for(remainder = dividend; remainder >= divisor; remainder = remainder - divisor) 
      quotient = quotient + 1;    
    end 

endmodule 



module main; 

reg[7:0] dd; 
reg[7:0] dr; 

wire [7:0] q; 
wire [7:0] r; 

divider d0(.dividend(dd), .divisor(dr), .quotient(q), .remainder(r)) ; 

initial begin 
    dd=12; 
    dr=5; 
end 

initial begin 
#20 $display("quotient %d", q); 
#25 $display("remainder %d",r); 
end 

endmodule 

Мало что отметить:

  1. Если вы тусклый назначить переменную с помощью присвойте заявление, объявить эту переменную в качестве провода.
  2. В тестовом стенде вам необходимо определить входы как «рег» и вывести как «провод».
  3. Вы не можете использовать назначить в цикле.
+0

Код, который вы предоставили для логики делителя, не будет работать так, как вы планируете использовать NBA в цикле. Это означает, что он не будет обновлять 'quotient' в каждом цикле, но вместо этого приводит только к тому, что' quotient' устанавливается в 0 или увеличивается с его предыдущего значения, которое в вашем случае было из предыдущей попытки разделить. Кроме того, вы используете назначение блокировки для 'остатка' в блоке' always' с тактовой частотой, что приводит к симуляциям, которые неправильно имитируют реальное оборудование. – Unn

+0

@Unn Я нашел свою ошибку :). Будет ли проблема на аппаратном уровне, если я буду использовать все блокирующие назначения всегда в блоке? Потому что он отлично работает на уровне моделирования, если я конвертирую NBA в блокировку назначений. – ssgr

+2

Хотя эта настройка может работать нормально с назначением блокировки, как только вы интегрируете ее в проект, который использует 'quotient' или' остаток 'в каком-либо другом модуле или блоке, симуляция будет иметь состояние гонки. Чтобы точно имитировать аппаратное обеспечение, вам нужно использовать NBA в тактовых блоках (и BA в комбинационных блоках, таких как 'always @ (*)'). Инструменты синтеза обычно могут понять это, если вы используете БА; но вы никогда не должны использовать BA в тактовых блоках. – Unn

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