Результатами тестирования verilog testbench являются все x или z.

Я не очень хорошо понимаю Verilog, так что это может быть какая-то простая проблема с тем, как у меня все настроено, но я не могу определить, почему моя форма волны моделирования дает либо x, либо z для моих выходных данных тестового стенда. Вот модуль, который я моделирую:

module addsub_4bit (Sum, Ovflw, A, B, sub);
input [3:0] A, B;
input sub;
output [3:0] Sum;
output Ovflw;

wire cin, c0, c1, c2, c3;

assign B[3:0] = (sub) ? (~B + 1) : B;
assign cin = 0;
assign Ovflw = (c3 ^ c2);

full_adder_1bit fa0 (.sum(Sum[0]), .cout(c0), .a(A[0]), .b(B[0]), .cin(cin));
full_adder_1bit fa1 (.sum(Sum[1]), .cout(c1), .a(A[1]), .b(B[1]), .cin(c0));
full_adder_1bit fa2 (.sum(Sum[2]), .cout(c2), .a(A[2]), .b(B[2]), .cin(c1));
full_adder_1bit fa3 (.sum(Sum[3]), .cout(c3), .a(A[3]), .b(B[3]), .cin(c2));

endmodule

и мой тестовый стенд:

module addsub_4bit_tb();
reg [7:0] stim;
reg sub;
wire [3:0] Sum;
wire Ovflw;
integer i;

addsub_4bit DUT(.Sum(Sum), .A(stim[3:0]), .B(stim[7:4]), .Ovflw(Ovfw), 
.sub(sub));

initial begin

stim = 0;
sub = 0;
#100;
for(i=0; i<16; i=i+1) begin
stim = stim + 1;
#100;
end 

stim = 0;
sub = 1;
#100;
for(i=0; i<16; i=i+1) begin
stim = stim + 1;
#100;
end

end

initial $monitor("A= %d\tB= %d\nAdd/Sub= %b\nSum= %d\tOvflw= 
%b",stim[3:0],stim[7:4],sub,Sum,Ovflw);

endmodule

Мой вывод показывает, что Sum = x и Ovflw = z. Модуль однобитового полного сумматора, который я использую для создания своего 4-битного сумматора, отлично работает и был протестирован. Я ценю любую обратную связь.


person kcinj    schedule 14.02.2018    source источник
comment
вам нужно его отладить. Я сомневаюсь, что переполнение могло быть здесь буквой z. В любом случае код full_adder был бы полезен.   -  person Serge    schedule 14.02.2018


Ответы (1)


Что касается бит переполнения, в тестовой среде допущена ошибка:

.Ovflw(Ovfw),

Для получения x проблемы Sum vector, вход B имеет несколько драйверов, один в тестовой среде, а другой в самом RTL:

.B(stim[7:4]) // TB driver
assign B[3:0] = (sub) ? (~B + 1) : B; // RTL driver

Итак, чтобы избежать этого, возьмите какой-нибудь промежуточный провод в RTL и присвойте ему значение B или ~B. Здесь я использовал провод X для управления одноразрядными сумматорами.

wire [3:0] X;
//...
assign X[3:0] = (sub) ? (~B + 1) : B;
//...
full_adder_1bit fa0 (.sum(Sum[0]), .cout(c0), .a(A[0]), .b(X[0]), .cin(cin));
//... 

См. эту ссылку для получения дополнительной информации о нескольких драйверах. Если вы используете SystemVerilog, вы можете использовать logic, чтобы избежать проблем с несколькими драйверами.

person sharvil111    schedule 14.02.2018
comment
Спасибо, работает, как ожидалось, и спасибо за информацию о нескольких драйверах - я понятия не имел, в чем проблема. - person kcinj; 14.02.2018