недопустимое значение l - ошибка компилятора verilog - PullRequest
2 голосов
/ 12 апреля 2011
module fronter ( arc, length, clinic ) ;
 input [7:0] arc;
 output reg [7:0] length ;

 input [1:0] clinic;
 input en0, en1, en2, en3; // 11

 // clock generator  is here

 g_cal A( en0) ;
 g_cal B( en1) ;
 g_cal C( en2) ;
 g_cal D( en3) ;

always @( negedge arc, posedge clk )
  case ( clinic ) 
    2'b00 : { en3, en2, en1, en0 } = 4'b0001;    // 23
    2'b01 : { en3, en2, en1, en0 } = 4'b0010;    // 24
    2'b10 : { en3, en2, en1, en0 } = 4'b0100;    // 25
    2'b11 : { en3, en2, en1, en0 } = 4'b1000;    // 26
    default : { en3, en2, en1, en0 } = 4'bxxxx;  // 27
  endcase

// I am trying to change value of en to call corresponding intance with that 
//corresponding en value

endmodule

module g_cal ( en ) ;

 input en ;
 // some other jobs, calling another instances after making some job

endmodule

когда я компилирую, компилятор дает мне;

verilog.v:23: error: en0 is not a valid l-value in Numerator.
verilog.v:11:      : en0 is declared here as wire.
verilog.v:24: error: en1 is not a valid l-value in Numerator.
verilog.v:11:      : en1 is declared here as wire.
verilog.v:25: error: en2 is not a valid l-value in Numerator.
verilog.v:11:      : en2 is declared here as wire.
verilog.v:26: error: en3 is not a valid l-value in Numerator.
verilog.v:11:      : en3 is declared here as wire.
verilog.v:27: error: en3 is not a valid l-value in Numerator.
verilog.v:11:      : en3 is declared here as wire.
segmentation fault

Как это исправить? Почему выдает ошибку?

EDIT: Я решил проблему как;

   // I erased that line "input en0, en1, en2, en3; // 11"

 // clock generator  is here

 g_cal A(  1'b0) ;
 g_cal B(  1'b0) ;
 g_cal C(  1'b0) ;
 g_cal D(  1'b0) ;

always @( negedge arc, posedge clk )
/* erasing all those line 
 case ( clinic ) 
    2'b00 : { en3, en2, en1, en0 } = 4'b0001;    // 23
    2'b01 : { en3, en2, en1, en0 } = 4'b0010;    // 24
    2'b10 : { en3, en2, en1, en0 } = 4'b0100;    // 25
    2'b11 : { en3, en2, en1, en0 } = 4'b1000;    // 26
    default : { en3, en2, en1, en0 } = 4'bxxxx;  // 27
  endcase

Я буду использовать структуру if и else и вызывать соответствующий экземпляр с 1'b1 * /

 // I am trying to change value of en to call corresponding intance with that 
//corresponding en value

endmodule

Ответы [ 2 ]

6 голосов
/ 12 апреля 2011

Вы пытаетесь присвоить input (что плохо).Измените input en0, en1, en2, en3; на output reg en0, en1, en2, en3;.reg необходим, поскольку вы присваиваете эту переменную в процедурном блоке (т. Е. always или initial).Сообщение «Неправильное значение l» пытается сообщить вам об этом.

Кроме того, я предполагаю, что 11, 23, 24 и т. Д. Являются случайными номерами строк из copy-paste ...

1 голос
/ 12 апреля 2011

Проблема решена, когда я пишу;

reg en0, en1, en2, en3 ;

initial begin 
  en0 <= 1'b0; en1 <= 1'b0; 
  en2 <= 1'b0; en3 <= 1'b0;
end

g_cal A(  en0) ;
g_cal B(  en1) ;
g_cal C(  en2) ;
g_cal D(  en3) ;

@ Марти подчеркнул важную вещь: «Reg необходим, поскольку вы присваиваете эту переменную в процедурном блоке (т. Е. Всегда или в начале).»

...