как обнулить регистр в системе Verilog

Как мне обнулить регистр в SystemVerilog, если я не знаю его размер? Например, если у меня есть:

reg [DATA_WIDTH-1:0] data_stack;

с некоторым параметром DATA_WIDTH, заданным модулю. Можно ли присвоить регистру data_stack ноль?

Обратите внимание, что достаточно инициализировать аналогичный reg нулем, так как тогда я могу просто выполнить побитовое и между двумя и обнулить data_stack.


person user44874    schedule 14.03.2013    source источник


Ответы (3)


Если я понимаю ваш вопрос, вы хотите знать, как сгенерировать нулевое значение с той же шириной, что и data_stack?

В этом случае используйте оператор репликации:

data_stack = {DATA_WIDTH{1'b0}};

Это генерирует DATA_WIDTH нулей.

person Tim    schedule 14.03.2013

IEEE Std 1800-2009 - золотой справочник. Следующее устанавливает все биты в 0:

data_stack = '0;

Обратитесь к разделу «Целочисленные литеральные константы».

Одноразрядное значение без размера можно указать, поставив перед однобитовым значением апостроф ('), но без базового спецификатора. Все биты безразмерного значения должны быть установлены на значение указанного бита. В самоопределяемом контексте однобитовое значение без размера должно иметь ширину 1 бит, и значение должно рассматриваться как беззнаковое.

person toolic    schedule 14.03.2013

Я думаю, что ваши поиски дадут лучшие результаты, если вы будете искать инициализирующие регистры, а не обнулять.

Если это переменная testbench, то просто:

initial begin
  data_stack = {DATA_WIDTH{1'b0}};
end

Если он будет использоваться в триггере, вам необходимо его сбросить:

always @(posedge clk or negedge reset_n) begin
  if (~reset_n) begin
    data_stack <= {DATA_WIDTH{1'b0}};
  end
  else begin
    //<=nextvalue;
  end
end
person Morgan    schedule 14.03.2013