Неожиданное поведение Verilog Full Adder

Я пытаюсь сделать очень простой аппаратный модуль / тестовый стенд, чтобы получить представление о Verilog. Я пробовал реализовать полный сумматор.

Если я не ошибаюсь, у вас есть три входа, немедленное добавление a и b и перенос с места 2 ^ n-1.

Выходы суммируются и выполняются (которые могут служить переносом в другой модуль в базовом сумматоре или как бы то ни было, что называется упреждающим переносом).

Если я не ошибаюсь, выходная логика

сумма = (a & b) | (а & cin) | (b & cin) // или все три, на которые распространяется любой из этих

cout = a ^ b ^ cin

Вот полный модуль сумматора

module FullAdder(
a,
b,
cin,
sum,
co
);

input a;
input b;
input cin;
output sum;
output co;

//wire a;
//wire b;
//wire ci;
wire sum;
wire co;


//At least two
assign co = (a & b) | (a & cin) | (b & cin);

//one or three 
assign sum = a ^ b ^ cin; //(a & ~b & ~cin) | (~a & b & ~cin) | (~a & ~b & cin) | (a & b & cin);


endmodule

А вот и тестовый стенд

module HalfAdderTB();
reg a_in;
reg b_in;
reg cin_in;
wire s_out;
wire cout_out;

FullAdder DUT(
        a_in,
        b_in,
        cin_in,
        s_out,
        cout_out
        );

initial begin
        a_in = 1'b0;
        b_in = 1'b0;
        cin_in = 1'b0;
        #20

        a_in = 1'b0;
        b_in = 1'b0;
        cin_in = 1'b0;
        $display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
        $display("s: %b, cout: %b", s_out, cout_out);
        #20

        a_in = 1'b0;
        b_in = 1'b0;
        cin_in = 1'b1;
        $display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
        $display("s: %b, cout: %b", s_out, cout_out);
        #20

        a_in = 1'b0;
        b_in = 1'b1;
        cin_in = 1'b0;
        $display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
        $display("s: %b, cout: %b", s_out, cout_out);
        #20

        a_in = 1'b0;
        b_in = 1'b1;
        cin_in = 1'b1;
        $display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
        $display("s: %b, cout: %b", s_out, cout_out);
        #20

        a_in = 1'b1;
        b_in = 1'b0;
        cin_in = 1'b0;
        $display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
        $display("s: %b, cout: %b", s_out, cout_out);
        #20

        a_in = 1'b1;
        b_in = 1'b0;
        cin_in = 1'b1;
        $display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
                                                                                   2,1            4%
 a_in = 1'b1;
        b_in = 1'b1;
        cin_in = 1'b0;
        $display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
        $display("s: %b, cout: %b", s_out, cout_out);
        #20

        assign a_in = 1'b1;
        assign b_in = 1'b1;
        assign cin_in = 1'b1;
        $display("a: %d, b: %d, cin: %d", a_in, b_in, cin_in);
        $display("s: %b, cout: %b", s_out, cout_out);
        #20
        $finish;
end
endmodule

Мой вывод выглядит так

a: 0, b: 0, cin: 0

s: 0, cout: 0

а: 0, б: 0, син: 1

s: 0, cout: 0

a: 0, b: 1, cin: 0

s: 1, cout: 0

а: 0, б: 1, син: 1

s: 1, cout: 0

a: 1, b: 0, cin: 0

s: 0, cout: 1

а: 1, б: 0, син: 1

s: 1, cout: 0

a: 1, b: 1, cin: 0

s: 0, cout: 1

а: 1, б: 1, син: 1

s: 0, cout: 1

Я считаю, что логические утверждения в моем коде соответствуют логическим уравнениям, которые я написал выше. Я уверен в своей логике. Я не могу понять, что не так с Verilog. Я что-то пропустил с таймингом и вводом тестового стенда в Full Adder?


person Jack Frye    schedule 13.02.2018    source источник


Ответы (1)


Ваш код в порядке, но вы получаете этот странный результат из-за оператора $display. Ваш код будет работать нормально, если вы используете $strobe вместо $display. Вы также можете использовать $monitor для отображения результатов. Резон заключается в том, что оператор display выполняется немедленно, так что ваши выходные данные еще не будут обновлены с новыми значениями, тогда как strobe будет выполняться только в конце момента времени, поэтому что к тому времени ваши результаты будут обновлены. монитор используется для автоматического отображения значений всякий раз, когда значения меняются.

Поскольку вы только начинаете работать с Verilog, я предлагаю вам пройти по этой ссылке, чтобы понять, как различные операторы отображения работают в Verilog, а также пройти через этот ссылка, чтобы понять порядок выполнения операторов в конкретный момент времени, чтобы вы могли лучше спланировать свой код

person badri18    schedule 13.02.2018