Я пытаюсь сделать 4-битный сумматор и проверить его. Я решил использовать wait, чтобы определить, когда схема сумматора завершена, проверяя, когда мои sum и carry_out >= 0. Входные данные для схемы задаются как аргументы командной строки. Я создаю свой 4-битный сумматор, используя свой полный сумматор, который я смог успешно протестировать с помощью этого метода.
//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
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
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?
Это не рекомендуемый способ тестирования, потому что вы не получите вывода, если данные неверны.
Лучший способ - проверить, соответствует ли результат тому, что вы ожидаете.
$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