В чем разница между целочисленными типами переменных и типами reg в Verilog?

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

reg [31:0] sum; 
integer sum;

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

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

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

person RMarms    schedule 19.04.2020    source источник


Ответы (1)


integer sum; // is equivalent to 
reg signed [31:0] sum;

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

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

person dave_59    schedule 19.04.2020