#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]
т. Д.