2009-11-27 213 views
1

(插入很基本的問題在這裏聲明)如何在Verilog中將值分配給輸出寄存器?

更具體地說,我有以下聲明:

output reg icache_ram_rw 

並在代碼的某些時候,我需要把零值在這個REG。以下是我嘗試過的結果:

assign icache_ram_rw = 1'b0; 
(declarative lvalue or port sink reg icache_ram_rw must be a wire) 

icache_ram_rw <= 1'b0; 
(instance gate/name for type "icache_ram_rw" expected - <= read) 

我該怎麼做呢?

回答

13

assign聲明用於驅動wire s。

如果你已經聲明一個reg,那麼你必須在程序中給它賦值(alwaysinitial塊)。最好的做法是隻在相同的always塊中設置reg的值。例如:

always @(*) begin // combo logic block 
    if(some_condition) begin 
     icache_ram_rw = 1'b0; 
    end else begin 
     icache_ram_rw = something_else; 
end 

reg S和wire s表示你應該讀了之間的重要區別。

我有一種感覺,雖然你需要一些時鐘邏輯,如果你正在駕駛RAM信號。在這種情況下,你需要的代碼看起來是這樣的:

// some parameter definitions to make logic 'read' clearer. 
localparam READ = 1'b0; 
localparam WRITE = 1'b1; 

// standard clocked logic 'template' that synthesis tools recognise. 
always @(posedge clk or negedge resetb) 
    if(!resetb) begin // asynchronous active low reset 
    icache_ram_rw <= READ; 
    end else if(some_enable_condition) begin 
    icache_ram_rw <= WRITE; 
    end else begin 
    icache_ram_rw <= READ; 
    end 
+0

感謝您的完整答案!鍾控邏輯的確出現在賦值中,爲了簡單起見,我在這裏省略了它(原來可能最好添加它)= D – 2009-12-08 14:49:11

3

請注意,您也可以在聲明它分配初始值,一個reg,像這樣:

output reg icache_ram_rw = 1'b0;

這將確保它以模擬中的零值開始。對於綜合來說,你的結果將取決於綜合工具和目標技術(對於FPGA,你通常可以爲硬件指定初始值;對於ASIC,情況並非如此)。

20

從輸出聲明中刪除「reg」,代碼應該工作(默認爲導線輸出類型)。 (1)阻塞-vs-非阻塞任務(請參閱我關於此主題的論文:http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf)和(2)reg - 阻塞任務vs-線。現在我們來澄清後面的話題。

左側(LHS)或程序性任務(始終,初始,任務,函數)上的任何內容都必須聲明爲變量類型(通常爲reg)。語言中的其他一切都是網絡(通常是電線)。沒有例外。這真的很簡單。我不知道任何Verilog書籍只是簡單地說。

這是怎麼發生的?我問Verilog語言的好朋友和發明者Phil Moorby,「爲什麼註冊?」菲爾告訴我,當他發明了Verilog時,沒有合成工具,他認爲從一個總是塊出來的東西都將成爲註冊表。他錯了,現在我們堅持使用這個「reg」關鍵字。

我試圖在Veirlog和SystemVerilog委員會上修改了十多年。我想將所有內容都聲明爲wire,並且第一次使用將確定「wire」行爲是否像reg(來自過程塊的第一個賦值和最後一個賦值獲勝),或者行爲像電線(第一個賦值來自驅動源,例如模塊輸出或連續分配和多個驅動程序的解決方法與今天的Verilog相同),並且對同一信號進行過程分配和驅動程序分配都是非法的。唉,我還沒有得到足夠的委員會投票權來通過這個提案。

這是我在自己的代碼中經常犯的錯誤。只是習慣於錯誤消息,如「非法LHS分配」或「非法分配線路」。他們都是同一件事,你忘了宣佈你的regs。

問候 - 克里夫卡明斯 - Verilog的& SystemVerilog的大師

0
  1. 的問題是,當sythesized將創建端口/引腳多數民衆贊成在賦值語句爲什麼它需要的電線作爲輸出。
  2. 您已經創建了現在被命名icache_ram_rw了reg的寄存器不一樣的銷權
  3. ....
  4. 所以要分配一個註冊需要使用的Verilog
  5. 的Verilog的正確格式允許相同的使用始終語句,創建一個DFF,並且該DFF的輸入引腳將爲您的icache_ram_rw,格式已由其他人提供。