Struct Systemverilog:将结构作为模块输入\输出传递时发生模拟错误

Struct Systemverilog:将结构作为模块输入\输出传递时发生模拟错误,struct,system-verilog,questasim,system-verilog-dpi,Struct,System Verilog,Questasim,System Verilog Dpi,我试图将一个结构作为输入传递,并在另一个结构中获得输出。但是,我在模拟过程中遇到了一些问题。以下示例代码在questasim中编译得很好,但仿真给出以下错误: 连接类型“core\u tb\u sv\u unit.struct”与不兼容 端口(结构中)的“core_sv_unit.struct”:结构/联合类型必须 匹配 MyStruct.sv `ifndef _DEF_ `define _DEF_ typedef struct { real instr; real addr;

我试图将一个结构作为输入传递,并在另一个结构中获得输出。但是,我在模拟过程中遇到了一些问题。以下示例代码在questasim中编译得很好,但仿真给出以下错误:

连接类型“core\u tb\u sv\u unit.struct”与不兼容 端口(结构中)的“core_sv_unit.struct”:结构/联合类型必须 匹配

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
我错过了什么


我知道这里建议的工作流是接口,但是模型的输入将使用DPI传递给C例程。DPI接口支持结构,我认为它不支持接口。这就是为什么我要坚持使用简单的结构。

SystemVerilog对用户定义的类型有强大的类型规则。在一个作用域中声明的类型与在另一个作用域中声明的类型不同,即使它具有相同的名称和相同的内部布局。用户定义的类型仅与自身兼容。在包中定义类型并在每个文件中导入包。看

默认情况下,Questa将vlog命令行上的每个文件视为一个单独的编译单元,如C/C++。因此,第一个文件中的所有编译器指令(`defines)和声明对第二个文件的内容都不可见。因此,在编译core.sv和core_tb.sv文件时会执行typedef

我相信incisive会连接命令行上的所有文件,然后编译文件,因此只有一个编译单元,只有一个关于typedef的单元


有一种方法可以更改Questa默认值,但我不会告诉您,因为我不建议这样做。当您想在更大的环境中利用单独编译时,这会使事情变得非常困难。

如果结构中的项是
int
而不是
real
,它是否有效?不,它仍然失败,但是它似乎是特定于questasim的。在incisive中效果很好。感谢Dave的解释,这现在是有意义的。导入和包含+1。出于某种原因,我们的行业有一个坏习惯,就是偏爱“包括”胜过一切。通常情况下,软件包是正确的解决方案。