的生成塊需要時闡述的設計加以解決,以標準的Verilog模塊的項目(模擬開始之前)。在你的例子中,該工具試圖將if (j==0)
評估爲一個常量,並且不能這樣做。
從你的例子中不清楚你想要做什麼。下面是對我工作的一對夫婦的例子:
wire [9:0] w;
genvar i;
generate
for(i=0; (i<10); i=i+1) begin: gen_columns
if (i==0) begin
assign w[i] = 1'b0;
end else begin
assign w[i] = 1'b1;
end
end
endgenerate
initial begin
$display ("%x", w);
$finish;
end
此代碼遍歷總線的位並分配取決於位不同的值。輸出是3fe
。
reg clk;
integer j [0:1];
genvar i;
generate
for(i=0; (i<2); i=i+1) begin: gen_columns
always @(posedge clk) begin
if (j[i]==0) begin
j[i] <= j[i] + 1;
end
end
end
endgenerate
initial clk = 1'b0;
always #1 clk = ~clk;
initial begin
$monitor ("%d: j[0]: %d, j[1]: %d", $time, j[0], j[1]);
repeat (2) @(posedge clk);
j[0] = 0;
j[1] = 0;
repeat (2) @(posedge clk);
$finish;
end
此代碼爲j[0]
和j[1]
創建相同邏輯遞增他們是否是零。輸出是:
0: j[0]: x, j[1]: x
3: j[0]: 0, j[1]: 0
5: j[0]: 1, j[1]: 1
我的第二種情況和你的例子之間的區別是,if語句和賦值被放置在一個always塊。設計完成後,該工具將用兩個始終代替生成塊,其中一個爲i=0
,另一個爲i=1
。
樣式說明:雖然從多個總是更新變量的變量是合法的verilog,但它並不被認爲是好的做法。它可能會合成爲乘法驅動信號,並可能在仿真中引入競爭條件。在我的第二個例子中,如果作業是j = j + 1
(不含[i]
),那麼j
將被分配到多個始終塊中。