Тестирование 4-битного сумматора

Я пытаюсь сделать 4-битный сумматор и проверить его. Я решил использовать wait, чтобы определить, когда схема сумматора завершена, проверяя, когда мои sum и carry_out >= 0. Входные данные для схемы задаются как аргументы командной строки. Я создаю свой 4-битный сумматор, используя свой полный сумматор, который я смог успешно протестировать с помощью этого метода.

Full_adder.v

//Behavioral Verilog
module full_adder (input a, input b, input cin, output s, output cout);
    assign s = a ^ b ^ cin;
    assign cout = (a && b) || (a && cin) || (b && cin);
endmodule

4_bit_adder.v

module four_bit_adder(input [0:3] x, input [0:3] y, input carry_in, output [0:3] sum, output carry_out);
    full_adder add1(x[0], y[0], sum[0], carry_in, carry1);
    full_adder add2(x[1], y[1], sum[1], carry1, carry2);
    full_adder add3(x[2], y[2], sum[2], carry2, carry3);
    full_adder add4(x[3], y[3], sum[3], carry3, carry_out);
endmodule

4_bit_adder_tester.v

module four_bit_adder_test;
    reg [0:3]x;
    reg [0:3]y;
    reg carry_in;
    wire sum;
    wire carry_out;
    four_bit_adder adder(x, y, carry_in, sum, carry_out);

    initial begin
        $display("Here");
        if (!$value$plusargs("x=%d", x)) begin
            $display("ERROR: please specify +x=<value> to start.");
            $finish;
        end   
        if (!$value$plusargs("y=%d", y)) begin
            $display("ERROR: please specify +y=<value> to start.");
            $finish;
        end
        if (!$value$plusargs("carry_in=%d", carry_in)) begin
            $display("ERROR: please specify +carry_in=<value> to start.");
            $finish;
        end
        wait(sum >= 0 && carry_out>= 0) $display("sum=%d, carry_out=%d", sum, carry_out);
        $finish;
    end
endmodule

Проблема в том, что carry_out остается равным x, поэтому переменные sum и carry_out никогда не печатаются. Я попытался распечатать значение carry_out, и я думаю, что логика в моих схемах должна работать. Является ли это допустимым способом тестирования моего кода Verilog?

Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения &quot;многие ко многим&quot; в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
0
68
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это не рекомендуемый способ тестирования, потому что вы не получите вывода, если данные неверны.

Лучший способ - проверить, соответствует ли результат тому, что вы ожидаете.

   $display("Expected %b + %b + %b = %b", x,y,carry_in, {x+y+carry_in});
   #1 // let output propagate
      if ( {carry_out,sum} == x + y + carry_in )
        $display("passed sum=%b, carry_out=%b", sum, carry_out);
      else
        $display("failed sum=%b, carry_out=%b", sum, carry_out);

    end

Это дает вам лучшее представление о том, что происходит не так. Вы все еще видите, что на выходе z, что означает, что вы не подключили что-то должным образом.

Кроме того, избавьтесь от всех предупреждающих сообщений.

Вам нужно обратить пристальное внимание на файлы журнала вашего симулятора, потому что там должны быть предупреждающие сообщения, которые укажут на проблему в вашем коде. Например, на EDA Playground я вижу такое предупреждение:

Warning-[PCWM-W] Port connection width mismatch
testbench.sv, 21
"four_bit_adder adder(x, y, carry_in, sum, carry_out);"
  The following 1-bit expression is connected to 4-bit port "sum" of module 
  "four_bit_adder", instance "adder".
  Expression: sum
  Instantiated module defined at: "testbench.sv", 8

Предупреждение исчезает при изменении:

  wire sum;

К:

  wire [0:3] sum;

Вы можете использовать wait, но вы должны учитывать ситуацию, когда выражение никогда не бывает истинным. В этом случае вы можете добавить тайм-аут тестового стенда, который завершает симуляцию после разумного промежутка времени. Например, добавьте второй блок initial в four_bit_adder_test:

initial begin
    #50 $display("Error: timeout");
    $finish;
end

Другие вопросы по теме