今天來補一下昨天提到的文法,generate,因為這是第一次出現,所以怕大家不熟悉,特別來提一下,之前說過在寫for迴圈時要寫在always block裡面,然後訊號線因為寫在always block裡面,所以要宣告reg,但其實也可以用wire形式,就用gererate來包起來,下面舉一個用gererate做for迴圈加法:
genvar idx;
generate
for (idx = 0; idx < 8; idx = idx + 1)
begin:
assign a[idx] = b[idx] + c[idx];
end
endgenerate
以上面的例子,for裡面的index宣告時要記得用genvar宣告,包起來就可以用assign給值了.
像昨天的例子中,module也可以一次宣告很多個,像陣列的形式宣告,module的input,output的訊號線也是宣告成陣列比較好控制,再把昨天的code貼過來看一下:
generate
for(i=0;i<4;i=i+1)begin
BCD
B(
.clk(clk),
.rst(rst),
.Cin(Ci[i]),
.sum(sum[i]),
.Cout(Co[i])
);
end
endgenerate
類似陣列的方式宣告module非常的方便,就像昨天的BCD計數器,或著需要多個module做相同的事情,像是矩陣乘法等等,都可以像這樣宣告,管理上也很方便,因為變數跟module都宣告成陣列形式,所以用for去管理非常的簡節,這邊就分享給大家.