2016-04-20 2 views
1

конфигурация нижеСостояние: Логическое состояние многобитного упакованного массиву

reg [3:0] myreg; 

[email protected](...) begin 
... 
    if(myreg) begin <events> end ... 
end 

Как ссылка на «myreg» в состоянии без ссылки конкретного бита и логические операций между битами в упакованном массиве будет обрабатываться?

Редактировать: Не могли бы вы указать, где описано это поведение? Поскольку эта семантическая структура разрешена, я думаю, там должна быть какая-то документация об этом ... Спасибо!

Редактировать 1: Спасибо за все ваши ответы. Давайте переориентировать на следующих двух точках:

  • Почему вы считаете, что логическое значение (myreg) является сокращение OR (не так и, например) - это есть стандартная директива? Давайте отменим здравый смысл и наше чувство «правильного» и «неправильного» - это не те вопросы, на которые мы можем основывать наши выводы в математике/кибернетике.
  • это правда, что «это может вести себя по-другому с другим симулятором» - или в реальной жизни? Это меня поражает, потому что (a) я не могу найти документ, в котором говорится, что он ДОЛЖЕН быть сокращением OR, и (b), что Quartus (который я использую) не дает никаких предупреждений или ошибок для синтаксиса выше.
+1

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

+0

Относительно «Давайте отключим здравый смысл и наше чувство« правильно »и« неправильно ».« Id дал пример импликации, доказывающий, что имитатор оценивает его. Никакие чувства кишки здесь только доказательство: http://www.edaplayground.com/x/3P76 – Morgan

+0

Спасибо. Ряд неявных примеров уже был приведен ниже, симуляция хороша, но кремний - это все. Я делаю кремниевые продукты, а ссылки на моделирование не убеждают меня, потому что я буду в конечном итоге ответственен за результаты в кремнии. – Anonymous

ответ

0

Из этого EDA Playground example VCS 2014.2 интерпретирует:

if (myreg) begin 
    ... 

как уменьшение или битовой myreg т.е.:

if (|myreg == 1'b1) begin 
    ... 

Как Грег нашел соответствующий (SystemVerilog IEEE 1800-2012 стандарт) раздел LRM - Раздел 12.4

она принимает значение ложь (то есть, имеет нулевое значение или значение х или г),

Код поставляется if (myreg) допустима, но учитывая иксы или Заболоцкого будет оценивать ложь, а не распространяющиеся иксы вы можете найти разница между RTL и имитацией уровня ворот, если вы используете неинициализированные регистры, начальные x будут оцениваться как ложные, а не потенциально равны 1 и оценивать значение true.

+0

Да - это правильно. Он делает сокращение ИЛИ. –

+0

Morgan, мой вопрос, задающий вопрос, был ли Quartus (в моем случае) не дает никаких предупреждений или ошибок, тогда это должно быть допустимой конструкцией и должно регулироваться некоторым стандартным/директивой. Если вы думаете, что «это может вести себя по-другому с другим симулятором», то то, что я испытываю, кажется, является ошибкой Quartus, и обычно оно должно бросать хотя бы предупреждение. – Anonymous

+1

Я действительно сказал, что не мог найти его, чтобы его там не было. Просто потому, что что-то является допустимой конструкцией в Verilog, не означает, что вы должны использовать его в синтезируемом RTL. Особенно сейчас, когда вы видели, как он может обрабатывать x во время симуляции. т.е. он решает x на false вместо того, чтобы распространять его, это само по себе указывает на то, что этот тип конструкции непригоден для синтеза. – Morgan

0

Да, @Morgan правилен Xillinx ISE и Questasim делает то же самое, когда я синтезирую следующий код.

module aa(input clk, 
      input rst_n, 
      input [4:0] my_reg, 
      output reg chk 
     ); 

always @ (posedge clk or negedge rst_n) 
begin 
    if (!rst_n) begin 
    chk <= 1'bz; 
    end else begin 
    if (my_reg) begin 
     chk <= 1'b1; 
    end 
    else begin 
     chk <= 1'b0; 
    end 
    end 
end 

endmodule 

Вы можете увидеть здесь схематический вид, enter image description here

0

Verilog должен вести себя так:

myreg | result | comment 
------|--------|-------- 
0000 | 1'b0 | FALSE - all bit bits are zero 
0010 | 1'b1 | TRUE - at least one bit is one 
001X | 1'b1 | TRUE - at least one bit is one 
000X | 1'bX | FALSE - we don't know whether all bits are zero or not 
         and if interprets 1'bX as FALSE 
+0

Мэтью, откуда вы взяли эту информацию? – Anonymous

+0

@ Анонимный от слайда Doulos. –

+0

Мэтью, пожалуйста, не обижайся, но я могу нарисовать несколько разных слайдов. Есть ли какой-либо слайд/документ об этом, выпущенный уполномоченной организацией или комитетом, например. IEEE? – Anonymous

0

if(myreg) так же, как if(myreg != 0) согласно IEEE Std 1800-2012 § 12.4 Условный если-другое заявление

условный оператор (или если-то еще заявление) используется, чтобы сделать решение о том, будет ли выполнено заявление. Формально синтаксис приведен в синтаксисе 12-2.

conditional_statement ::= // from A.6.6 
[ unique_priority ] if ( cond_predicate ) statement_or_null 
{ else if ( cond_predicate ) statement_or_null } 
[ else statement_or_null ] 
unique_priority ::= unique | unique0 | priority 
cond_predicate ::= expression_or_cond_pattern { &&& expression_or_cond_pattern } 
expression_or_cond_pattern ::= expression | cond_pattern 
cond_pattern ::= expression matches pattern

Синтаксис 12-2-Синтаксис если-то еще заявление (отрывок из приложения А)

Если выражение cond_predicate оценивается как истина (то есть, имеет известное значение отличное от нуля), то первое утверждение должны быть выполнены. Если он оценивает значение false (то есть имеет нулевое значение или значение равно x или z), первый оператор не должен выполняться. Если есть инструкция else и выражение cond_predicate является ложным, выполняется инструкция else. Поскольку числовое значение выражения , если проверено на то, что оно равно нулю, возможны некоторые ярлыки. Например, следующие два оператора выразить ту же логику:

if(expression) 
if(expression != 0)

Обратите внимание на РДДЕ проверяет, если выражение является ненулевым значением. Он не ограничивает ширину или даже рассматривает, является ли он подписанным типом. Отрицательные числа будут истинными, только ноль будет ложным.

Синтезаторы могут выполнять бит-мутное сжатие, которое эквивалентно логике по сравнению с нолем.

+0

Greg, вопрос в том, как синтезатор использует многоразрядный массив в случае, если оператор IF подает несколько бит. Если вы посмотрите на ответ Мэтью, он говорит, что значение «bX также дает FALSE. – Anonymous

+0

@Anonymous, LRM указывает, что bX FALSE, в цитате «он вычисляет значение false (то есть имеет нулевое значение или значение x или z)». Теперь в синтезе нет реального X. Синтез X означает конфликтующие драйверы в одной сети; вызывая короткое замыкание между источником питания и массой. 'myreg! = 0' и' | myreg' (сокращение OR) математически эквивалентны. – Greg

Смежные вопросы