2013-05-27 45 views
1

我想在任務內部使用generate語句。以下代碼給出了編譯錯誤(iverilog)。在verilog任務內部生成語句

task write_mem; //for generic use with 8, 16 and 32 bit mem writes 
     input [WIDTH-1:0] data; 
     input [WIDTH-1:0] addr; 
     output [WIDTH-1:0] MEM; 
     integer i; 

     begin 
     generate 
      genvar j; 
      for(j=0; j<i;j++) 
      MEM[addr+(i-j-1)] = data[(j*8):((j*8) + 8)-1]; 
     endgenerate 
     end 
endtask // write_mem 

我也試圖把generate只是行integer i後,但仍其產生錯誤。有什麼想法嗎?

編輯:我也試過在begingenerate聲明genvar聲明在上面的代碼。它仍在生產的編譯器錯誤

由於提前,

周杰倫Aurabind

回答

3

你正在嘗試的是不可能的 - 一個生成區域(generate..endgenerate block)只允許在模塊描述中(也就是「頂層」),也就是說你有參數,線,和inital-regions等(參見IEEE標準1364-2005中的語法12-5)。在任務中,生成區域是例如與分配語句一樣無效。

但是,您可以在任務中使用非生成的for-loop(這也可以合成)。

無論採用哪種方式,由於'i'不是常數,您無法從可合成代碼中的0到i-1進行計數。另請注意,j ++不是有效的verilog,您必須改寫j = j + 1。最後,您可能想要使用非阻塞賦值(< =)而不是阻塞賦值(=),但這取決於您打算如何使用此任務。

+0

非常感謝@Cliffod維也納:) –

+0

@Cliffod維也納關於j ++的觀點。另外,我從一個「always」塊中調用這個任務。所以阻塞任務應該能夠產生可綜合的代碼,對吧? –

+0

@JayAurabind所使用的分配類型應該反映從何處調用任務。 'always @ *'combinatorial use'='blocking。 '永遠@(posedge clk)'順序使用'<='無阻塞。 – Morgan

1

genvars應在生成語句之前進行定義:

genvar j; 
generate 
    for(j=0; j<i;j++) 
    MEM[addr+(i-j-1)] = data[(j*8):((j*8) + 8)-1]; 
endgenerate 

儘管這裏您的使用情況看起來並不像它需要一個生成一個for循環會做的語句。

正如@CliffordVienna指出的那樣,生成語句用於根據編譯時間常量構建層次結構和接線。即參數可以改變爲可重用的代碼,但在給定的模擬中不變。任務不包含層次結構,因此使用生成操作無效。

任何for循環可以展開爲綜合的,有的東西一樣:

task write_mem; //for generic use with 8, 16 and 32 bit mem writes 
    input [WIDTH-1:0] data; 
    input [WIDTH-1:0] addr; 
    output [WIDTH-1:0] mem; 
    integer i = WIDTH/8; // CONSTANT 

    begin 
    for(j=0; j<i;j++) begin 
     mem[addr+(i-j-1)] = data[(j*8):((j*8) + 8)-1]; 
    end 
    end 
endtask // write_mem 

任務是綜合的,只要它們不包含任何定時控制,這你沒有。從給出的信息應該是可綜合的。

注意:我會分開數據寬度和地址寬度,它們可能現在是相同的,但您可能想要移動到8位尋址和16位數據。

+0

在'generate'之前聲明'genvar'也會產生編譯錯誤。對於一個任務,必須首先定義所有的變量,然後在'begin ... end'塊中啓動然後執行main語句,對嗎?如果是這種情況,那麼'begin..end'聲明中的'genvar'違反了該規則,是不是? –

+0

我的真實代碼實際上有'i = WIDTH/8;'這個語句,這會使'i'保持不變,對吧?這個任務也是從「always」塊中調用的。所以這將是可綜合的,不是嗎? –

+0

問題已根據此反饋進行更新。 – Morgan