Systemverilog:将结构作为模块输入\输出

时间:2015-06-05 20:03:20

标签: struct system-verilog questasim system-verilog-dpi

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

  

连接类型' core_tb_sv_unit.struct'与...不相容   ' core_sv_unit.struct' for port(struct_in):struct / union类型必须   匹配。

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

1 个答案:

答案 0 :(得分:2)

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

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

我认为尖锐地连接命令行上的所有文件,然后编译文件,因此只有一个编译单元,并且只有typedef。

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