2015-06-05 22 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 

我在想什麼G?。

我知道接口是這裏建議的工作流程,但是使用DPI將模型的輸入傳遞給C例程。 DPI接口支持結構,我不認爲它支持接口。這就是爲什麼我想堅持簡單的結構。

+0

如果結構中的項是'int'而不是'real',它能工作嗎? – Greg

+0

不,它仍然失敗,但它似乎是特定於questasim。在尖銳,它工作正常。 – user3716072

回答

1

SystemVerilog爲用戶定義的類型提供了強大的輸入規則。在一個作用域中聲明的類型與在另一個作用域中聲明的類型不同,即使它具有相同的名稱和相同的內部佈局。用戶定義的類型僅與自身兼容。在包中定義你的類型並在每個文件中導入包。請參閱http://go.mentor.com/package-import-versus-include

默認情況下,Questa將vlog命令行上的每個文件視爲單獨的編譯單元,如C/C++。因此,第一個文件中的所有編譯器指令(`定義)和聲明對第二個文件的內容都是不可見的。因此,在編譯core.sv和core_tb.sv文件時,您的typedef會被執行。

我相信切齒連接命令行上的所有文件,然後編譯文件,所以只有一個編譯單元,並且只有typedef。

有一種方法可以改變Questa的默認設置,但我不會告訴你,因爲我不建議這樣做。當您想要在更大的環境中利用單獨的編譯時,它會使事情變得非常困難。

+0

感謝戴夫的解釋,現在有道理。 – user3716072

+0

+1進口與包括。出於某種原因,我們的行業有一個不利於「include」的壞習慣。通常情況下,包裝是正確的解決方案。 – Chiggs

相關問題