2010-04-21 33 views

回答

6

Verilog不需要靈敏度列表中的信號名稱。使用@*語法來表示該always塊應該被觸發,只要任何輸入信號的改變:

always @* begin 
    ReadData = instructMem[Address]; 
end 
+0

如果我這樣做,那麼我不能合成它: 警告:Xst:2319 - 「InstructionMemory.v」行20:信號instructMem在初始塊中部分初始化。初始化將被忽略。 錯誤:Xst:902 - 「InstructionMemory.v」第104行:始終在塊敏感性列表中出現意外的instructMem事件。 – aherlambang 2010-04-22 03:26:53

+0

無論如何,這是一種奇怪的訪問內存的方式。通常你最終會對內存地址和r/w端口進行同步操作,然後從其輸出端口獲取結果。這就是說,我並沒有失望地回想起使用FPGA的記憶,如果這就是你的想法。 – Marty 2010-04-22 04:36:26

1

將InstructMem添加到靈敏度列表。

0

聲明ReadData爲線,而不是一個reg,然後更換您始終與分配塊。

assign ReadData = instructMem[Address]; 
0

我不確定instructMem的聲明是什麼樣的。無論如何,ReadData = instructMem [address]將產生一個多路複用器,其地址被視爲選擇邏輯,並使用典型的綜合工具將instructorMem指定爲多路複用器的數據線。您需要將靈敏度列表中的instructMem放入,因爲每當這種變化時都應該讀取數據。

我試過伊卡洛斯,反正你總是不能像@(instructMem或address)那樣做一些事情,其中​​instructMem有一個像reg [7:0] instructMem [255:0] - >暗示內存的聲明。

注意:不要試圖用這種方式來合成Verilog存儲器,通常你應該實例化內存IP並連接到它們的端口。供應商爲此目的提供內存模型。