2015-06-05 4 views
0

Я пытаюсь передать одну структуру в качестве входных данных и получить вывод в другой структуре. Однако во время моделирования возникают некоторые проблемы. В следующем примере кода компилируется штраф в questasim, однако моделирование дает следующее сообщение об ошибке:Systemverilog: Ошибка моделирования при передаче структур как вход модуля выходы

Connection type 'core_tb_sv_unit.struct ' is incompatible with 'core_sv_unit.struct ' for port (struct_in): Struct/union types must match.

MyStruct.sv

`ifndef _DEF_ 
`define _DEF_ 

typedef struct { 
    real instr; 
    real addr; 
} instr_packet_s; 

`endif 

core.sv

`timescale 1ns/1ns 
`include "MyStruct.sv" 

module core(
    input instr_packet_s struct_in, 
    output instr_packet_s struct_out 

); 
initial begin 
    $display("Initial"); 
end 

endmodule 

core_tb.sv

`include "MyStruct.sv" 

module core_tb(); 

instr_packet_s struct_in_tb,struct_out_tb; 

assign struct_in_tb.instr=2; 
assign struct_in_tb.addr=3; 


core u_core(
.struct_in(struct_in_tb), 
.struct_out(struct_out_tb) 
); 
endmodule 

Что я пропущу г?.

Я знаю, что интерфейсы - это предлагаемый рабочий процесс, но вход для модели будет передан подпрограмме C с использованием DPI. Интерфейс DPI поддерживает структуры, я не думаю, что он поддерживает интерфейсы. Вот почему я хотел бы придерживаться простых структур.

+0

Это работает, если элементы в struct являются 'int' вместо' real'? – Greg

+0

Нет, он все еще терпит неудачу, однако, похоже, он специфичен к квестасим. В резком это работает отлично. – user3716072

ответ

1

SystemVerilog имеет строгие правила типизации для пользовательских типов. Введенный в одну область ввода тип не совпадает с типом, объявленным в другой области, даже если он имеет то же имя и тот же внутренний макет. Пользовательский тип совместим только с самим собой. Определите свои типы в пакете и импортируйте пакет в каждый файл. См. http://go.mentor.com/package-import-versus-include

По умолчанию Questa рассматривает каждый файл в командной строке vlog как отдельный модуль компиляции, например C/C++. Поэтому все директивы компилятора (`define ') и декларация в первом файле не отображаются в содержимом второго файла. Таким образом, ваш typedef запускается при компиляции файлов core.sv и core_tb.sv.

Я считаю, что резкий конкатенирует все файлы в командной строке, а затем компилирует файл, поэтому есть только одна единица компиляции, и есть только на typedef.

Есть способ изменить стандартную версию Questa, но я не буду говорить вам об этом, потому что я не рекомендую так делать. Это усложняет работу, когда вы хотите использовать отдельную компиляцию в более крупных средах.

+0

Спасибо за объяснение Дэйв, это имеет смысл сейчас. – user3716072

+0

+1 для импорта и включают. По какой-то причине наша отрасль имеет плохую привычку поощрять «включать» все. Чаще всего пакеты являются правильным решением. – Chiggs