Почему переменная провода вызывает неправильную левую часть в непрерывном назначении? - PullRequest
0 голосов
/ 30 мая 2019

Я прочитал все подобные посты, но ни один из них не решает мою проблему, а именно, что строка 41 assign Y[b]=~Y[b]; вызывает ошибку "Недопустимая левая часть в непрерывном назначении".

Я не назначил никаких рег, поэтому я не вижу, в чем проблема. Если я заменю b на фактическое число (скажем, 3), оно будет работать нормально. Но мне нужно b в качестве переменной здесь.

// Hamming code 1-bit error correction
module HCG(I,e,O);
  input [4:1] I;   // input BCD
  input [7:1] e;   // noise simulation
  wire [7:1] X;    // Hamming code
  wire [7:1] Y;     // Hamming code after addition of noise
  wire [3:1] P;     // Parity at start
  wire [3:1] S;    // Parity at end
  wire b;        // the error bit
  output [4:1] O;  // corrected output


  assign X[1]=I[1]^I[2]^I[4];   // Hamming code generator
  assign X[2]=I[1]^I[3]^I[4];
  assign X[3]=I[1];
  assign X[4]=I[2]^I[3]^I[4];
  assign X[5]=I[2];
  assign X[6]=I[3];
  assign X[7]=I[4];

  assign P[1]=X[1]; // Parity at start
  assign P[2]=X[2];
  assign P[3]=X[4];

  assign Y[1]=e[1]^X[1]; // noise added
  assign Y[2]=e[2]^X[2];
  assign Y[3]=e[3]^X[3];
  assign Y[4]=e[4]^X[4];
  assign Y[5]=e[5]^X[5];
  assign Y[6]=e[6]^X[6];
  assign Y[7]=e[7]^X[7];

  assign S[1]=Y[3]^Y[5]^Y[7]; // Parity at end
  assign S[2]=Y[3]^Y[6]^Y[7];
  assign S[3]=Y[5]^Y[6]^Y[7];

  assign b=(S[1]!=P[1])? b:b+1; // if parity of 2^0 not the same, add 1 to b
  assign b=(S[2]!=P[2])? b:b+2; // if parity of 2^1 not the same, add 2 to b
  assign b=(S[3]!=P[3])? b:b+4; // if parity of 2^2 not the same, add 4 to b

  assign Y[b]=~Y[b]; // correct the incorrect bit
  assign O[1]=Y[3]; // assigning outputs
  assign O[2]=Y[5];
  assign O[3]=Y[6];
  assign O[4]=Y[7];

endmodule

Ответы [ 3 ]

1 голос
/ 30 мая 2019

Строки между module и endmodule выполняются одновременно . (Похоже, вы думаете, что они выполняются последовательно.) Поэтому вы ведете все биты Y в этих строках

  assign Y[1]=e[1]^X[1]; // noise added
  assign Y[2]=e[2]^X[2];
  assign Y[3]=e[3]^X[3];
  assign Y[4]=e[4]^X[4];
  assign Y[5]=e[5]^X[5];
  assign Y[6]=e[6]^X[6];
  assign Y[7]=e[7]^X[7];

и затем снова запускаем один из битов Y в этой строке:

  assign Y[b]=~Y[b]; // correct the incorrect bit

Так (а) у вас короткое замыкание и (б) какой бит имеет короткое замыкание? Это зависит от b. Итак, положение короткого замыкания зависит от состояния одного из внутренних проводов. Вы описали схему, которая может переконфигурировать себя в зависимости от ее входов. Verilog не позволит вам сделать это. Verilog - это язык описания оборудования . Обычное цифровое оборудование не может переконфигурировать себя в зависимости от состояния его входов.

0 голосов
/ 31 мая 2019

Стандарт Verilog перечисляет допустимые значения lhs для непрерывного присвоения следующим образом (Таблица 10-1):

Чистая или переменная (векторная или скалярная)

Постоянный выбор битоввекторной сети или упакованной переменной

Постоянный частичный выбор векторной сети или упакованной переменной

Конкатенация или вложенная конкатенация любой из вышеуказанных левых сторон

в вашем случае Y[b] не является константой выбора, потому что b не является константой.Следовательно, синтаксически ваши lhs недопустимы, и вы получаете это сообщение от компилятора.

В дополнение к этому у вас есть цикл с нулевой задержкой.Смотрите другие ответы для объяснения.

0 голосов
/ 30 мая 2019

Проблема в том, что вы выполняете постоянное задание.Чтобы процитировать из IEEE Std 1800-2012. (Раздел 10.3) о непрерывных присвоениях:

При непрерывных присвоениях значения должны передаваться в сети или переменные, как векторные (упакованные), так и скалярные, Это назначение должно происходить всякий раз, когда изменяется значение правой части. Непрерывные назначения обеспечивают способ моделирования комбинационной логики без указания взаимосвязи вентилей.

Когда вы делаете assign Y[b]=~Y[b], само назначение автоматически заставляет правую часть снова измениться, что снова вызывает назначение.

...