2013-03-14 3 views
-1

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

reg [DATA_WIDTH-1:0] data_stack; 

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

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

Кроме того, любые рекомендуемые сайты, где я могу изучить эти материалы? Googling дал мне только несколько анемичных сайтов.

ответ

4

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

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

data_stack = {DATA_WIDTH{1'b0}}; 

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

5

IEEE Std 1800-2009 - это золотая ссылка. Нижеследующее устанавливает все биты в 0:

data_stack = '0; 

См. Раздел «Целочисленные литеральные константы».

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

+0

Можно ли включать в себя фрагмент из чего этот оператор точно? Я никогда не видел этого раньше, и мне любопытно, что это значит, но AFAIK, который не является общедоступным документом. – Tim

+0

1800-2012 Std теперь бесплатно, но я сомневаюсь, что какие-либо инструменты его поддерживают. – toolic

+0

У старых реализаций verilog была проблема, когда это могло работать только до 32 бит. 33-битная рег, назначенная таким образом, имела бы x в MSB. – Morgan

1

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

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

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