[英]Verilog generate statement with always@(*) block
我有一個我認為應該在其下面工作的generate塊,但是我看到else
塊下always @(*)
部分的問題。 使用VCS時, temp_in[i+1][j]
始終分配為'x'。 我希望將其設置為“ 0”。 如果我實例化模塊/門而不是始終阻塞,就像我對if
部分所做的那樣,那么它將正常工作。 搜尋使用foreach,generate,always的正確語法,並且如果在單個塊內也不會產生任何有用的結果。 我知道此修復程序是次要的更改,但我對所有語言結構都不熟悉,因此,我將不勝感激。
ceil()
是一個返回整數的函數。 它僅使用在編譯時固定的參數,因此我希望循環展開能夠正確進行。
genvar i, j, k;
generate
for (i = 0; i < NUM_STAGES; i = i + 1) begin:gen_stage
for (j = 0; j < (TOTAL_LENGTH/(2**(i+1))); j = j + 1) begin:gen_or
if(j < ceil(i)) begin
for (k = 0; k < CPU_DATA_WIDTH; k = k + 1) begin:gen_bit
msw_mem_out_mux_bit_or U_msw_mem_out_mux_bit_or (
.in_1 (temp_in[i][2*j][k]),
.in_2 (temp_in[i][(2*j)+1][k]),
.out (temp_in[i+1][j][k])
);
end
end else begin
always @(*) begin
temp_in[i+1][j] = {CPU_DATA_WIDTH{1'b0}};
end
end
end
end
endgenerate
always @*
等待,直到推斷出的靈敏度列表中的信號發生變化。 i
和j
是常數(從模擬時間的角度出發, always @*
評估always @*
時),因此always塊在靈敏度列表中沒有信號。
如果使用SystemVerilog, always_comb
always @*
更改為always_comb
,它將在時間0運行。對於Verilog,添加一個initial
塊。
參考: IEEE Std 1800-2012§9.2.2.2.2 always_comb
與always @*
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.