Проблема распространения SystemVerilog X

#system-verilog

Вопрос:

У меня проблема с моим SV-кодом. Я пытаюсь смоделировать гадюку переноса вперед. Тем не менее, когда я смотрю на свои результаты по времени

введите описание изображения здесь

они показывают, что результат имеет x распространение, а также SUM .

Вот мой код системного верилога

 module fulladder (input logic i_bit1, i_bit2, i_carry,  output logic o_sum, o_carry);    assign o_sum = i_bit1 ^ i_bit2 ^ i_carry;  assign o_carry = (i_bit1 amp; i_bit2) | (i_carry amp; (i_bit1 ^ i_bit2));   endmodule   module carry_lookahead_adder  #(parameter WIDTH)  (input logic [WIDTH-1:0] i_add1,  input logic [WIDTH-1:0] i_add2,  output logic [WIDTH:0] o_result  );  logic [WIDTH:0] w_C;  logic [WIDTH-1:0] w_G, w_P, w_SUM;    //Generate full adders  genvar i;  generate for (i= 1; ilt;WIDTH; i  )  begin : f_loop   fulladder fi (   .i_bit1(i_add1[i]),  .i_bit2(i_add2[i]),  .i_carry(w_C[i]),  .o_sum(w_SUM[i]),  .o_carry()  );  end   endgenerate    genvar jj;  generate   for (jj=0; jjlt;WIDTH; jj  )  begin   assign w_G[jj] = i_add1[jj] amp; i_add2[jj];  assign w_P[jj] = i_add1[jj] | i_add2[jj];  assign w_C[jj 1] = w_G[jj] | (w_P[jj] amp; w_C[jj]);  end  endgenerate     assign w_C[0] = 1'b0; //No carry input    assign o_result = {w_C[WIDTH], w_SUM};   endmodule  

и испытательный стенд

 module carry_lookahead_adder_tb (w_RESULT);    parameter WIDTH = 32;    logic [WIDTH-1:0] r_ADD_1 = 0;  logic [WIDTH-1:0] r_ADD_2 = 0;  output logic [WIDTH:0] w_RESULT;    carry_lookahead_adder #(.WIDTH(WIDTH)) carry_lookahead_inst  (  .i_add1(r_ADD_1),  .i_add2(r_ADD_2),  .o_result(w_RESULT)  );    initial  begin  $dumpfile("dump.vcd");  $dumpvars;    #10;  r_ADD_1 = 32'b00000000000000000000000000000000;  r_ADD_2 = 32'b00000000000000000000000000000001;  #10;  r_ADD_1 = 32'b00000000000000000000000000000010;  r_ADD_2 = 32'b00000000000000000000000000000010;  #10;  r_ADD_1 = 32'b00000000000000000000000000000101;  r_ADD_2 = 32'b00000000000000000000000000000110;  #10;  r_ADD_1 = 32'b00000000100000000000000000000101;  r_ADD_2 = 32'b00000000100000000000000000000110;  #10;  r_ADD_1 = 32'b11111111111111111111111111111111;  r_ADD_2 = 32'b11111111111111111111111111111111;  #10;  r_ADD_1 = 32'b00000000000000000000000000000000;  r_ADD_2 = 32'b00000000000000000000000000000001;  #10;  end   endmodule // carry_lookahead_adder_tb  

Может ли кто-нибудь подсказать мне, что может быть причиной этого x ? Извините, что публикую свой полный код; Я просто не понимаю, откуда может возникнуть проблема.

Ответ №1:

Бит [0] w_SUM неизвестен, потому что вы не управляете им. Измените generate for цикл так, чтобы счетчик начинался с 0, а не с 1. Изменить:

 generate for (i= 1; ilt;WIDTH; i  )  

Для:

 generate for (i= 0; ilt;WIDTH; i  )  

После этого изменения, то x уходит.

Проблема заключалась в том, что for цикл не генерировал нужное количество fulladder экземпляров: вам нужно 32, но вы получили только 31. Не было никакого fulladder экземпляра, к которому вы могли бы подключиться w_SUM[0] и i_add1[0] т. Д.