Мы работаем над системой verilog DPI для вызовов. При составлении C++
файл мы получаем ошибки, как это:
ошибка: невозможно преобразовать ‘bool’ в ‘svLogic *’ в назначении
Вот svLogic
является переменной с 4 состояниями.
Симулятор VCS имеет предопределенную функцию в методе DirectC vc_putScalar
где vc_putScalar находится «Передает значение скалярного регистра или бита в vc_handle по ссылке». Vc_handle является входной или выходной переменной в функции. С VCS мы могли бы использовать: vc_putScalar(mem_req_rdy, mm->req_cmd_ready());
Мы работаем над симулятором квестов Modelsim, поэтому DirectC не будет работать. Мы устали, чтобы изменить vc_putScalar
в w.r.t DPI IEEE Std 1800-2012 стандарты.
Мы изменили предопределенную логику функции на это:
mem_req_rdy = mm->req_cmd_ready();
Здесь mem_req_rdy — это svLogic, а req_cmd_ready — это bool.
Учитывая, что у вас было:
vc_putScalar(mem_req_rdy, mm->req_cmd_ready());
Я предполагаю, что mem_req_rdy имеет тип указателя svLogic * (так как из названия функции vc_putScalar, кажется, что он намеревается изменить значение в mem_req_rdy). Таким образом, вам нужно разыменовать указатель, как в следующем выражении:
*mem_req_rdy = mm->req_cmd_ready();
ошибка: невозможно преобразовать ‘bool’ в ‘svLogic *’ в назначении
svLogic
кажется указателем. Вы не можете назначить bool
значение переменной указателя.
TYPE* p = /* initialized somehow */;
bool b = /* initialized somehow */;
p = b; // YOU CANNOT DO THAT
Вы можете пересмотреть свой интерфейс DPI. Ваш код C действительно должен иметь дело с логикой с 4 состояниями?
Во многих случаях не требуются процедуры доступа для доступа к аргументам, передаваемым между двумя языками. Это всегда верно, если передаваемые типы являются C-совместимыми (int, byte, string и неупакованные массивы и структуры этих типов).
Например, этот пример DirectC
SV:
extern "C" void foo(input bit A, output bit B);
C:
void foo(vc_handle A, vc_handle B)
{ vc_scalar value;
value = vc_getSalar(A);
vc_putScalar(B,value);
}
переводит в этот код DPI
SV:
import "DPI-C" void foo(input bit A, output bit B);
C:
void foo(svBit A, svBit *B)
{ svBit value;
value = A;
*B = value;
}
Мы настоятельно рекомендуем пользователям Questa DPI использовать ключ vlog -dpiheader filename.h, а затем их код C должен #include этот файл. Затем компилятор обнаружит любые несоответствия в синтаксисе обработки аргументов.
svLogic — это определение типа unsiged char
, увидеть IEEE Std 1800-2012 § H.10.1.1 Скаляры типа бит и логика
Для преобразования bool в svLogic вам нужна функция, а не прямое назначение. Если значение bool равно true, тогда svLogic должен быть присвоен sv_1
, Если значение bool равно falue, тогда svLogic должен быть присвоен sv_0
,
Примерно так должно работать:
mem_req_rdy = mm->req_cmd_ready() ? sv_1 : sv_0;