Вывод умножения в Verilog не отображается при моделировании поведения

Я написал два разных фрагмента Verilog для комбинационного и последовательного умножения, которые публикую ниже. Когда я имитирую любое из умножений, множитель, обозначенный mult_A, и множимое, обозначенное mult_B, показывают свои значения битовой строки, но результирующий продукт, обозначенный R, показывает все X. Будем очень признательны за помощь в отображении результата умножения кодов R.

Комбинация

module com_multiplication(mult_A, mult_B, R);
    input [15:0] mult_A, mult_B;
    output R;

    reg [31:0] R;

    integer k;

    always@(mult_A, mult_B)
    begin
    R = 0;
    for(k = 0; k < 16; k = k + 1)
        if(mult_A[k] == 1'b1) R = R + (mult_B << 1);
    end
 endmodule

Серийный

module ser_multiplication(mult_A, mult_B, clk, start, R, finish);
    input [15:0] mult_A, mult_B;
    input clk, start;
    output R, finish;

    reg [31:0] R;
    reg [15:0] mult_A_duplicate;
    reg [31:0] mult_B_duplicate;
    reg [4:0] p;
    wire finish = !p;

    initial p = 0;

    always@(posedge clk)
      if (finish && start) begin
        p = 16;
        R = 0;
        mult_B_duplicate = {16'd0, mult_B};
        mult_A_duplicate = mult_A;

      end else if (p) begin
         if (mult_A_duplicate[0] == 1'b1) R = R + mult_B_duplicate;
            mult_A_duplicate = mult_A_duplicate >> 1;
            mult_B_duplicate = mult_B_duplicate << 1;
            p = p - 1;
      end
endmodule

Тестовый стенд

Серийная часть пока закомментирована.

module multiplication_tb; 
  reg clk, start, finish; 
  reg [15:0] mult_A,  mult_B;
  reg [31:0] R; 

  com_multiplication U0 (  
  .mult_A                   (mult_A),
  .mult_B                   (mult_B),
  .R                        (R) 
  ); 

  /*ser_multiplication U1 (  
  .clk                      (clk),
  .start                        (start),
  .finish                   (finish),
  .mult_A                   (mult_A),
  .mult_B                   (mult_B),
  .R                        (R)
  ); */


  initial 
  begin 
  $display("time\t clk start finish");  
  $monitor ("%g\t %b %b %b %b %b %b", $time, clk, start, finish, mult_A, 
mult_B, R);
    #100     clk = 0; 
    mult_A =0;
    mult_B = 0;
    #10 mult_A = 2;
    mult_B = 3;
   #20 mult_B=2;

   #10 mult_B=5;
   #100 $finish;
 end 

 always 
 #5 clk = !clk; 

endmodule 

person sunspots    schedule 02.03.2018    source источник


Ответы (1)


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

initial
begin
   clk = 1'b0;
   forever
     #50 clk = ~clk;
end
person Oldfart    schedule 02.03.2018