2017-10-21 202 views
0

我有一個verilog文件,我想要的是一個數學任務,然後我在另一個文件中執行include "maths.v",然後在mathsfunction;中寫入mathsfunction;在其他文件initial begin - end塊,應該在這一點上運行的任務,如果我理解正確的話,代碼如下:Verilog 2001語法中全局聲明是非法的任務

Maths.v

task mathsfunction; 
reg [0:31] x; 
reg [0:31] y; 
reg [0:31] z; 
begin 
    x = $urandom; 
    y = $urandom; 
    z = x + y 
end 
#200  
endtask 

我得到一個編譯錯誤,這是對第一行task mathsfunction;這是Global declarations are illegal in Verilog 2001 syntax.從我迄今爲止學到的,有一個verilog文件只是一個任務(不是一個模塊,我不希望它是一個模塊)應該沒問題?所以不知道爲什麼這不起作用。

任何幫助將是巨大的

+0

您需要提供更多信息。任務可以在全局空間中聲明。所以,你的信息與別的東西有關。 – Serge

+0

我沒有LRM在我面前,但我相信所有版本的Verilog都不支持在全局空間(即模塊外部)聲明信號,任務,函數或參數。我知道SystemVerilog的確如此,但這樣做被認爲是不好的做法。推薦的是定義共享的任務,功能等,是將它們放入SystemVerilog包中。 – Greg

回答

0

你的第一個問題是,你混淆Verilog2K(「Verilog的」)和SystemVerilog。在Verilog中,任務聲明只能出現在模塊內或生成(而不是「全局」),這會給出錯誤信息。其次,您的任務包含兩個語句(begin/end seq塊和時序控制),這在Verilog中無效; SV放鬆了這一點。話雖如此,將#200放在塊外面沒有任何用處,所以你可以將它移動到塊內使其與Verilog兼容。

您的下一個問題是您的任務沒有輸入或輸出 - x,y,z是內部的;你需要使它們成爲input,outputinout

最後,您已經錯誤地剪切/粘貼 - 如果沒有更多分號,此代碼將無法編譯。