Трудности с моим ALU в verilog

Так что я проектирую ALU в Verilog, пока я изучаю его. Я придумал следующий код: Testbench:

module ALUtb;

reg clock = 1'b0;

reg [0:7] val1;
reg [0:7] val2;

initial begin
val1 = 8'b01010100;
val2 = 8'b10101000;

#50 $finish;

 end
 ALU piet(val1, val2,, clock);

always begin
  #5 clock = ~clock
;
end

  endmodule

 Main code:

 // Code your design here

     module ALU(
     a1, a2, out, clock
     );

  output [0:7] out;
  input [0:7] a1;
  input [0:7] a2;
  input clock;

  wire clock;
  reg  out;
  wire co;
  wire a1, a2;

   wire [0:7] poep;

   initial begin
     $monitor("Out=%d, co=%d, a=%d, a2=%d, poep=%d, clock=%d", out, co, a1,   a2,     poep, clock);

  end

  always @ (posedge clock) begin

     out <= poep;

   end

  adder addy(.output_byte(poep), .co(co), .a1(a1), .a2(a2), .clock(clock));

endmodule 

 module adder(
   output_byte, co, a1, a2, clock
  );
  initial begin
    output_byte = 8'b00000011;
  end
  input [0:7] a1;
  input [0:7] a2;
  input clock;

  output [0:7] output_byte;
  output output_bit;

  output co;

  wire c1;
  reg b1, b2;
  reg [0:7] output_byte;
  wire output_bit;

  integer i;

  always @ (posedge clock) begin
     for(i = 0; i < 8; i = i + 1) begin

      b1 = (a1[i] & (1 << i));
      b2 = (a2[i] & (1 << i));  

      #1 output_byte[i] = output_bit;
  end
  end

 bitadder b_adder(.out(output_bit), .co(), .a1(b1), .a2(b2), .c1(c1));

endmodule

 // Deze module is een 1-bits adder. 
 module bitadder(out, co, a1, a2, c1);

  output out, co;
  input a1, a2, c1;

  wire out, co;

  wire a1;
  wire a2;
  wire c1;

  assign {co, out} = a1 + a2 + c1;

endmodule

Итак, в результате я получаю:

Out=  x, co=z, a= 84, a2=168, poep=  3, clock=0
Out=  3, co=z, a= 84, a2=168, poep=  x, clock=1
Out=  3, co=z, a= 84, a2=168, poep=  x, clock=0
Out=  x, co=z, a= 84, a2=168, poep=  x, clock=1
Out=  x, co=z, a= 84, a2=168, poep=  x, clock=0
Out=  x, co=z, a= 84, a2=168, poep=  x, clock=1
Out=  x, co=z, a= 84, a2=168, poep=  x, clock=0
Out=  x, co=z, a= 84, a2=168, poep=  x, clock=1
Out=  x, co=z, a= 84, a2=168, poep=  x, clock=0
Out=  x, co=z, a= 84, a2=168, poep=  x, clock=1
Out=  x, co=z, a= 84, a2=168, poep=  x, clock=0

Как видите, это только 8-битный сумматор. Так как даже это еще не работает, мы еще не приступили. Мой конкретный вопрос: почему выход не меняется должным образом? Poep походит на буфер для фактического вывода. co - бит выноса, a - первое число, a2 - второе число, c1 - бит переноса, а остальное должно говорить само за себя. Почему мои результаты не определены?

Любая помощь приветствуется!

Заранее спасибо!

2 ответа

Ну, потому что вы назначаете его на провод, значение которого не определено, в каждом такте. Если вы хотите, чтобы poep был буфером, сделайте его reg, а не проводным. провода не содержат данных.

Ваши выходные данные не определены, потому что вы никогда не присваивали значение сигналу внутри модуля. Вы заявили какwire, которое по умолчанию имеет значение высокого импеданса (z). Проблема в том, что вы никогда не водите его с известным значением.

Подключениеc1на входbitadderприводит к тому, что выходные данные этого модуля становятся неизвестными (x), и это неизвестное распространяется вверх по иерархии модулей.

Самое простое решение — изменить:

        wire c1;

к:

        wire c1 = 0;

Это проясняет неизвестные результаты:

      Out=x, co=z, a=0, a2=0, poep=  3, clock=0
Out=1, co=z, a=0, a2=0, poep=  3, clock=1
Out=1, co=z, a=0, a2=0, poep=  3, clock=0
Out=1, co=z, a=0, a2=0, poep=  1, clock=0
Out=1, co=z, a=0, a2=0, poep=  0, clock=0
Out=0, co=z, a=0, a2=0, poep=  0, clock=1
Out=0, co=z, a=0, a2=0, poep=  0, clock=0
Out=0, co=z, a=0, a2=0, poep=  0, clock=1
Out=0, co=z, a=0, a2=0, poep=  0, clock=0
Out=0, co=z, a=0, a2=0, poep=  0, clock=1
Out=0, co=z, a=0, a2=0, poep=  0, clock=0
Out=0, co=z, a=0, a2=0, poep=  0, clock=1

Мои симуляторы выдали мне ошибку компиляции наoutput_byteсигнал вadderмодуль. Я удалил эту строку, чтобы избавиться от ошибки компиляции:

        output output_bit;
Другие вопросы по тегам