我想根據實例化模塊時設置的參數設置參數。我有以下幾點。生成塊中的系統Verilog參數
module foo #(WORDS = 8);
parameter P00 = 33;
logic [7:0] tmp;
generate
case (WORDS)
4: begin : A
assign tmp = 8'haa;
parameter P00 = 4;
end
8: begin : B
assign tmp = 8'hbb;
parameter P00 = 8;
end
16: begin : C
assign tmp = 8'hcc;
parameter P00 = 16;
end
default: begin : D
assign tmp = 8'hdd;
parameter P00 = 8;
end
endcase
endgenerate
initial begin
$display ("WORDS = %d", WORDS);
$display ("tmp = %h", tmp);
$display ("P00 = %d", P00);
end
endmodule
我預計會重新定義P00時出現錯誤,但它會編譯並運行並顯示下列內容。
WORDS = 8
tmp = bb
P00 = 33
如果我評論「參數P00 = 33」賦值,我會得到一個「標識符P00尚未聲明」。錯誤。
看起來生成塊被忽略。這裏有什麼問題?
如果我正確地閱讀了語言規範,實際上當您在生成塊中使用參數類型時,實際上是在不同範圍內創建新參數。它指出,「在[生成塊]中,參數關鍵字應該是localparam關鍵字的同義詞。」此外,「本地參數與參數相同,但它們不能通過...實例參數值賦值直接修改」。如果您有語言參考的副本並希望瞭解更多信息,請參閱第6.20.4節。它看起來像你需要一種不同的方法來解決這個問題。 –
@丹 - 謝謝。我沒有閱讀上面的手冊部分,但我沒有看到生成塊實際上創建了與模塊不同的範圍。我試圖顯示C.P00,但也沒有工作。如果創建新範圍,我如何訪問它? – user2382841
我對此並不十分清楚。我剛開始自己學習這門語言,但@Morgan似乎在下面有一個很好的答案。 –