В чем разница между типами переменных integer и reg в Verilog? - PullRequest
1 голос
/ 20 апреля 2020

После использования Verilog в течение нескольких месяцев мне любопытно, какая разница между следующим:

reg [31:0] sum; 
integer sum;

Поскольку целое число - это просто 32-разрядное значение почему вы не можете просто использовать reg для его представления? Почему один из них может быть более эффективным, чем другой, с точки зрения использования памяти или времени доступа ? Пожалуйста, дайте мне знать, что вы думаете, или, если вам нужно, чтобы я расширил свой вопрос.

Пример с использованием целого числа:

integer t = 0;

always @(posedge clk) begin  
    if (t < 9999) t = t + 1; 
    else t = 0;
end

Пример с использованием Reg:

reg[13:0] t = 14'b0; //Represent up to 16383

always @(posedge clk) begin  
    if (t < 9999) t = t + 14'b00000000000001;
    else t = 14'b0;
end

1 Ответ

3 голосов
/ 20 апреля 2020
integer sum; // is equivalent to 
reg signed [31:0] sum;

На заре Верилога в 1980-х годах integer был подписанным, неотрицательным интегральным типом с 4 состояниями. Его физический размер был выведен из инструмента хоста моделирования. Инструменты синтеза должны были вывести его размер из контекста, который использовался (то есть for l oop, который в конечном итоге был бы развернут в набор постоянных значений).

Но более поздние версии Verilog, а теперь и SystemVerilog просто используют integer в качестве типа со знаком из 4 состояний с предопределенной 32-разрядной шириной. Поймите, что 32-битный тип с 4 состояниями на самом деле занимает до 64 бит. держать его значение.

...