Systemverilog:将结构作为模块传递时出现模拟错误 input\outputs
Systemverilog: Simulation error when passing structs as module input\outputs
我正在尝试将一个结构作为输入传递并在另一个结构中获取输出。但是我在模拟过程中遇到了一些问题。以下示例代码在 questasim 中编译良好,但是模拟给出以下错误:
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
我错过了什么?
我知道接口是此处建议的工作流程,但模型的输入将使用 DPI 传递给 C 例程。 DPI接口支持结构,我认为它不支持接口。这就是为什么我想坚持简单的结构。
SystemVerilog 具有针对用户定义类型的强类型规则。在一个作用域中声明的类型与在另一个作用域中声明的类型不同,即使它们具有相同的名称和相同的内部布局。用户定义的类型仅与其自身兼容。在包中定义您的类型并在每个文件中导入包。参见 http://go.mentor.com/package-import-versus-include
默认情况下,Questa 将 vlog 命令行上的每个文件视为一个单独的编译单元,如 C/C++。因此,第一个文件中的所有编译器指令(`defines)和声明对第二个文件的内容都是不可见的。所以你的 typedef 在编译 core.sv 和 core_tb.sv 文件时被执行。
我相信incisive是在命令行拼接所有的文件,然后编译文件,所以只有一个编译单元,而且只有typedef上才有。
有一种方法可以更改 Questa 默认设置,但我不会告诉您,因为我不建议您这样做。当您想在较大的环境中利用单独的编译时,这会使事情变得非常困难。
我正在尝试将一个结构作为输入传递并在另一个结构中获取输出。但是我在模拟过程中遇到了一些问题。以下示例代码在 questasim 中编译良好,但是模拟给出以下错误:
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
我错过了什么?
我知道接口是此处建议的工作流程,但模型的输入将使用 DPI 传递给 C 例程。 DPI接口支持结构,我认为它不支持接口。这就是为什么我想坚持简单的结构。
SystemVerilog 具有针对用户定义类型的强类型规则。在一个作用域中声明的类型与在另一个作用域中声明的类型不同,即使它们具有相同的名称和相同的内部布局。用户定义的类型仅与其自身兼容。在包中定义您的类型并在每个文件中导入包。参见 http://go.mentor.com/package-import-versus-include
默认情况下,Questa 将 vlog 命令行上的每个文件视为一个单独的编译单元,如 C/C++。因此,第一个文件中的所有编译器指令(`defines)和声明对第二个文件的内容都是不可见的。所以你的 typedef 在编译 core.sv 和 core_tb.sv 文件时被执行。
我相信incisive是在命令行拼接所有的文件,然后编译文件,所以只有一个编译单元,而且只有typedef上才有。
有一种方法可以更改 Questa 默认设置,但我不会告诉您,因为我不建议您这样做。当您想在较大的环境中利用单独的编译时,这会使事情变得非常困难。