2016-03-29 53 views
0

說我有下面的代碼:在Verilog的,我怎麼使用一個變量在邏輯

genvar i,j; 
generate 
for(i = 0; i < MAX; i = i + 1) begin: gen_blah 
    for(j = 0; j < MAX; j = j + 1) begin: gen_foo 
    assign match[i] = entry[j] = i; 
    end 
end 
endgenerate 

這是一個綜合的體現在哪裏?看起來應該是這樣,因爲這隻會展開成一堆比較至常量的分配。如果不是的話,我會如何寫這個來完成呢?

+3

您是否在實際的綜合和實施工作流程中嘗試了此代碼?查看諸如ISE提供的RTL和技術原理圖,以及任何合成工具輸出或警告,可能會非常有幫助。 – hexafraction

回答

1

不是。想象一下展開這個並用手輸入它。拳頭兩條線會導致多重驅動網:

assign match[0] = (entry[0] == 0); 
assign match[0] = (entry[1] == 0); 

但是,如果你擺脫生成的,併爲此與內部的循環,然後總是阻止它會工作:

always_comb begin 
    for(int i = 0; i < MAX; i = i + 1) begin: gen_blah 
    for(int j = 0; j < MAX; j = j + 1) begin: gen_foo 
     match[i] = (entry[j] == i); 
    end 
    end 
end 

這裏面阻止你獲得多個分配給相同的值,但最後一個「獲勝」。我不確定你想用你的代碼來完成什麼,所以這可能不會實際執行你正在尋找的功能。如果您試圖查看是否有任何條目等於i那麼您應該將其更改爲:

always_comb begin 
    for(int i = 0; i < MAX; i = i + 1) begin: gen_blah 
    match[i]=0; 
    for(int j = 0; j < MAX; j = j + 1) begin: gen_foo 
     match[i] = match[i] || (entry[j] == i); 
    end 
    end 
end 
相關問題