Есть ли в Verilog / SV оператор ifx-elsex, например casex?

Скажем, у меня есть сценарий, в котором мне нужно сравнить только несколько битов регистра, а другие биты меня не интересуют. eq, мне нужно проверить первый и последний биты 3-битного регистра (A [2: 0]), и меня не волнует средний бит, скажем, вектор сравнения - 3'b1X0 (параметр).

  1. Самый простой способ сделать это - выбрать все биты, которые меня волнуют, И они, и я сгенерировал управляющий сигнал: if ((A[2]==1) & ((A[0]==0)) Здесь условие внутри оператора if - это мой управляющий сигнал.

  2. Другой способ - использовать оператор casex: casex(A) begin 3'b1?0: ... , ... endcase.

  3. Есть ли что-нибудь вроде оператора ifx-elsex или чего-то еще, что можно использовать для выполнения такой операции без использования 1-го и 2-го метода?

Спасибо!


person Ujjwal    schedule 18.06.2013    source источник


Ответы (3)


if (A[2:0] inside {3'b1?0} )

Ключевое слово SystemVerilog inside. Он поддерживается, по крайней мере, с SystemVerilog 3.1 от Accellera (до того, как SystemVerilog стал частью IEEE). IEEE Std 1800-2012 11.4.13 содержит примеры использования. inside можно синтезировать.

Также имеется if ( A[2:0] ==? 3'b1?0 ) (IEEE Std 1800-2012 11.4.6) . Единственная ссылка, которая у меня есть (книга, опубликованная в 2004 г.), говорит, что она еще не поддерживается для синтеза. Вы можете попробовать.

person Greg    schedule 18.06.2013
comment
Спасибо! Согласно справочнику, который я использую, if ( A[2:0] ==? 3'b1?0 ) можно синтезировать, но if ( A[2:0] ==? B ), где B - какой-то регистр, - нет. Поэтому единственное, о чем следует позаботиться, - это то, что при использовании ==? RHS должна быть константой для синтеза. - person Ujjwal; 19.06.2013

(A[2]==1) - это логическое выражение, & - это побитовый оператор, хотя в любом случае лучше использовать логический оператор && и семантику. Это немного отличается от большинства других языков, где && - это оператор короткого замыкания.

По логике вещей вы хотите if ((A[2]==1) && ((A[0]==0)), но это можно свести к побитовому выражению:

if ( ~A[0] & A[2] ) 

NB: Старайтесь избегать использования casex, неизвестные части будут соответствовать x при моделировании. Попробуйте вместо этого использовать casez,? все еще можно использовать для соответствия пофиг.

Обновить сравнение внутри с casez

Операторы case - это чистая структура управления, используемая в большинстве языков, чтобы избежать больших цепочек if elsif else. внутренняя операция сопоставит x с безразличным символом '?' ценности. это делает его использование похожим на casex, который считается плохой практикой, поскольку он может скрыть ошибки моделирования.

casez(sel)
  4'b1??? a= 3'd4;
  4'b01?? a= 3'd3;
  4'b001? a= 3'd2;
  4'b0001 a= 3'd1;
  4'b0000 a= 3'd0;  
endcase

vs

if (sel inside {4'b1???})
  a= 3'd4;
else if (sel inside {4'b01??})
  a= 3'd3;
else if (sel inside {4'b001?})
  a= 3'd2;
...

Вышеупомянутое фактически совпадает с casex (но более подробным). Я считаю, что вместо casex вы также можете использовать:

case(sel) inside
  4'b1??? a= 3'd4;
  4'b01?? a= 3'd3;
  4'b001? a= 3'd2;
  4'b0001 a= 3'd1;
  4'b0000 a= 3'd0;  
endcase

но тогда я бы никогда не использовал casex.

person Morgan    schedule 18.06.2013
comment
В системе Verilog я думаю, что использование inside в case было бы лучшим способом выполнять некоторые безразличные операции. Я не удивлюсь, если никогда не придется использовать операторы casex и casez, что вы думаете? - person Ujjwal; 19.06.2013
comment
Буквально на днях я использовал некоторые функции SystemVerilog для очистки некоторого кода, отличная симуляция, синтез с некоторыми предупреждениями. Обновлен код для удаления предупреждений. Чистое моделирование отличных прогонов посредством синтеза. Сгенерированный список соединений недействителен. Если вы решите использовать новую конструкцию SystemVerilog, убедитесь, что она может очистить весь ваш рабочий процесс, а не только моделирование - person Morgan; 20.06.2013
comment
Хотя я часто публикую имитацию списка соединений Place and Route, он автоматически обрабатывает синтезированный список соединений. Сделаю обязательным всегда проводить моделирование в случае использования System Verilog, особенно при использовании новых конструкций. Спасибо! - person Ujjwal; 20.06.2013
comment
Незначительный момент по операторам короткого замыкания - && и || были короткими замыканиями, по крайней мере, с '95 LRM; Я думаю, что это могло быть не указано в предыдущих документах OVI / Cadence. - person EML; 20.06.2013
comment
@EML не осознал, что они на самом деле были коротким замыканием, но на большинстве языков вы можете выбрать короткое замыкание или нет, здесь мы выбираем побитовое или логическое. Короткое замыкание не вызывает побочных эффектов, если оно не используется с i++ или аналогичным во вторичном или последующем логическом выражении. И это было нормально, потому что до сих пор у нас их не было ... - person Morgan; 20.06.2013
comment
@Ujjwal Я обновил ответ с моими взглядами на внутреннюю часть vs casex, надеюсь, это поможет. - person Morgan; 20.06.2013
comment
@Morgan Еще одно отличие, которое вы можете захотеть отредактировать в своем ответе, - это приоритетный характер кодирования операторов if-else по сравнению с оператором case. В вашем примере if-else sel inside {4'b00??} идет после sel inside {4'b0???}, поэтому он никогда не будет выполнен. - person Ujjwal; 20.06.2013
comment
@Ujjwal хорошо заметен, пропустил 1 из кодировщика. Обновленный. - person Morgan; 20.06.2013

Я не знаю ни одного оператора, который позволяет использовать '?' или 'x' внутри сравнения на равенство, чтобы их игнорировать.

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

Если вас интересует только A == 3'b1?0, то это можно записать так:

if((A & 3'b101) == 3'b100)

person Tim    schedule 18.06.2013
comment
Да, это тоже хороший альтернативный метод. Я думаю, что при использовании Verilog это лучший способ использовать оператор if для битовых операций безразличия. Спасибо! - person Ujjwal; 19.06.2013