#system-verilog #test-bench
Вопрос:
Для понимания SystemVerilog я писал коды по Цифровому Дизайну и Компьютерной Архитектуре. Итак, я написал первый пример и тестовый стенд в книге.
Дизайн
module sillyfunction(input logic a,b,c,
output logic y);
assign y = ~a amp; ~b amp; ~c |
a amp; ~b amp; ~c |
a amp; ~b amp; c;
endmodule
Испытательный стенд
module testbench();
input a, b, c;
output y;
sillyfunction dut(a,b,c,y);
initial begin
$dumpfile("file.vcd");
$dumpvars(1);
a = 0; b = 0; c = 0;
#10
c = 1;
#10
b = 1; c = 0;
#10
c = 1;
#10
a = 1; b = 0; c = 0;
#10
c = 1;
#10
b = 1; c = 0;
#10
c = 1;
end
endmodule
Проблема в том, что я столкнулся с ошибкой:
[2021-10-30 14:44:15 EDT] iverilog '-Wall' design.sv testbench.sv amp;amp; unbuffer vvp a.out
design.sv:1: syntax error
I give up.
Exit code expected: 0, received: 1
Done
Я попытался отладить его с помощью изменения входных и выходных переменных на reg
и wire
, которое не имеет никакого эффекта. Я также пытался
$dumpvars(1) — $dumvars(0)
Что никак не влияет на ошибку.
Как я могу устранить ошибку?
Ответ №1:
Я также вижу эту ошибку, когда запускаю ваш код в старой версии iverilog
on edaplayground. Я подозреваю, что версия, которую вы использовали, поддерживает только старый стандарт Verilog, но не имеет большой поддержки функций SystemVerilog; отсюда и расплывчатое сообщение об ошибке синтаксиса. Вероятно, он не распознал logic
ключевое слово, специфичное для SystemVerilog.
Вам следует перейти на последнюю версию (Icarus Verilog 0.10.0), которая имеет лучшую поддержку SystemVerilog. Вы получите другое сообщение, но я тоже не счел это очень полезным.
Но переключение на другой симулятор, такой как Cadence, дает более полезное сообщение:
input a, b, c;
|
xmvlog: *E,NOPORT (testbench.sv,10|8): input/output/inout 'a' not declared in port list [12.3.2(IEEE)].
Вот ссылка: edaplayground.
Как правило, вам не нужны порты на тестовом стенде, так как обычно это модуль верхнего уровня. Использование reg
и wire
, как вы упомянули, является одним из способов исправить ошибку. Другой способ-изменить:
input a, b, c;
output y;
Для:
logic a, b, c;
logic y;
Ответ №2:
Проблема, по-видимому, связана со стилем объявления портов, которому вы следовали для тестовой среды модуля.
Это стиль объявления портов, отличный от ANSI, и система-verilog обсуждает это в разделе стандарта LRM, 23.2.2.1 Объявления портов, отличных от ANSI. Чтобы это сработало, вам придется изменить
module testbench(); -> module testbench(a,b,c,y);
Далее, порты a,b,c и y являются проводами. Провод не может быть назначен как «a = 1;». Таким образом, вы можете изменить провод на переменную с помощью :
input a, b, c; output y; -> input var a, b, c; output var y;
Комментарии:
1. Испытательные стенды обычно не имеют портов.
input a, b, c; output y;
следовало быreg a, b, c; wire y;
и уйтиmodule testbench();
. Ошибка находится в строке 1 design.sv, он еще не проанализирован testbench.sv
Ответ №3:
Icarus Verilog (он же iverilog) версии 0.9.* не поддерживает SysmteVerilog. Версия 0.10.* поддерживает ограниченное подмножество функций SystemVerilog с флагом компилятора -g2012
. Обратите внимание на параметры компиляции на изображении с игровой площадки EDA
В вашем тестовом стенде измените:
input a, b, c;
output y;
Для:
logic a, b, c; // could also be 'reg' type
wire y; // could also be 'logic' type