Недопустимая ссылка Ошибка

Я пишу счетчик пульсаций, используя D-Flip Flops. Однако следующий код дает мне Illegal reference error внутри блока initial для q2,q3,q4variables. Почему это?

module RCounter;

reg d,d2,d3,d4,clk;
wire q,q2,q3,q4;


DFlipFlop a(d,q,clk);
DFlipFlop a1(d2,q2,q);
DFlipFlop a2(d3,q3,q2);
DFlipFlop a3(d4,q4,q3);

initial

begin

clk =1;


d=0;d2=0;d3=0;d4=0;q2=0;q3=0;q4=0;

#2 d=1;d2=~q2; d3=~q3; d4=~q4;
#2 d=0;d2=~q2; d3=~q3; d4=~q4;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;
#2 d=0;d2=~q2; d3=~q3; d4=~q4;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;
#2 d=0;d2=~q2; d3=~q3; d4=~q4;
#2 d=1;d2=~q2; d3=~q3; d4=~q4;

end

always 
begin

#2 assign clk = ~ clk;

end

endmodule

Модуль D FlipFlop:

module DFlipFlop(d,q,clk);

input d,clk;
output q;

assign q = clk?( (d==1)? 1:0) : q;

endmodule

Как я могу решить эту проблему?

С Уважением


person James Aflred    schedule 20.02.2013    source источник


Ответы (2)


Как указал Влад Лазаренко, вы не можете присваивать значения проводникам внутри блоков initial или always@.

Исправление для этого состоит в том, чтобы просто изменить тип с wire на reg.

Или объявите все (кроме шин с тремя состояниями) как logic, если вы используете SystemVerilog.

Определение reg или wire применимо только к этому уровню иерархии. Регистр может управлять портом, который рассматривается как провод внутри этого модуля.

Reg не подразумевает триггер или регистрацию, это оптимизация симулятора.

Также стоит отметить, что триггер обычно создается с помощью:

reg x;
always @(posedge clk or negedge rst_n) begin
  if(~rst_n) begin
    //reset condition
    x <= 1'b0;
  end
  else begin
    x <= next_value;
  end
end
person Morgan    schedule 20.02.2013

Вы пытаетесь присвоить начальные значения проводам, здесь:

q2=0;q3=0;q4=0;

Это незаконно.

person Community    schedule 20.02.2013
comment
@JamesAflred: Не делать этого? Похоже, вам крайне необходимо изучить Verilog, прежде чем писать какие-либо описания оборудования с его использованием. - person ; 20.02.2013
comment
ну, я учусь этому, создавая такие программы. Итак, как я могу решить эту проблему? Я публикую полный код сейчас. - person James Aflred; 20.02.2013
comment
@JamesAflred: О, хорошо ... Вы не пишете программы с помощью Verilog :) Вы описываете с его помощью аппаратное обеспечение. Попробуйте изучить его, сначала прочитав книгу, а затем приступайте к написанию кода. Хоть читай что за провод. По сути, он соединяет что-то с чем-то еще и не хранит никакой информации. Теперь вы пытаетесь сохранить в нем 0. Как ты сделал это? Нет никакого способа сделать это, это не имеет никакого смысла. Так что не делайте этого. - person ; 20.02.2013