0

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

连接类型“core_tb_sv_unit.struct”与端口(struct_in)的“core_sv_unit.struct”不兼容:结构/联合类型必须匹配。

MyStruct.sv

`ifndef _DEF_
`define _DEF_

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

`endif

核心.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 接口支持结构,我不认为它支持接口。这就是为什么我想坚持简单的结构。

4

1 回答 1

2

SystemVerilog 对用户定义的类型有强类型规则。在一个范围内声明的类型与在另一个范围内声明的类型不同,即使它具有相同的名称和相同的内部布局。用户定义类型仅与自身兼容。在包中定义您的类型并在每个文件中导入包。请参阅http://go.mentor.com/package-import-versus-include

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

我相信 incisive 在命令行上把所有文件串联起来,然后编译文件,所以只有一个编译单元,而且只有 on typedef。

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

于 2015-06-06T01:12:37.880 回答