2012-10-17 46 views
1

試圖創建一個電線finished,對於所有的寄存器和索引,iff data == dataNew都是如此。我能想出的唯一方法是使用一堆finishedAgg電線作爲中間值;我很想擺脫他們,但我不知道如何。似乎有比這更簡單的方法!在Verilog中是否有更簡潔的方式來編寫此線的分配?

reg[24:0] data[0:24]; 
reg[24:0] dataNew[0:24]; 

wire finished; 

genvar i; 
generate 
    wire finishedAgg[-1:24]; 
    assign finishedAgg[-1] = 1; 
    for (i=0; i<25; i=i+1) begin :b1 
     assign finishedAgg[i] = finishedAgg[i-1] & (data[i]==dataNew[i]); 
    end 
    assign finished = finishedAgg[24]; 
endgenerate 

回答

1

這是我剪吧:

reg [24:0] finishAgg; 
wire finished; 
always @(*) 
    for (int i=0; i<25; i=i+1) begin :b1 
     finishedAgg[i] = (data[i]==dataNew[i]); 
    end : b1 
assign finished = &finishedAgg; 

這不是太比你的版本要短得多,但它並不需要一個generate塊。我已經聲明瞭i in-loop Systemverilog風格,並且我正在使用還原-AND來生成finished信號。

+1

我很驚訝地看到,這編譯到完全相同的註冊計數和門數。我是一個Verilog新手,並且有些擔心把regs放在那裏,但實際上並沒有編譯成regs;它使它看起來像不是。這是常見的做法嗎? –

+0

這是非常普遍的做法,歡迎來到verilog! 'reg'不一定編譯爲觸發器或鎖存器,它取決於它的使用方式。 – Marty

相關問題