2012-10-05 35 views
2

在VHDL Testcase上運行modelsim時出現以上錯誤,我無法理解它爲什麼是錯誤。轉換函數「To_bit」必須只有一個形式參數

測試用例:

LIBRARY IEEE; 
Use ieee.std_logic_1164.all; 

entity a is 
port (in11 : in std_logic 
); 
end a; 

架構一個的是:

component b_1 
port (in1 : in bit); 
end component; 


begin 
    inst : b_1 port map (in1=> **to_Bit**(in11)); 
end a; 

回答

4

這是一個ModelSim的錯誤,其實它應該報告你不能在一個端口來使用這個功能實際地圖,這個作品:

LIBRARY IEEE; Use ieee.std_logic_1164.all; 

entity a is port (in11 : in std_logic); end a; 

architecture a of a is 
signal inBit : Bit; 
component b_1 port (in1 : in bit); end component; 

begin 
inBit <= to_bit(in11); 
inst : b_1 port map (in1=> inBit); end a; 

有限制,適用於實際港口地圖,比較vhdlref:

實際的,如果端口或信號必須用靜態名稱 (見6.1)表示。實際的,如果一個表達式必須是全局靜態的 表達式(見7.4)。

的事情是,這兩種情況下應該是全局靜態...

+0

如果我在包中編寫一個包裝函數來「to_bit」,然後如果我使用該函數,那麼它就可以工作。 '代碼 程序包: 程序包mgc_package爲 函數mgc_to_Bit(p:std_ulogic)返回位; 封裝; 包體mgc_package是 函數mgc_to_Bit(p:std_ulogic)返回位是 begin return to_bit(p); 結束; 封裝體; VHDL案例: 圖書館工作; use work.mgc_package.all; 架構的是 .... 開始 研究所:B端口映射(IN11 => mgc_to_Bit(IN1)); end a; end a; ' 如果我能夠在portmap中使用實際的函數,那麼爲什麼我不能使用「to_bit」函數本身? – Dharmendra

+0

to_bit在標準包中定義,所以實際上它是相同的情況...不知道爲什麼應該起作用 – BennyBarns

+0

Christian U.答案說明了爲什麼轉換函數可以工作。參見4.3.3.2關聯列表*轉換函數*(2007年的6.5.7.1),問題是在-2008(6.5.6.3端口子句)中通過將隱式聲明的信號與正式的表達式值的併發賦值的目標(例如,針對返回類型標記的全局靜態子類型的函數調用)。 – user1155120

1

VHDL-93允許類型轉換和轉換功能的關聯列表。 轉換函數是一個只有一個參數的函數的特例。

讓我們看的to_bit聲明:

function to_bit(s : std_ulogic; xmap : bit := '0') return bit; 

雖然to_bit(s)看起來像一個有效的轉換功能,它不是,因爲聲明包含兩個參數。 當is_x(s)爲真時,將使用第二個參數xmap作爲結果。

這是不是 ModelSim的錯誤,但也許錯誤信息有點神祕。 ModelSim認爲to_bit是一個轉換函數,但拒絕使用它,因爲它有第二個參數,因此不是有效的轉換函數。

一個簡單的包裝功能,可以解決這一問題:

function to_bit(s : std_ulogic) return bit is 
begin 
     return to_bit(s, '0'); 
end; 

注意函數也可以有名字to_bit,因爲VHDL支持函數重載。在包std_logic_1164中有這個很好。

+0

xmap參數支持建模不同的邏輯鐵路系統。參見IEEE Std 1076-2008 6.5.6.3端口子句,它使用隱式聲明的信號爲**形式中的模式**提供非靜態表達式(例如,具有多個參數的函數調用)的使用,分配的目標該表達式與實際相關聯(就像你明確做的那樣)。儘管尋找綜合支持可能會有問題,但您的問題已被歸納。這通常不是-2002至-2008工具實施的高優先級。 – user1155120

相關問題